From b1e87575d7dbce73e74c7e6eb1b64dbfc82e65a4 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Tue, 7 Jun 2005 13:34:02 +0000 Subject: [PATCH] * ttftool/parse.c (readNamingTable): handle Apple/8bit encoding too. * scm/framework-ps.scm (font-file-as-ps-string): new function. (handle-macfont): new function. Call fondu for Native mac fonts. --- ChangeLog | 5 +++ scm/framework-ps.scm | 91 ++++++++++++++++++++++++++++++++++++-------- scm/lily.scm | 2 + ttftool/parse.c | 26 ++++++++++++- 4 files changed, 107 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index f71c4bf795..6d719d18aa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2005-06-07 Han-Wen Nienhuys + * ttftool/parse.c (readNamingTable): handle Apple/8bit encoding too. + + * scm/framework-ps.scm (font-file-as-ps-string): new function. + (handle-macfont): new function. Call fondu for Native mac fonts. + * scm/define-markup-commands.scm (fill-line): handle text-widths = '() case. diff --git a/scm/framework-ps.scm b/scm/framework-ps.scm index 358eecfa6a..6251246559 100644 --- a/scm/framework-ps.scm +++ b/scm/framework-ps.scm @@ -254,6 +254,68 @@ (ly:warning (_ "don't know how to embed ~S=~S") name file-name) ""))))) + ;; ugh. posix /windows/mingw? + (define (path-join a b) + (if (equal? a "") + b + (string-append a "/" b))) + + (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 "")) + + + (display (list filename name)) + (mkdir dir-name #o700) + + (set! status (system + (format "cd ~a && fondu -force ~a" dir-name filename))) + + (if (!= status 0) + (ly:error "Fondu failed.")) + + (set! files (dir-listing dir-name)) + + (for-each + (lambda (f) + (if (string-match (string-append name "\\.") f) + (set! embed + (font-file-as-ps-string name (path-join dir-name f)))) + + (if (or (equal? "." f) + (equal? ".." f)) + #t + (delete-file (path-join dir-name f)))) + files) + (rmdir dir-name) + embed)) + + (define (font-file-as-ps-string name file-name) + (cond + ((and file-name (string-match "\\.pfa" file-name)) + (cached-file-contents file-name)) + ((and file-name (string-match "\\.pfb" file-name)) + (ly:pfb->pfa file-name)) + ((and file-name (string-match "\\.ttf" file-name)) + (ly:ttf->pfa file-name)) + ((and file-name (string-match "\\.otf" file-name)) + (ps-embed-cff (ly:otf->cff file-name) name 0)) + ((and file-name (string-match "\\.ttf" file-name)) + (ly:ttf->pfa file-name)) + (else + (ly:warning (_ "don't know how to embed ~S=~S") name file-name) + "") + )) + (define (load-font font-name-filename) (let* ((font (car font-name-filename)) (name (cadr font-name-filename)) @@ -264,30 +326,29 @@ (cons (munge-lily-font-name name) (cond - ((and bare-file-name (string-match "\\.pfa" bare-file-name)) - (cached-file-contents bare-file-name)) - ((and bare-file-name (string-match "\\.pfb" bare-file-name)) - (ly:pfb->pfa bare-file-name)) - ((and bare-file-name (string-match "\\.ttf" bare-file-name)) - (ly:ttf->pfa bare-file-name)) - ((string-match "([eE]mmentaler|[Aa]ybabtu)" file-name) (cached-file-contents (format "~a.pfa" (munge-lily-font-name file-name)))) - - ((and bare-file-name (string-match "\\.otf" bare-file-name)) - (ps-embed-cff (ly:otf->cff bare-file-name) name 0)) - - ((and bare-file-name (string-match "\\.ttf" bare-file-name)) - (ly:ttf->pfa bare-file-name)) + ((and +; (eq? PLATFORM 'darwin) + bare-file-name (string-match "\\.dfont" bare-file-name)) + (handle-mac-font name bare-file-name)) + + ((and +; (eq? PLATFORM 'darwin) + bare-file-name (= (stat:size (stat bare-file-name)) 0)) + (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 ~S=~S") name file-name) - ""))))) + (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)) diff --git a/scm/lily.scm b/scm/lily.scm index 2ed241a645..66b64cbe53 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -86,6 +86,8 @@ ;; Mingw ;; #(Windows XP HOSTNAME build 2600 5.01 Service Pack 1 i686) ;; + +;; ugh, code dup. (define-public PLATFORM (string->symbol (string-downcase diff --git a/ttftool/parse.c b/ttftool/parse.c index 13e1a13b75..b233910b58 100644 --- a/ttftool/parse.c +++ b/ttftool/parse.c @@ -67,10 +67,11 @@ readNamingTable (int fd) for (i = 0; i < nrecords; i++) { - if (records[i].platformID == 3 && /* Microsoft */ + if + ((records[i].platformID == 3 && /* Microsoft */ records[i].encodingID == 1 && /* UGL */ records[i].languageID == 0x0409 && /* US English */ - records[i].nameID <= 7) + records[i].nameID <= 7)) { strings[records[i].nameID] = mymalloc (records[i].length / 2 + 1); unistrncpy (strings[records[i].nameID], @@ -80,6 +81,27 @@ readNamingTable (int fd) strings[records[i].nameID]); } } + + + for (i = 0; i < nrecords; i++) + { + int id = records[i].nameID; + if (records[i].platformID == 1 && /* Apple */ + records[i].encodingID == 0 && /* 8bit */ + id <= 7 && + !strings[id] + ) + { + strings[id] = mymalloc (records[i].length + 1); + strncpy (strings[id], + data + records[i].offset, records[i].length); + strings[id][records[i].length] = 0; + if (verbosity >= 2) + fprintf (stderr, "%d: %s\n", records[i].nameID, + strings[records[i].nameID]); + } + } + free (records); free (data); return strings; -- 2.39.2