(footer "\n%%EndData
%%EndResource
%%EndResource\n"))
- (string-append header
- binary-data
- footer)))
+ (begin
+ (set! never-embed-font-list
+ (append never-embed-font-list (list font-set-name)))
+ (string-append header
+ binary-data
+ footer))))
(define check-conflict-and-embed-cff
(let ((font-list '()))
(define (ps-load-file file-name)
(if (string? file-name)
- (if (string-contains file-name (ly:get-option 'datadir))
+ (if (and (not (ly:get-option 'font-export-dir))
+ (string-contains file-name (ly:get-option 'datadir)))
(begin
(set! file-name (ly:string-substitute (ly:get-option 'datadir)
"" file-name))
name)
(load-font font-name-filename))
(else
- (cons name
- (if (mac-font? bare-file-name)
- (handle-mac-font name bare-file-name)
- (cond
- ((and font (cff-font? font))
- (ps-load-file (ly:find-file
- (format #f "~a.otf" file-name))))
- ((string? bare-file-name)
- (ps-load-file file-name))
- (else
- (ly:warning (_ "cannot embed ~S=~S") name file-name)
- ""))))))))
+ (begin
+ (if (or (and font (cff-font? font))
+ (and (string? bare-file-name)
+ (not (eq? (ly:get-font-format
+ bare-file-name
+ font-index) 'TrueType))))
+ (set! never-embed-font-list
+ (append never-embed-font-list (list name))))
+ (cons name
+ (if (mac-font? bare-file-name)
+ (handle-mac-font name bare-file-name)
+ (cond
+ ((and font (cff-font? font))
+ (ps-load-file (ly:find-file
+ (format #f "~a.otf" file-name))))
+ ((string? bare-file-name)
+ (ps-load-file file-name))
+ (else
+ (ly:warning (_ "cannot embed ~S=~S") name file-name)
+ "")))))))))
(define (dir-join a b)
(if (equal? a "")
(pfas (map font-loader font-names)))
pfas))
+ (define (font-export name body)
+ (let* ((filename (format #f "~a/~a.font.ps"
+ (ly:get-option 'font-export-dir)
+ name))
+ (port-excl
+ (catch
+ 'system-error
+ (lambda ()
+ ;; Exclusive file create:
+ ;; When the file already exists, it raises system-error.
+ (open filename (logior O_WRONLY O_CREAT O_EXCL)))
+ (lambda stuff
+ ;; Catch the system-error
+ (let ((errno (system-error-errno stuff)))
+ (cond
+ ;; If the file already exists, return #f.
+ ((= errno EEXIST)
+ (begin
+ (ly:debug
+ (_ "Font file `~a' already exists, skipping.")
+ filename)
+ #f))
+ ;; If the cause is something else, re-throw the error.
+ (#t
+ (throw 'system-error (cdr stuff)))))))))
+ (if port-excl
+ ;; MinGW hack: need to have "b"inary for fonts
+ (let ((port (open-file filename "wb")))
+ (close port-excl)
+ (ly:debug (_ "Exporting font file `~a'.") filename)
+ (format port "%%BeginFont: ~a\n" name)
+ (display body port)
+ (display "%%EndFont\n" port)
+ (close-port port)))))
(display "%%BeginProlog\n" port)
(format
"/lilypond-datadir where {pop} {userdict /lilypond-datadir (~a) put } ifelse"
(ly:get-option 'datadir))
(set! never-embed-font-list (list))
+ (if (ly:get-option 'font-export-dir)
+ (let ((dirname (format #f "~a" (ly:get-option 'font-export-dir))))
+ (if (file-exists? dirname)
+ (ly:debug
+ (_ "Font export directory `~a' already exists.") dirname)
+ (begin
+ (ly:debug
+ (_ "Making font export directory `~a'.") dirname)
+ (mkdir dirname)))))
(if load-fonts?
(for-each (lambda (f)
(format port "\n%%BeginFont: ~a\n" (car f))
(display (cdr f) port)
- (display "%%EndFont\n" port))
+ (display "%%EndFont\n" port)
+ (if (ly:get-option 'font-export-dir)
+ (font-export (car f) (cdr f))))
(load-fonts paper)))
(if (ly:get-option 'gs-never-embed-fonts)
(begin