X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fframework-ps.scm;h=9498b2ac9dd24bff298a593707e53a9862b57609;hb=0a5768354b85264bc474baff8752f2c3e205cbe2;hp=248b3ee0ac5b15e18d73b8dcfb023646439a6153;hpb=a27fbd6ec52f5ecf7adbe830599d0d831cc77f97;p=lilypond.git diff --git a/scm/framework-ps.scm b/scm/framework-ps.scm index 248b3ee0ac..9498b2ac9d 100644 --- a/scm/framework-ps.scm +++ b/scm/framework-ps.scm @@ -243,9 +243,12 @@ (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 '())) @@ -306,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)) @@ -340,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 "") @@ -402,7 +414,9 @@ (cond ((eq? font-format (string->symbol "Type 1")) ;; Type 1 (PFA and PFB) fonts - (ly:type1->pfa file-name)) + (begin (set! never-embed-font-list + (append never-embed-font-list (list name))) + (ly:type1->pfa file-name))) ((eq? font-format 'TrueType) ;; TrueType fonts (TTF) and TrueType Collection (TTC) (ly:ttf->pfa file-name font-index)) @@ -481,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 @@ -488,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