]> git.donarmstrong.com Git - lilypond.git/commitdiff
Make TTCs work. Fixes #710.
authorWerner Lemberg <wl@gnu.org>
Sat, 27 Dec 2008 08:42:03 +0000 (09:42 +0100)
committerWerner Lemberg <wl@gnu.org>
Sat, 27 Dec 2008 08:42:03 +0000 (09:42 +0100)
The code did not handle face indices; it relied on the PS name and the
(physical) font name only.  No visible changes for users.  However,
`ly:pango-font-physical-fonts' now returns a three-element list instead of a
pair, but I doubt that this function makes sense outside of
`framework-ps.scm'.

lily/all-font-metrics.cc
lily/font-config-scheme.cc
lily/include/all-font-metrics.hh
lily/include/pango-font.hh
lily/pango-font-scheme.cc
lily/pango-font.cc
scm/framework-ps.scm

index 2deea75cdae8d0bad956c7609b7392c3458c5f27..96d8667c9dad4c18bf3478960a52b88c95745782 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "all-font-metrics.hh"
 
+#include "string-convert.hh"
 #include "international.hh"
 #include "main.hh"
 #include "open-type-font.hh"
 
 
 Index_to_charcode_map const *
-All_font_metrics::get_index_to_charcode_map (string filename, FT_Face face)
+All_font_metrics::get_index_to_charcode_map (string filename,
+                                            int face_index,
+                                            FT_Face face)
 {
-  if (filename_charcode_maps_map_.find (filename)
+  string key = filename + String_convert::int_string (face_index);
+  if (filename_charcode_maps_map_.find (key)
       == filename_charcode_maps_map_.end ())
-    filename_charcode_maps_map_[filename] = make_index_to_charcode_map (face);
+    filename_charcode_maps_map_[key] = make_index_to_charcode_map (face);
 
-  return &filename_charcode_maps_map_[filename];
+  return &filename_charcode_maps_map_[key];
 }
 
 
index ce4525467a3a82297506708771999723af5e88e5..9de2cd112dd52a39ecd715e077e206fa54c22b73 100644 (file)
@@ -29,6 +29,8 @@ display_fontset (FcFontSet *fs)
       font = FcNameUnparse (fs->fonts[j]);
       if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &str) == FcResultMatch)
        retval += String_convert::form_string ("FILE %s\n", str);
+      if (FcPatternGetString (fs->fonts[j], FC_INDEX, 0, &str) == FcResultMatch)
+       retval += String_convert::form_string ("INDEX %s\n", str);
       if (FcPatternGetString (fs->fonts[j], FC_FAMILY, 0, &str) == FcResultMatch)
        retval += String_convert::form_string ("family %s\n ", str);
       if (FcPatternGetString (fs->fonts[j],
index 9c37a1a7d2107d265c55ec809bdf85ff9f474e75..da1437bfacd3c32c0f3b24cc89b7f0ef63a3a4c9 100644 (file)
@@ -39,7 +39,9 @@ class All_font_metrics
   All_font_metrics (All_font_metrics const &);
 public:
 
-  Index_to_charcode_map const *get_index_to_charcode_map (string filename, FT_Face face);
+  Index_to_charcode_map const *get_index_to_charcode_map (string filename,
+                                                         int face_index,
+                                                         FT_Face face);
 
   All_font_metrics (string search_path);
   ~All_font_metrics ();
index 93ac7c11f896629899ef42667625071b3798abcc..dc93324da84c084e4991fd42f70774e1d00fa0b5 100644 (file)
@@ -37,7 +37,7 @@ public:
 
   string description_string () const; 
   SCM font_file_name () const;
-  void register_font_file (string, string);
+  void register_font_file (string, string, int);
   Stencil text_stencil (string, bool tight) const;
 
   Stencil pango_item_string_stencil (PangoItem const *, string, bool tight) const;
index 955b4a8f167888e480dff294340d5d846eb85a7a..2c6f13cc078a0c4c633ee17c961d5d3e2f30c45c 100644 (file)
@@ -30,7 +30,8 @@ LY_DEFINE (ly_pango_font_p, "ly:pango-font?",
 LY_DEFINE (ly_pango_font_physical_fonts, "ly:pango-font-physical-fonts",
           1, 0, 0,
           (SCM f),
-          "Return alist of @code{(PSNAME . FILENAME)} tuples.")
+          "Return alist of @code{(ps-name file-name font-index)} lists"
+          " for Pango font@tie{}@var{f}.")
 {
   Pango_font *pf = dynamic_cast<Pango_font *> (unsmob_metrics (f));
 
index 138fd5cb0001c68ee7694892ad6ffd3d514d7796..f6456dd826a2a6e9280229e392aaadb34a4978d4 100644 (file)
@@ -64,11 +64,13 @@ Pango_font::~Pango_font ()
 
 void
 Pango_font::register_font_file (string filename,
-                               string ps_name)
+                               string ps_name,
+                               int face_index)
 {
   scm_hash_set_x (physical_font_tab_,
                  ly_string2scm (ps_name),
-                 ly_string2scm (filename));
+                 scm_list_2 (ly_string2scm (filename),
+                             scm_from_int (face_index)));
 }
 
 void
@@ -124,13 +126,20 @@ Pango_font::pango_item_string_stencil (PangoItem const *item,
                   PANGO_RBEARING (logical_rect)),
         Interval (-PANGO_DESCENT (*which_rect),
                   PANGO_ASCENT (*which_rect)));
