X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fframework-ps.scm;h=2cd9b5edc619bd6e067081cbbd521a30a65ef386;hb=b872748c6aa8bb721ced458691b38ac2fac5dfc8;hp=8bafb758f07bd0c52186359f0b0b930629f1a3fb;hpb=db313ad3bc0e00e323b9f8f07852070b79d15096;p=lilypond.git diff --git a/scm/framework-ps.scm b/scm/framework-ps.scm index 8bafb758f0..2cd9b5edc6 100644 --- a/scm/framework-ps.scm +++ b/scm/framework-ps.scm @@ -309,7 +309,8 @@ (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)) @@ -343,18 +344,26 @@ 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 "") @@ -486,6 +495,40 @@ (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 @@ -493,11 +536,31 @@ "/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)))) + (ly:debug + (_ "Making font export directory `~a'.") dirname) + (catch + 'system-error + (lambda () + ;; mkdir: + ;; When the directory already exists, it raises system-error. + (mkdir dirname)) + (lambda stuff + ;; Catch the system-error + (if (= EEXIST (system-error-errno stuff)) + ;; If the directory already exists, avoid error. + (ly:debug + (_ "Font export directory `~a' already exists.") dirname) + ;; If the cause is something else, re-throw the error. + (throw 'system-error (cdr stuff))))))) (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 @@ -536,8 +599,14 @@ (define (metadata-encode val) ;; First, call ly:encode-string-for-pdf to encode the string (latin1 or ;; utf-16be), then escape all parentheses and backslashes - ;; FIXME guile-2.0: use (string->utf16 str 'big) instead - + ;; + ;; NOTE: with guile-2.0+ ly:encode-string-for-pdf is not really needed and + ;; could be replaced with the following code: + ;; + ;; (let* ((utf16be-bom #vu8(#xFE #xFF))) + ;; (string-append (bytevector->string utf16be-bom "ISO-8859-1") + ;; (bytevector->string (string->utf16 val 'big) "ISO-8859-1"))) + ;; (ps-quote (ly:encode-string-for-pdf val))) (define (metadata-lookup-output overridevar fallbackvar field) (let* ((overrideval (ly:modules-lookup (list header) overridevar))