From: Werner Lemberg Date: Sat, 27 Dec 2008 08:42:03 +0000 (+0100) Subject: Make TTCs work. Fixes #710. X-Git-Tag: release/2.12.1-1~31 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=89b76c367754570218e76a116127225f89f41212;p=lilypond.git Make TTCs work. Fixes #710. 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'. --- diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc index 2deea75cda..96d8667c9d 100644 --- a/lily/all-font-metrics.cc +++ b/lily/all-font-metrics.cc @@ -8,6 +8,7 @@ #include "all-font-metrics.hh" +#include "string-convert.hh" #include "international.hh" #include "main.hh" #include "open-type-font.hh" @@ -17,13 +18,16 @@ 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]; } diff --git a/lily/font-config-scheme.cc b/lily/font-config-scheme.cc index ce4525467a..9de2cd112d 100644 --- a/lily/font-config-scheme.cc +++ b/lily/font-config-scheme.cc @@ -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], diff --git a/lily/include/all-font-metrics.hh b/lily/include/all-font-metrics.hh index 9c37a1a7d2..da1437bfac 100644 --- a/lily/include/all-font-metrics.hh +++ b/lily/include/all-font-metrics.hh @@ -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 (); diff --git a/lily/include/pango-font.hh b/lily/include/pango-font.hh index 93ac7c11f8..dc93324da8 100644 --- a/lily/include/pango-font.hh +++ b/lily/include/pango-font.hh @@ -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; diff --git a/lily/pango-font-scheme.cc b/lily/pango-font-scheme.cc index 955b4a8f16..2c6f13cc07 100644 --- a/lily/pango-font-scheme.cc +++ b/lily/pango-font-scheme.cc @@ -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 (unsmob_metrics (f)); diff --git a/lily/pango-font.cc b/lily/pango-font.cc index 138fd5cb00..f6456dd826 100644 --- a/lily/pango-font.cc +++ b/lily/pango-font.cc @@ -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"), diff --git a/scm/framework-ps.scm b/scm/framework-ps.scm index 25c14f6cc3..cfd72cf041 100644 --- a/scm/framework-ps.scm +++ b/scm/framework-ps.scm @@ -304,7 +304,7 @@ 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")) @@ -314,7 +314,7 @@ ((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 @@ -327,10 +327,11 @@ (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) @@ -340,7 +341,7 @@ 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)))))) @@ -355,12 +356,14 @@ (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))))