]> git.donarmstrong.com Git - lilypond.git/blob - scm/framework-ps.scm
49f382b227f857a5b40541f44d8afd1b09c594b2
[lilypond.git] / scm / framework-ps.scm
1
2 (define-module (scm framework-ps))
3
4 (use-modules (ice-9 regex)
5              (ice-9 string-fun)
6              (ice-9 format)
7              (guile)
8              (srfi srfi-13)
9              (scm output-ps)
10              (lily))
11
12 (define (tex-font? fontname)
13   (equal? (substring fontname 0 2) "cm"))
14
15
16 (define (load-fonts bookpaper)
17   
18   (let*
19       ((fonts (ly:bookpaper-fonts bookpaper))
20        (font-names (uniq-list (sort (map ly:font-filename fonts) string<?)))
21        (pfas (map
22               (lambda (x)
23                 (ly:kpathsea-gulp-file (string-append x ".pfa")))
24               
25               (filter string? font-names)))
26        )
27
28     (string-join pfas "\n")))
29
30
31 (define (define-fonts bookpaper)
32
33   (define font-list (ly:bookpaper-fonts bookpaper))
34   (define (define-font command fontname scaling)
35     (string-append
36      "/" command " { /" fontname " findfont "
37      (ly:number->string scaling) " output-scale div scalefont } bind def\n"))
38
39   (define (reencode-font plain encoding command)
40     (let ((coding-vector (get-coding-command encoding)))
41       (string-append
42        plain " " coding-vector " /" command " reencode-font\n"
43        "/" command "{ /" command " findfont 1 scalefont } bind def\n")))
44   
45   (define (guess-ps-fontname basename)
46     
47     "We do not have the FontName, try to guess is from basename."
48     (cond
49      (#t basename)
50      ((tex-font? basename)
51       ;; FIXME: we need proper Fontmap for the bluesky CM*, EC* fonts.
52       ;; Only the fonts that we trace in mf/ are in our own FontMap.
53       (string-append basename ".pfb"))
54      (else (string-append basename ".pfa"))
55      ))
56
57   (define (font-load-command font)
58     (let* ((specced-font-name (ly:font-name font))
59            (fontname (if specced-font-name
60                          specced-font-name
61                          (guess-ps-fontname (ly:font-filename font))))
62            
63            (coding-alist (ly:font-encoding-alist font))
64            (input-encoding (assoc-get 'input-name coding-alist))
65            (font-encoding (assoc-get 'output-name coding-alist))
66            (command (ps-font-command font))
67            ;; FIXME -- see (ps-font-command )
68            (plain (ps-font-command font #f))
69            (designsize (ly:font-design-size font))
70            (magnification (* (ly:font-magnification font)))
71            (ops (ly:output-def-lookup bookpaper 'outputscale))
72            (scaling (* ops magnification designsize)))
73
74       (string-append
75        (define-font plain fontname scaling)
76        (if (or (equal? input-encoding font-encoding)
77                ;; guh
78                (equal? font-encoding "fetaBraces")
79                (equal? font-encoding "fetaNumber")
80                (equal? font-encoding "fetaMusic")
81                (equal? font-encoding "parmesanMusic"))
82                ""
83            (reencode-font plain input-encoding command)))))
84   
85   (define (font-load-encoding encoding)
86     (let ((filename (get-coding-filename encoding)))
87       (ly:kpathsea-gulp-file filename)))
88
89   (let* ((encoding-list (map (lambda (x)
90                                (assoc-get 'input-name
91                                           (ly:font-encoding-alist x)))
92                              font-list))
93          (encodings (uniq-list (sort-list (filter string? encoding-list)
94                                           string<?))))
95
96     (string-append
97      (apply string-append (map font-load-encoding encodings))
98      (apply string-append
99             (map (lambda (x) (font-load-command x)) font-list)))))
100
101 ;; FIXME: duplicated in other output backends
102 ;; FIXME: silly interface name
103 (define (output-variables paper)
104   ;; FIXME: duplicates output-paper's scope-entry->string, mostly
105   (define (value->string  val)
106     (cond
107      ((string? val) (string-append "(" val ")"))
108      ((symbol? val) (symbol->string val))
109      ((number? val) (number->string val))
110      (else "")))
111   
112   (define (output-entry ps-key ly-key)
113     (string-append
114      "/" ps-key " " (value->string (ly:output-def-lookup paper ly-key)) " def \n"))
115   
116   (string-append
117    "/lily-output-units 2.83464  def  %% milimeter \n"
118    "% /lily-output-units 0.996264  def  %% true points.\n"
119    (output-entry "staff-line-thickness" 'linethickness)
120    (output-entry "line-width" 'linewidth)
121    (output-entry "paper-size" 'papersize)
122    (output-entry "staff-height" 'staffheight)   ;junkme.
123    "/output-scale "
124    (number->string (ly:output-def-lookup paper 'outputscale))
125    " lily-output-units mul def \n"
126     ))
127   
128 (define (header paper page-count classic?)
129   (string-append
130    "%!PS-Adobe-3.0\n"
131    "%%Creator: creator time-stamp \n"
132    ))
133
134 (define (dump-page outputter page page-number page-count)
135   (ly:outputter-dump-string outputter
136    (string-append
137     "%%Page: " (number->string page-number) " " (number->string page-count) "\n"
138     "0 0 start-system { "
139     "set-ps-scale-to-lily-scale "
140     "\n"))
141   (ly:outputter-dump-stencil outputter (ly:page-stencil page))
142   (ly:outputter-dump-string outputter
143                             "} stop-system \nshowpage\n") )
144   
145   
146 (define-public (output-framework-ps outputter book scopes fields basename)
147   (let*
148       ((bookpaper  (ly:paper-book-book-paper book))
149        (pages (ly:paper-book-pages book))
150        (pageno 0)
151        (page-count (length pages))
152        )
153   (for-each
154    (lambda (x)
155      (ly:outputter-dump-string outputter x))
156    (list
157     (header bookpaper
158             (length pages)
159             #f)
160
161    "%%Pages: " (number->string page-count) "\n"
162    "%%PageOrder: Ascend\n"
163    "%%DocumentPaperSizes: " (ly:output-def-lookup bookpaper 'papersize) "\n"
164     
165     (output-variables bookpaper)
166     (ly:gulp-file "music-drawing-routines.ps")
167     (ly:gulp-file "lilyponddefs.ps")
168     (define-fonts bookpaper)
169     ))
170
171   (for-each
172    (lambda (page)
173      (set! pageno (1+ pageno))
174      (dump-page outputter page pageno page-count))
175    pages)
176   (ly:outputter-dump-string outputter "%%Trailer\n%%EOF\n")
177   ))
178
179
180
181   
182 (define-public (output-classic-framework-ps outputter book scopes fields basename)
183   (let*
184       ((bookpaper  (ly:paper-book-book-paper book))
185        (lines (ly:paper-book-lines book))
186        (y 0.0)
187        (scale (* 2.83464 (ly:output-def-lookup bookpaper 'outputscale)))
188        (total-y (apply + (map (lambda (z) (ly:paper-line-extent z Y))  lines)))
189        (x-ext '(-8 . 0))
190        (lineno 0)
191        )
192     
193     (define (dump-line outputter system)
194       (let*
195           ((stil  (ly:paper-line-stencil  system)))
196            
197       (ly:outputter-dump-string
198        outputter
199        (string-append
200         " 0.0 "
201         (ly:number->string y)
202         " start-system {\n set-ps-scale-to-lily-scale\n"))
203       (set! y (+ y (ly:paper-line-extent system Y)))
204       (ly:outputter-dump-stencil outputter stil)
205       (ly:outputter-dump-string
206        outputter
207        "} stop-system\n")))
208
209     (define (to-pt x)
210       (inexact->exact (round (* scale x))))
211     (for-each (lambda (l)
212                 (set! x-ext (interval-union x-ext (cons 0.0 (ly:paper-line-extent l X))))
213                 )
214                 lines)
215   (for-each
216    (lambda (x)
217      (ly:outputter-dump-string outputter x))
218    (list
219     "%!PS-Adobe-2.0 EPSF-2.0\n"
220     "%%Creator: LilyPond \n"
221     "%%BoundingBox: "
222     (ly:number->string (to-pt (car x-ext))) " "
223     (ly:number->string (to-pt 0)) " " 
224     (ly:number->string (to-pt (cdr x-ext))) " "
225     (ly:number->string (to-pt total-y)) "\n"
226     "%%EndComments\n"
227     (output-variables bookpaper)
228     (ly:gulp-file "music-drawing-routines.ps")
229     (ly:gulp-file "lilyponddefs.ps")
230     (load-fonts bookpaper)
231     (define-fonts bookpaper)
232     ))
233
234   (for-each
235    (lambda (line)
236      (set! lineno (1+ lineno))
237      (dump-line outputter line)) ;   pageno page-count))
238    lines)
239   (ly:outputter-dump-string outputter "\n")
240   ))
241