-
   b.scale (scale_);
+
   char const *ps_name_str0 = FT_Get_Postscript_Name (ftface);
   FcPattern *fcpat = fcfont->font_pattern;
+
   FcChar8 *file_name_as_ptr = 0;
   FcPatternGetString (fcpat, FC_FILE, 0, &file_name_as_ptr);
 
+  // due to a bug in FreeType 2.3.7 and earlier we can't use
+  // ftface->face_index; it is always zero for some font formats,
+  // in particular TTCs which we are interested in
+  int face_index = 0;
+  FcPatternGetInteger (fcpat, FC_INDEX, 0, &face_index);
+
   string file_name;
   if (file_name_as_ptr)
     // Normalize file name.
@@ -142,10 +151,12 @@ Pango_font::pango_item_string_stencil (PangoItem const *item,
   Index_to_charcode_map const *cmap = 0;
   bool has_glyph_names = ftface->face_flags & FT_FACE_FLAG_GLYPH_NAMES;
   if (!has_glyph_names)
-    cmap = all_fonts_global->get_index_to_charcode_map (file_name, ftface);
+    cmap = all_fonts_global->get_index_to_charcode_map (
+            file_name, face_index, ftface);
 
   bool is_ttf = string (FT_Get_X11_Font_Format (ftface)) == "TrueType";
   bool cid_keyed = false;
+
   for (int i = 0; i < pgs->num_glyphs; i++)
     {
       PangoGlyphInfo *pgi = pgs->glyphs + i;
@@ -193,7 +204,6 @@ Pango_font::pango_item_string_stencil (PangoItem const *item,
       if (glyph_name[0] == '\0')
        {
          // CID entry
-
          cid_keyed = true;
          char_id = scm_from_uint32 (pg);
        }
@@ -250,7 +260,9 @@ Pango_font::pango_item_string_stencil (PangoItem const *item,
 
   if (ps_name.length ())
     {
-      ((Pango_font *) this)->register_font_file (file_name, ps_name);
+      ((Pango_font *) this)->register_font_file (file_name,
+                                                ps_name,
+                                                face_index);
       pango_fc_font_unlock_face (fcfont);
 
       SCM expr = scm_list_5 (ly_symbol2scm ("glyph-string"),
index 25c14f6cc3b37736d3fcda12939737299240f709..cfd72cf041be283e68984afdca24bcc1f7f549a1 100644 (file)
                        name filename)))
       embed))
 
-  (define (font-file-as-ps-string name file-name)
+  (define (font-file-as-ps-string name file-name font-index)
     (let* ((downcase-file-name (string-downcase file-name)))
       (cond
        ((and file-name (string-endswith downcase-file-name ".pfa"))
        ((and file-name (string-endswith downcase-file-name ".ttf"))
        (ly:ttf->pfa file-name))
        ((and file-name (string-endswith downcase-file-name ".ttc"))
-       (ly:ttf->pfa file-name))
+       (ly:ttf->pfa file-name font-index))
        ((and file-name (string-endswith downcase-file-name ".otf"))
        (ps-embed-cff (ly:otf->cff file-name) name 0))
        (else
         (or (string-endswith bare-file-name ".dfont")
             (= (stat:size (stat bare-file-name)) 0))))
 
-  (define (load-font font-name-filename)
-    (let* ((font (car font-name-filename))
-          (name (cadr font-name-filename))
-          (file-name (caddr font-name-filename))
+  (define (load-font font-psname-filename-fontindex)
+    (let* ((font (list-ref font-psname-filename-fontindex 0))
+          (name (list-ref font-psname-filename-fontindex 1))
+          (file-name (list-ref font-psname-filename-fontindex 2))
+          (font-index (list-ref font-psname-filename-fontindex 3))
           (bare-file-name (ly:find-file file-name)))
       (cons name
            (cond ((mac-font? bare-file-name)
                                 name
                                 0))
                  (bare-file-name (font-file-as-ps-string
-                                  name bare-file-name))
+                                  name bare-file-name font-index))
                  (else
                   (ly:warning (_ "do not know how to embed font ~s ~s ~s")
                               name file-name font))))))
               (cond ((string? (ly:font-file-name font))
                      (list (list font
                                  (ly:font-name font)
-                                 (ly:font-file-name font))))
+                                 (ly:font-file-name font)
+                                 #f)))
                     ((ly:pango-font? font)
-                     (map (lambda (name-psname-pair)
+                     (map (lambda (psname-filename-fontindex)
                             (list #f
-                                  (car name-psname-pair)
-                                  (cdr name-psname-pair)))
+                                  (list-ref psname-filename-fontindex 0)
+                                  (list-ref psname-filename-fontindex 1)
+                                  (list-ref psname-filename-fontindex 2)))
                           (ly:pango-font-physical-fonts font)))
                     (else
                      (ly:font-sub-fonts font))))