+ (define (dir-listing dir-name)
+ (define (dir-helper dir lst)
+ (let ((e (readdir dir)))
+ (if (eof-object? e) lst (dir-helper dir (cons e lst)))))
+ (reverse (dir-helper (opendir dir-name) '())))
+
+ (define (handle-mac-font name filename)
+ (let*
+ ((dir-name (tmpnam))
+ (files '())
+ (status 0)
+ (embed #f))
+
+ (mkdir dir-name #o700)
+ (set! status (ly:system
+ (format "cd ~a && fondu -force '~a'" dir-name filename)))
+
+ (set! files (dir-listing dir-name))
+
+ (for-each
+ (lambda (f)
+ (let*
+ ((full-name (dir-join dir-name f)))
+
+ (if (and (not embed)
+ (equal? 'regular (stat:type (stat full-name)))
+ (equal? name (ly:ttf-ps-name full-name)))
+
+ (set! embed
+ (font-file-as-ps-string name full-name)))
+
+ (if (or (equal? "." f)
+ (equal? ".." f))
+ #t
+ (delete-file full-name))))
+
+
+ files)
+ (rmdir dir-name)
+
+ (if (not embed)
+ (begin
+ (set! embed "% failed \n")
+ (ly:warning (_ "can't extract file matching ~a from ~a") name filename)))
+ embed))
+
+ (define (font-file-as-ps-string name file-name)
+ (let*
+ ((downcase-file-name (string-downcase file-name)))
+
+ (cond
+ ((and file-name (string-match "\\.pfa" downcase-file-name))
+ (embed-document file-name))
+ ((and file-name (string-match "\\.pfb" downcase-file-name))
+ (ly:pfb->pfa file-name))
+ ((and file-name (string-match "\\.ttf" downcase-file-name))
+ (ly:ttf->pfa file-name))
+ ((and file-name (string-match "\\.otf" downcase-file-name))
+ (ps-embed-cff (ly:otf->cff file-name) name 0))
+ (else
+ (ly:warning (_ "don't know how to embed ~S=~S") name file-name)
+ ""))))
+
+ (define (mac-font? bare-file-name)
+ (and
+ (eq? PLATFORM 'darwin)
+ bare-file-name
+ (or
+ (string-match "\\.dfont" bare-file-name)
+ (= (stat:size (stat bare-file-name)) 0))))
+
+ (define (load-font font-name-filename)
+ (let* ((font (car font-name-filename))
+ (name (cadr font-name-filename))
+ (file-name (caddr font-name-filename))
+ (bare-file-name (ly:find-file file-name)))
+
+ (cons
+ name
+ (cond
+
+ ((mac-font? bare-file-name)
+ (handle-mac-font name bare-file-name))
+
+ ((and font (cff-font? font))
+ (ps-embed-cff (ly:otf-font-table-data font "CFF ")
+ name
+ 0))
+
+ (bare-file-name (font-file-as-ps-string name bare-file-name))
+ (else
+ (ly:warning (_ "don't know how to embed font ~s ~s ~s")
+ name file-name font))))))
+
+
+ (define (load-fonts paper)
+ (let* ((fonts (ly:paper-fonts paper))
+ (all-font-names
+ (map
+ (lambda (font)
+ (cond
+ ((string? (ly:font-file-name font))
+ (list (list
+ font
+ (ly:font-name font)
+ (ly:font-file-name font))))
+ ((ly:pango-font? font)
+ (map
+ (lambda (name-psname-pair)
+ (list #f
+ (car name-psname-pair)
+ (cdr name-psname-pair)))
+ (ly:pango-font-physical-fonts font)))
+
+ (else
+ (ly:font-sub-fonts font))))
+
+ fonts))
+ (font-names
+ (uniq-list
+ (sort (apply append all-font-names)
+ (lambda (x y) (string<? (cadr x) (cadr y))))))
+
+
+ (font-loader (if (ly:get-option 'gs-font-load)
+ load-font-via-GS
+ load-font))
+
+ (pfas (map font-loader font-names)))
+ pfas))
+
+ (display "%%BeginProlog\n" port)
+ (if load-fonts?
+ (for-each
+ (lambda (f)
+ (format port "\n%%BeginFont: ~a\n" (car f))
+ (display (cdr f) port)
+ (display "\n%%EndFont\n" port))
+ (load-fonts paper)))
+
+ (display (setup-variables paper) port)
+
+ ;; adobe note 5002: should initialize variables before loading routines.
+ (display (procset "music-drawing-routines.ps") port)
+ (display (procset "lilyponddefs.ps") port)
+
+ (if (not (ly:get-option 'point-and-click))
+ (display "/mark_URI { pop pop pop pop pop } bind def\n" port))
+
+ (display "%%EndProlog\n" port)