(define-fonts paper ps-define-font ps-define-pango-pf)
(output-variables paper)))
+(define never-embed-font-list (list))
+
(define (cff-font? font)
(let* ((cff-string (ly:otf-font-table-data font "CFF ")))
(> (string-length cff-string) 0)))
(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 '()))
+ (lambda (name file-name font-index)
+ (if name
+ (let* ((name-symbol (string->symbol name))
+ (args-filename-offset
+ (cons file-name (ly:get-cff-offset file-name font-index)))
+ (found-filename-offset (assq name-symbol font-list)))
+ (if found-filename-offset
+ (begin
+ (if (equal? args-filename-offset (cdr found-filename-offset))
+ (ly:debug
+ (_ "CFF font `~a' already embedded, skipping.")
+ name)
+ (ly:warning
+ (_ "Different CFF fonts which have the same name `~a' has been detected. The font cannot be embedded.")
+ name))
+ "")
+ (begin
+ (ly:debug (_ "Embedding CFF font `~a'.") name)
+ (set! font-list
+ (acons name-symbol args-filename-offset font-list))
+ (ps-embed-cff (ly:otf->cff file-name font-index) name 0))))
+ (begin
+ (ly:debug (_ "Initializing embedded CFF font list."))
+ (set! font-list '()))))))
+
+(define (initialize-font-embedding)
+ (check-conflict-and-embed-cff #f #f #f))
(define (write-preamble paper load-fonts? port)
(define (internal-font? font-name-filename)
(ly:get-option 'datadir)))))
(define (load-font-via-GS font-name-filename)
+ (define (is-collection-font? file-name)
+ (let* ((port (open-file file-name "rb"))
+ (retval
+ (if (eq? (read-char port) #\t)
+ (if (eq? (read-char port) #\t)
+ (if (eq? (read-char port) #\c)
+ (if (eq? (read-char port) #\f)
+ #t
+ #f)
+ #f)
+ #f)
+ #f)))
+ (close-port port)
+ retval))
+
(define (ps-load-file file-name)
(if (string? file-name)
(if (string-contains file-name (ly:get-option 'datadir))
(let* ((font (car font-name-filename))
(name (cadr font-name-filename))
(file-name (caddr font-name-filename))
+ (font-index (cadddr font-name-filename))
(bare-file-name (ly:find-file file-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)
- ""))))))
+ (cond
+ ((and (number? font-index)
+ (!= font-index 0))
+ (ly:warning (_ "Font ~a cannot be loaded via Ghostscript because its font-index (~a) is not zero.")
+ name font-index)
+ (load-font font-name-filename))
+ ((and (string? bare-file-name)
+ (eq? (ly:get-font-format bare-file-name font-index) 'CFF)
+ (is-collection-font? bare-file-name))
+ (ly:warning (_ "Font ~a cannot be loaded via Ghostscript because it is an OpenType/CFF Collection (OTC) font.")
+ name)
+ (load-font font-name-filename))
+ ((and (string? bare-file-name)
+ (eq? (ly:get-font-format bare-file-name font-index) 'TrueType)
+ (not (ly:has-glyph-names? bare-file-name font-index)))
+ (ly:warning (_ "Font ~a cannot be used via Ghostscript because it is a TrueType font that does not have glyph names.")
+ 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)
+ ""))))))))
(define (dir-join a b)
(if (equal? a "")
embed))
(define (font-file-as-ps-string name file-name font-index)
- (let* ((downcase-file-name (string-downcase file-name)))
+ (let ((font-format (ly:get-font-format file-name font-index)))
(cond
- ((and file-name (string-endswith downcase-file-name ".pfa"))
- (embed-document file-name))
- ((and file-name (string-endswith downcase-file-name ".pfb"))
- (ly:pfb->pfa file-name))
- ((and file-name (string-endswith downcase-file-name ".ttf"))
- (ly:ttf->pfa file-name))
- ((and file-name (string-endswith downcase-file-name ".ttc"))
- ;; TODO: distinguish files which have extension `*.ttc'
- ;; whether TrueType Collection (TTC) fonts
- ;; or OpenType/CFF Collection (OTC) fonts.
- (ly:ttf->pfa file-name font-index)) ;; TTC fonts
- ((and file-name (string-endswith downcase-file-name ".otf"))
- (ps-embed-cff (ly:otf->cff file-name) name 0))
- ((and file-name (string-endswith downcase-file-name ".otc"))
- ;; The files which have the extension `*.otc' are OTC fonts.
- (ps-embed-cff (ly:otf->cff file-name font-index) name 0)) ;; OTC fonts
+ ((eq? font-format (string->symbol "Type 1"))
+ ;; Type 1 (PFA and PFB) fonts
+ (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))
+ ((eq? font-format 'CFF)
+ ;; OpenType/CFF fonts (OTF) and OpenType/CFF Collection (OTC)
+ (check-conflict-and-embed-cff name file-name font-index))
(else
(ly:warning (_ "do not know how to embed ~S=~S") name file-name)
""))))
port
"/lilypond-datadir where {pop} {userdict /lilypond-datadir (~a) put } ifelse"
(ly:get-option 'datadir))
+ (set! never-embed-font-list (list))
(if load-fonts?
(for-each (lambda (f)
(format port "\n%%BeginFont: ~a\n" (car f))
(display (cdr f) port)
(display "%%EndFont\n" port))
(load-fonts paper)))
+ (if (ly:get-option 'gs-never-embed-fonts)
+ (begin
+ (display "\nsystemdict /DEVICE known\n" port)
+ (display " { systemdict /DEVICE get (pdfwrite) eq {\n" port)
+ (display ".setpdfwrite << /NeverEmbed [" port)
+ (display (string-concatenate
+ (map (lambda (f) (string-append " /" f))
+ never-embed-font-list)) port)
+ (display " ] >> setdistillerparams\n" port)
+ (display " } if } if\n" port)))
(if (ly:bigpdfs)
(display (procset "encodingdefs.ps") port))
(display (setup-variables paper) port)
(page-number (1- (ly:output-def-lookup paper 'first-page-number)))
(page-count (length page-stencils))
(port (ly:outputter-port outputter)))
+ (initialize-font-embedding)
(if (ly:get-option 'clip-systems)
(clip-system-EPSes basename book))
(if (ly:get-option 'dump-signatures)
(rounded-bbox (to-rounded-bp-box bbox))
(port (ly:outputter-port outputter))
(header (eps-header paper rounded-bbox load-fonts)))
+ (initialize-font-embedding)
(display header port)
(write-preamble paper load-fonts port)
(display "/mark_page_link { pop pop pop pop pop } bind def\n" port)