X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fps.scm;h=f6f20fe81400d3203d3f383962ffb883bb0dd470;hb=5b17bf7f3960204fdff6ac28122eade7edf6592a;hp=95280791262b3daee6651d936e1cd37c2a8ec9fc;hpb=f7c306cacfbdf6229e9414c691e36e49b41ea71a;p=lilypond.git diff --git a/scm/ps.scm b/scm/ps.scm index 9528079126..f6f20fe814 100644 --- a/scm/ps.scm +++ b/scm/ps.scm @@ -1,261 +1,286 @@ -;;; ps.scm -- implement Scheme output routines for PostScript -;;; -;;; source file of the GNU LilyPond music typesetter -;;; -;;; (c) 1998--2001 Jan Nieuwenhuizen -;;; Han-Wen Nienhuys +;;;; ps.scm -- implement Scheme output routines for PostScript +;;;; +;;;; source file of the GNU LilyPond music typesetter +;;;; +;;;; (c) 1998--2002 Jan Nieuwenhuizen +;;;; Han-Wen Nienhuys -(define (ps-scm action-name) +(debug-enable 'backtrace) - ;; alist containing fontname -> fontcommand assoc (both strings) - (define font-alist '()) - (define font-count 0) - (define current-font "") - - (define (cached-fontname i) - (string-append - "lilyfont" - (make-string 1 (integer->char (+ 65 i))))) - +(define-module (scm ps)) +(define this-module (current-module)) - (define (select-font name-mag-pair) - (let* - ( - (c (assoc name-mag-pair font-name-alist)) - ) +(use-modules + (guile) + (lily)) - (if (eq? c #f) - (begin - (display "FAILED\n") - (display (object-type (car name-mag-pair))) - (display (object-type (caaar font-name-alist))) - - (ly-warn (string-append - "Programming error: No such font known " - (car name-mag-pair) " " - (ly-number->string (cdr name-mag-pair)) - )) - - "") ; issue no command - (string-append " " (cddr c) " ")) - )) - (define (font-load-command name-mag command) - (string-append - "/" command - " { /" - (car name-mag) - " findfont " - "12 " (ly-number->string (cdr name-mag)) " mul " - "lilypondpaperoutputscale div scalefont setfont } bind def " - "\n")) +;;; Lily output interface --- cleanup and docme - (define (beam width slope thick) - (string-append - (numbers->string (list width slope thick)) " draw_beam" )) - (define (comment s) - (string-append "% " s)) - (define (bracket arch_angle arch_width arch_height height arch_thick thick) - (string-append - (numbers->string (list arch_angle arch_width arch_height height arch_thick thick)) " draw_bracket" )) +;; Module entry +(define-public (ps-output-expression expr port) + (display (eval expr this-module) port)) - (define (char i) - (invoke-char " show" i)) +;; Global vars - (define (hairpin thick width starth endh ) - (string-append - (numbers->string (list width starth endh thick)) - " draw_hairpin")) - - ;; what the heck is this interface ? - (define (dashed-slur thick dash l) - (string-append - (apply string-append (map control->string l)) - (ly-number->string thick) - " [ " - (ly-number->string dash) - " " - (ly-number->string (* 10 thick)) ;UGH. 10 ? - " ] 0 draw_dashed_slur")) - - (define (dashed-line thick on off dx dy) - (string-append - (ly-number->string dx) - " " - (ly-number->string dy) - " " - (ly-number->string thick) - " [ " - (ly-number->string on) - " " - (ly-number->string off) - " ] 0 draw_dashed_line")) - - (define (repeat-slash wid slope thick) - (string-append (numbers->string (list wid slope thick)) - " draw_repeat_slash")) - - (define (end-output) - "\nend-lilypond-output\n") - - (define (experimental-on) "") - - (define (filledbox breapth width depth height) - (string-append (numbers->string (list breapth width depth height)) - " draw-box" )) +;; alist containing fontname -> fontcommand assoc (both strings) +(define font-name-alist '()) - ;; obsolete? - (define (font-def i s) - (string-append - "\n/" (font i) " {/" - (substring s 0 (- (string-length s) 4)) - " findfont 12 scalefont setfont} bind def \n")) - (define (font-switch i) - (string-append (font i) " ")) +;; Interface functions +(define (beam width slope thick) + (string-append + (numbers->string (list slope width thick)) " draw_beam" )) - (define (header-end) - (string-append - ;; URG: now we can't use scm output without Lily - (ly-gulp-file "lilyponddefs.ps") - " {exch pop //systemdict /run get exec} " - (ly-gulp-file "music-drawing-routines.ps") - "{ exch pop //systemdict /run get exec } " - )) +;; two beziers with round endings +(define (bezier-bow l thick) - (define (lily-def key val) - - (if (string=? (substring key 0 (min (string-length "lilypondpaper") (string-length key))) "lilypondpaper") - (string-append "/" key " {" val "} bind def\n") - (string-append "/" key " (" val ") def\n") - ) - ) - - (define (header creator generate) - (string-append - "%!PS-Adobe-3.0\n" - "%%Creator: " creator generate "\n")) + (define (bezier-ending z0 z1 z2) + (let ((x0 (car z0)) + (y0 (cdr z0)) + (x1 (car z1)) + (y1 (cdr z1)) + (x2 (car z2)) + (y2 (cdr z2))) + (string-append + " " + (numbers->string + (list x0 y0 + (/ (sqrt (+ (* (- x1 x2) (- x1 x2)) (* (- y1 y2) (- y1 y2)))) 2))) + " draw_dot"))) - (define (invoke-char s i) - (string-append - "(\\" (inexact->string i 8) ") " s " " )) + (string-append + (apply string-append (map number-pair->string l)) + (ly:number->string thick) + " draw_bezier_sandwich " + (bezier-ending (list-ref l 3) (list-ref l 0) (list-ref l 5)) + (bezier-ending (list-ref l 7) (list-ref l 0) (list-ref l 5)))) + +;; two beziers +(define (bezier-sandwich l thick) + (string-append + (apply string-append (map number-pair->string l)) + (ly:number->string thick) + " draw_bezier_sandwich ")) + +(define (bracket arch_angle arch_width arch_height height arch_thick thick) + (string-append + (numbers->string + (list arch_angle arch_width arch_height height arch_thick thick)) + " draw_bracket")) + +(define (char i) + (string-append + "(\\" (inexact->string i 8) ") show " )) + +(define (comment s) + (string-append "% " s "\n")) + +(define (dashed-line thick on off dx dy) + (string-append + (ly:number->string dx) + " " + (ly:number->string dy) + " " + (ly:number->string thick) + " [ " + (ly:number->string on) + " " + (ly:number->string off) + " ] 0 draw_dashed_line")) + +;; what the heck is this interface ? +(define (dashed-slur thick dash l) + (string-append + (apply string-append (map number-pair->string l)) + (ly:number->string thick) + " [ " + (ly:number->string dash) + " " + ;;UGH. 10 ? + (ly:number->string (* 10 thick)) + " ] 0 draw_dashed_slur")) + +(define (define-fonts internal-external-name-mag-pairs) - (define (invoke-dim1 s d) + (define (font-load-command name-mag command) + + (define (possibly-capitalize-font-name name) + (if (equal? (substring name 0 2) "cm") + (string-upcase name) + name)) + (string-append - (ly-number->string (* d (/ 72.27 72))) " " s )) - - (define (placebox x y s) - (string-append - (ly-number->string x) " " (ly-number->string y) " {" s "} place-box\n")) + "/" command + " { /" + ;; Ugh, the Bluesky type1 fonts for computer modern use capitalized + ;; postscript font names. + (possibly-capitalize-font-name (car name-mag)) + " findfont " + "20 " (ly:number->string (cdr name-mag)) " mul " + "output-scale div scalefont setfont } bind def " + "\n")) + + (define (ps-encoded-fontswitch name-mag-pair) + (let* ((key (car name-mag-pair)) + (value (cdr name-mag-pair))) + (cons key + (cons value + (string-append "lilyfont" + (car value) + "-" + (number->string (cdr value))))))) + + (set! font-name-alist (map ps-encoded-fontswitch + internal-external-name-mag-pairs)) + + (apply string-append + (map (lambda (x) (font-load-command (car x) (cdr x))) + (map cdr font-name-alist)))) + +(define (define-origin file line col) "") + +(define (dot x y radius) + (string-append + " " + (numbers->string + (list x y radius)) " draw_dot")) + +(define (zigzag-line centre? zzw zzh thick dx dy) + (string-append + (if centre? "true" "false") + " " + (ly:number->string zzw) + " " + (ly:number->string zzh) + " " + (ly:number->string thick) + " 0 0 " + (ly:number->string dx) + " " + (ly:number->string dy) + " draw_zigzag_line ")) + +(define (draw-line thick x1 y1 x2 y2) + (string-append + " 1 setlinecap + 1 setlinejoin " + (ly:number->string thick) + " setlinewidth " + (ly:number->string x1) + " " + (ly:number->string y1) + " moveto " + (ly:number->string x2) + " " + (ly:number->string y2) + " lineto stroke")) + +(define (end-output) + "\nend-lilypond-output\n") + +(define (ez-ball ch letter-col ball-col) + (string-append + " (" ch ") " + (numbers->string (list letter-col ball-col)) + " /Helvetica-Bold " ;; ugh + " draw_ez_ball")) + +(define (filledbox breapth width depth height) + (string-append (numbers->string (list breapth width depth height)) + " draw_box" )) + +(define (fontify name-mag-pair exp) - (define (bezier-sandwich l thick) - (string-append - (apply string-append (map control->string l)) - (ly-number->string thick) - " draw_bezier_sandwich")) - -; TODO: use HEIGHT argument - (define (start-line height) - (string-append - "\n" - (ly-number->string height) - " start-line { -lilypondpaperoutputscale lilypondpaperoutputscale scale -")) + (define (select-font name-mag-pair) + (let* ((c (assoc name-mag-pair font-name-alist))) + (if (eq? c #f) + (begin + (display "FAILED\n") + (display (object-type (car name-mag-pair))) + (display (object-type (caaar font-name-alist))) + (ly:warn (string-append + "Programming error: No such font known " + (car name-mag-pair) " " + (ly:number->string (cdr name-mag-pair)))) + + ;; Upon error, issue no command + "") + (string-append " " (cddr c) " ")))) - (define (stem breapth width depth height) - (string-append (numbers->string (list breapth width depth height)) - " draw-box" )) - - (define (stop-line) - "}\nstop-line\n") - - (define (text s) - (string-append "(" s ") show ")) - - - (define (volta h w thick vert_start vert_end) - (string-append - (numbers->string (list h w thick (inexact->exact vert_start) (inexact->exact vert_end))) - " draw_volta")) - - (define (tuplet ht gap dx dy thick dir) - (string-append - (numbers->string (list ht gap dx dy thick (inexact->exact dir))) - " draw_tuplet")) - - - (define (unknown) - "\n unknown\n") - - (define (ez-ball ch letter-col ball-col) - (string-append - " (" ch ") " - (numbers->string (list letter-col ball-col)) - " /Helvetica-Bold " ;; ugh - " draw_ez_ball")) - - (define (define-origin a b c ) "") - (define (no-origin) "") + (string-append (select-font name-mag-pair) exp)) + +(define (header creator generate) + (string-append + "%!PS-Adobe-3.0\n" + "%%Creator: " creator generate "\n")) + +(define (header-end) + (string-append + ;; URG: now we can't use scm output without Lily + (ly:gulp-file "lilyponddefs.ps") + " {exch pop //systemdict /run get exec} " + (ly:gulp-file "music-drawing-routines.ps") + "{ exch pop //systemdict /run get exec } " + ;; ps-testing wreaks havoc when used with lilypond-book. + ;; -- is this still true with new modules system? + ;; (if (defined? 'ps-testing) "\n /testing true def" "") + ;; "\n /testing true def" + )) + +(define (lily-def key val) + (let ((prefix "lilypondpaper")) + (if (string=? + (substring key 0 (min (string-length prefix) (string-length key))) + prefix) + (string-append "/" key " {" val "} bind def\n") + (string-append "/" key " (" val ") def\n")))) + +(define (no-origin) "") - ;; PS - (cond ((eq? action-name 'all-definitions) - `(begin - (define beam ,beam) - (define tuplet ,tuplet) - (define bracket ,bracket) - (define char ,char) - (define hairpin ,hairpin) - (define volta ,volta) - (define bezier-sandwich ,bezier-sandwich) - (define dashed-line ,dashed-line) - (define dashed-slur ,dashed-slur) - (define end-output ,end-output) - (define experimental-on ,experimental-on) - (define filledbox ,filledbox) - (define font-def ,font-def) - (define font-switch ,font-switch) - (define header-end ,header-end) - (define lily-def ,lily-def) - (define font-load-command ,font-load-command) - (define header ,header) - (define invoke-char ,invoke-char) - (define invoke-dim1 ,invoke-dim1) - (define placebox ,placebox) - (define select-font ,select-font) - (define start-line ,start-line) - (define stem ,stem) - (define stop-line ,stop-line) - (define stop-last-line ,stop-line) - (define repeat-slash ,repeat-slash) - (define text ,text) - (define no-origin ,no-origin) - (define define-origin ,define-origin) - (define ez-ball ,ez-ball) - )) - ((eq? action-name 'repeat-slash) repeat-slash) - ((eq? action-name 'tuplet) tuplet) - ((eq? action-name 'beam) beam) - ((eq? action-name 'bezier-sandwich) bezier-sandwich) - ((eq? action-name 'bracket) bracket) - ((eq? action-name 'char) char) - ((eq? action-name 'dashed-line) dashed-line) - ((eq? action-name 'dashed-slur) dashed-slur) - ((eq? action-name 'hairpin) hairpin) - ((eq? action-name 'experimental-on) experimental-on) - ((eq? action-name 'filledbox) filledbox) - ((eq? action-name 'ez-ball) ez-ball) - ((eq? action-name 'select-font) select-font) - ((eq? action-name 'volta) volta) - (else (error "unknown tag -- PS-SCM " action-name)) - ) - ) - -(define (scm-ps-output) - (ly-eval (ps-scm 'all-definitions))) +(define (placebox x y s) + (string-append + (ly:number->string x) " " (ly:number->string y) " {" s "} place-box\n")) + +(define (repeat-slash wid slope thick) + (string-append + (numbers->string (list wid slope thick)) + " draw_repeat_slash")) + +(define (roundfilledbox x y width height blotdiam) + (string-append + " " + (numbers->string + (list x y width height blotdiam)) " draw_round_box")) + +;; TODO: use HEIGHT argument +(define (start-system width height) + (string-append + "\n" (ly:number->string height) + " start-system\n" + "{\n" + "set-ps-scale-to-lily-scale")) + +(define (stem breapth width depth height) + (string-append + (numbers->string (list breapth width depth height)) + " draw_box" )) + +(define (stop-last-system) + (stop-system)) + +(define (stop-system) + "}\nstop-system\n") + +(define (text s) + (string-append "(" s ") show ")) + +(define (unknown) + "\n unknown\n") +