]> git.donarmstrong.com Git - lilypond.git/commitdiff
* scm/framework-ps.scm (write-preamble): extract CFF from OTF
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 2 May 2005 23:49:18 +0000 (23:49 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 2 May 2005 23:49:18 +0000 (23:49 +0000)
fonts directly.

* buildscripts/gen-emmentaler-scripts.py (i): idem.

* mf/GNUmakefile: remove all CFF rules.

* scm/framework-ps.scm (ps-embed-cff): reinstate.

* lily/open-type-font-scheme.cc (LY_DEFINE):
new function ly:otf-font-table-data.
(LY_DEFINE): new function otf-font?

ChangeLog
buildscripts/gen-emmentaler-scripts.py
lily/open-type-font-scheme.cc
lily/open-type-font.cc
lily/pango-font.cc
mf/GNUmakefile
scm/framework-ps.scm

index 3d4dac1046444bb672ba2ba778887ea0fb89320d..dadebfce7900b9764e7c043f1867089f3aa6587a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,17 @@
 2005-05-03  Han-Wen Nienhuys  <hanwen@xs4all.nl>
 
+       * scm/framework-ps.scm (write-preamble): extract CFF from OTF
+       fonts directly.
+
+       * buildscripts/gen-emmentaler-scripts.py (i): idem.
+
+       * mf/GNUmakefile: remove all CFF rules.
+
+       * scm/framework-ps.scm (ps-embed-cff): reinstate.
+
        * lily/open-type-font-scheme.cc (LY_DEFINE):
        new function ly:otf-font-table-data.
+       (LY_DEFINE): new function otf-font?
 
 2005-05-02  Han-Wen Nienhuys  <hanwen@xs4all.nl>
 
index c4f54f6e589f5c3fa5111c34a4096d9af3643b46..3895d660d72b0d4932ca731427edc28b816eab89 100644 (file)
@@ -66,7 +66,6 @@ LoadTableFromFile("LILC", "feta%(design_size)d.otf-table")
 LoadTableFromFile("LILY", "feta%(design_size)d.otf-gtable")
 
 Generate("%(filename)s-%(design_size)d.otf");
-Generate("%(filename)s-%(design_size)d.cff");
 Generate("%(filename)s-%(design_size)d.svg");
 SetFontNames("PFA%(name)s-%(design_size)d", "PFA%(name)s", "PFA%(name)s %(design_size)d", "%(design_size)d", "GNU GPL", "@TOPLEVEL_VERSION@");
 
index 147320521004d006052c76e1a9ebd50c4a61291e..d39a7cc9d8573885168280e29978c081fc86c8f8 100644 (file)
@@ -35,10 +35,10 @@ LY_DEFINE (ly_otf_font_glyph_info, "ly:otf-font-glyph-info", 2, 0, 0,
   return scm_hashq_ref (otf->get_char_table (), sym, SCM_EOL);
 }
 
-
 LY_DEFINE(ly_otf_font_table_data, "ly:otf-font-table-data", 2, 0, 0,
          (SCM font, SCM tag),
-         "Extract a table @var{tag} from @var{font}.")
+         "Extract a table @var{tag} from @var{font}. Return empty string for "
+         "non-existent @var{tag}.")
 {
   Modified_font_metric *fm
     = dynamic_cast<Modified_font_metric *> (unsmob_metrics (font));
@@ -46,7 +46,6 @@ LY_DEFINE(ly_otf_font_table_data, "ly:otf-font-table-data", 2, 0, 0,
   Open_type_font *otf = fm ? dynamic_cast<Open_type_font *> (fm->original_font ())
     : dynamic_cast<Open_type_font *> (unsmob_metrics (font));
 
-
   SCM_ASSERT_TYPE (otf, font, SCM_ARG1,  __FUNCTION__, "Open type font");
   SCM_ASSERT_TYPE (scm_is_string (tag), tag, SCM_ARG1,  __FUNCTION__, "Open type font");
 
@@ -59,3 +58,16 @@ LY_DEFINE(ly_otf_font_table_data, "ly:otf-font-table-data", 2, 0, 0,
 
   return scm_from_locale_stringn ((char const*) tab.to_bytes (), tab.length ());
 }
+
+LY_DEFINE(ly_otf_font_p, "ly:otf-font?", 1, 0, 0,
+         (SCM font),
+         "Is @var{font} an OpenType font?")
+{
+  Modified_font_metric *fm
+    = dynamic_cast<Modified_font_metric *> (unsmob_metrics (font));
+  
+  Open_type_font *otf = fm ? dynamic_cast<Open_type_font *> (fm->original_font ())
+    : dynamic_cast<Open_type_font *> (unsmob_metrics (font));
+
+  return scm_from_bool (otf);
+}
index df0a23e7d5335b9fb087c21dab58b3f627810fb9..6c82e91f216f3b0c095507a1feab8ea5a058df3a 100644 (file)
@@ -18,6 +18,7 @@
 FT_Byte *
 load_table (char const *tag_str, FT_Face face, FT_ULong *length)
 {
+  *length = 0;
   FT_ULong tag = FT_MAKE_TAG (tag_str[0], tag_str[1], tag_str[2], tag_str[3]);
 
   int error_code = FT_Load_Sfnt_Table (face, tag, 0, NULL, length);
@@ -33,7 +34,11 @@ load_table (char const *tag_str, FT_Face face, FT_ULong *length)
 
       return buffer;
     }
-
+  else
+    {
+      programming_error ("Cannot find OpenType table.");
+    }
+  
   return 0;
 }
 
@@ -42,7 +47,7 @@ Open_type_font::get_otf_table (String tag) const
 {
   FT_ULong len;
   FT_Byte *tab = load_table (tag.to_str0 (), face_,  &len);
-  
+
   return String (tab, len);
 }
 
index 7b0ac74fa7be35d00d933d0290a3f173d4ade769..35dd915ea178021a73b01b68c1c686de62a67329 100644 (file)
@@ -164,7 +164,7 @@ Pango_font::pango_item_string_stencil (PangoItem *item, String str, Real dx) con
     {
       ((Pango_font *) this)->register_font_file (filename, ps_name);
       pango_fc_font_unlock_face (fcfont);
-
+       
       SCM expr = scm_list_4 (ly_symbol2scm ("glyph-string"),
                             scm_makfrom0str (ps_name.to_str0 ()),
                             scm_from_double (size),
index 52f185ecb67c17eb30718adaff647c198922a7ef..46a7dd063db5d0bc04be294f09cefddc7c4a8ce9 100644 (file)
@@ -29,8 +29,6 @@ OTF_TABLES = $(STAFF_SIZES:%=$(outdir)/feta%.otf-table)\
  $(BRACES:%=$(outdir)/feta-braces-%.otf-table)
 FETA_FONTS = $(FETA_MF_FILES:.mf=)
 SVG_FILES = $(OTF_FILES:%.otf=%.svg) $(ALL_FONTS:%=$(outdir)/%.svg)
-CFF_FILES = $(OTF_FILES:%.otf=%.cff)
-CFF_PS_FILES = $(OTF_FILES:%.otf=%.cff.ps)
 
 
 $(outdir)/aybabtu.otf-table: $(BRACES:%=$(outdir)/feta-braces-%.otf-table)
@@ -58,15 +56,14 @@ MFTRACE_FLAGS=$(if $(ENCODING_FILE),--encoding $(ENCODING_FILE),) --no-afm
 # 2. are not included with teTeX
 #
 
-$(outdir)/%.cff.ps $(outdir)/$(PFA_PREFIX)%.pfa $(outdir)/%.cff $(outdir)/%.otf $(outdir)/%.svg: $(outdir)/%.pe
+$(outdir)/$(PFA_PREFIX)%.pfa $(outdir)/%.otf $(outdir)/%.svg: $(outdir)/%.pe
        (cd $(outdir) && $(FONTFORGE) -script $(notdir $<))
-       $(PYTHON) $(buildscript-dir)/ps-embed-cff.py $(basename $<).cff `cat $(basename $<).fontname` $(basename $<).cff.ps
        -rm $(outdir)/*.scale.pfa
 
 # ugh, this does not work
 $(outdir)/%.pfa: $(outdir)/%.log
 $(outdir)/feta-alphabet%.pfa: $(outdir)/feta-alphabet%.log
-$(outdir)/emmentaler-%.otf $(outdir)/$(PFA_PREFIX)emmentaler-%.pfa $(outdir)/emmentaler%.cff $(outdir)/emmentaler%.svg: $(outdir)/feta%.pfa $(outdir)/feta-alphabet%.pfa $(outdir)/parmesan%.pfa
+$(outdir)/emmentaler-%.otf $(outdir)/$(PFA_PREFIX)emmentaler-%.pfa $(outdir)/emmentaler%.svg: $(outdir)/feta%.pfa $(outdir)/feta-alphabet%.pfa $(outdir)/parmesan%.pfa
 
 # AARGH?
 
@@ -114,7 +111,7 @@ $(outdir)/%.otf-table: $(outdir)/%.lisp $(if $(findstring brace,$<),,$(subst fet
 
 $(outdir)/aybabtu.otf $(outdir)/$(PFA_PREFIX)aybabtu.pfa: $(outdir)/aybabtu.subfonts $(outdir)/aybabtu.fontname $(outdir)/aybabtu.otf-table $(outdir)/aybabtu.otf-gtable $(outdir)/aybabtu.pe
 
-$(outdir)/aybabtu.otf $(outdir)/$(PFA_PREFIX)aybabtu.pfa $(outdir)/aybabtu.cff $(outdir)/aybabtu.svg: $(BRACES:%=$(outdir)/feta-braces-%.pfa)
+$(outdir)/aybabtu.otf $(outdir)/$(PFA_PREFIX)aybabtu.pfa $(outdir)/aybabtu.svg: $(BRACES:%=$(outdir)/feta-braces-%.pfa)
 
 $(outdir)/aybabtu.fontname:
        echo -n 'aybabtu' > $@ 
@@ -130,7 +127,7 @@ PFA_FILES = $(ALL_FONTS:%=$(outdir)/%.pfa) $(PFA_OTF_FILES)
 
 # Make tfm files first, log files last, 
 # so that normally log files aren't made twice
-ALL_GEN_FILES= $(TFM_FILES) $(TEXTABLES) $(TFM_FILES) $(LOG_FILES) $(ENC_FILES) $(LISP_FILES) $(FETA_LIST_FILES)  $(OTF_TABLES) $(PFA_FILES) $(outdir)/lilypond.map $(OTF_FILES) $(SVG_FILES) $(CFF_PS_FILES) $(CFF_FILES)
+ALL_GEN_FILES= $(TFM_FILES) $(TEXTABLES) $(TFM_FILES) $(LOG_FILES) $(ENC_FILES) $(LISP_FILES) $(FETA_LIST_FILES)  $(OTF_TABLES) $(PFA_FILES) $(outdir)/lilypond.map $(OTF_FILES) $(SVG_FILES)
 
 #PRE_INSTALL=$(MAKE) "$(ALL_GEN_FILES)"
 INSTALLATION_DIR=$(local_lilypond_datadir)/fonts/source
index b7fbae4842105290a354fda2c368ac9f69cfed41..4177cc62426e814a52cb61b7cce744445b2da138 100644 (file)
   (regexp-substitute/global #f "([eE]mmentaler|[aA]ybabtu)"
                            name 'pre "PFA" 1 'post))
 
+(define (cff-font? font)
+  (let*
+      ((cff-string  (ly:otf-font-table-data font "CFF ")))
+    (> (string-length cff-string) 0)))
+
+(define-public (ps-embed-cff body font-set-name version)
+  (let* ((binary-data
+         (string-append
+          (format "/~a ~s StartData " font-set-name (string-length body))
+          body))
+
+        (header
+         (format
+          "%%BeginResource: font ~a
+%!PS-Adobe-3.0 Resource-FontSet
+%%DocumentNeededResources: ProcSet (FontSetInit)
+%%Title: (FontSet/~a)
+%%Version: ~s
+%%EndComments
+%%IncludeResource: ProcSet (FontSetInit)
+%%BeginResource: FontSet (~a)
+/FontSetInit /ProcSet findresource begin
+%%BeginData: ~s Binary Bytes
+"
+          font-set-name font-set-name version font-set-name
+          (string-length binary-data)))
+        (footer "\n%%EndData
+%%EndResource
+%%EOF
+%%EndResource\n"))
+
+    (string-append
+     header
+     binary-data
+     footer)))
+
+
 (define (write-preamble paper load-fonts? port)
-  (define (load-font font-pair)
-    (let* ((name (car font-pair))
-          (file-name (cdr font-pair))
-                
-          (bare-file-name (ly:find-file file-name))
-          (cffname (string-append file-name ".cff.ps"))
-          (cff-file-name (ly:find-file cffname)))
+  
+  (define (load-font font-name-filename)
+    (let* ((font (car font-name-filename))
+          (name (cadr font-name-filename))
+          (file-name (caddr font-name-filename))
+          (bare-file-name (ly:find-file file-name)))
 
       (cons 
        (munge-lily-font-name 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|cff)" bare-file-name))
-
-                                       ; replace with the CFF.ps, which lives in a
-                                       ; separate subdir.
-        (for-each (lambda (tup)
-                    (set! bare-file-name
-                          (string-regexp-substitute
-                           (car tup) (cdr tup) bare-file-name)))
-                  '(("/fonts/otf/" . "/ps/")
-                    ("/fonts/cff/" . "/ps/")
-                    ("\\.(otf|cff)" . ".cff.ps")))
-
+       
+       ((cff-font? font)
+        (ps-embed-cff (ly:otf-font-table-data font "CFF ")
+                      name
+                      0))
         (cached-file-contents bare-file-name))
        ((and bare-file-name (string-match "\\.ttf" bare-file-name))
         (ly:ttf->pfa bare-file-name))
        (else
         (ly:warning (_ "can't find CFF/PFA/PFB font ~S=~S" name file-name))
         (cons font-name ""))))))
+
   
   (define (load-fonts paper)
     (let* ((fonts (ly:paper-fonts paper))
             (lambda (font)
               (cond
                ((string? (ly:font-file-name font))
-                (list (cons (ly:font-name font)
-                            (ly:font-file-name font))))
+                (list (list
+                       font
+                       (ly:font-name font)
+                       (ly:font-file-name font))))
                ((ly:pango-font? font)
-                (ly:pango-font-physical-fonts font))
+                (map
+                 (lambda (name-psname-pair)
+                   (list #f
+                         (car name-psname-pair)
+                         (cdr name-psname-pair)))
+                  (ly:pango-font-physical-fonts font)))
                (else
                 (ly:font-sub-fonts font))))
                   
           (font-names
            (uniq-list
             (sort (apply append all-font-names)
-                  (lambda (x y) (string<? (car x) (car y))))))
+                  (lambda (x y) (string<? (cadr x) (cadr y))))))
           
           (pfas (map load-font font-names)))
       pfas))