X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpango-font.cc;h=0a4fc747fa98fb0953a15f988210a4e45005583b;hb=b4d2043223a86826764bc531e684a864c97605fe;hp=0d7189378d221f69104e31cb61033ecd90ed5dd5;hpb=bdf4ab13203502e7ec7cf9cf5896527643a07c1f;p=lilypond.git diff --git a/lily/pango-font.cc b/lily/pango-font.cc index 0d7189378d..0a4fc747fa 100644 --- a/lily/pango-font.cc +++ b/lily/pango-font.cc @@ -7,13 +7,15 @@ */ #define PANGO_ENABLE_BACKEND // ugh, why necessary? - #include -#include "main.hh" -#include "lookup.hh" -#include "dimensions.hh" +/* Ugh. */ #include "pango-font.hh" + +#include "dimensions.hh" +#include "file-name.hh" +#include "lookup.hh" +#include "main.hh" #include "warn.hh" #if HAVE_PANGO_FT2 @@ -24,15 +26,16 @@ Pango_font::Pango_font (PangoFT2FontMap *fontmap, PangoFontDescription *description, Real output_scale) { + (void) fontmap; physical_font_tab_ = scm_c_make_hash_table (11); PangoDirection pango_dir = (dir == RIGHT) ? PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL; context_ = pango_ft2_get_context (PANGO_RESOLUTION, PANGO_RESOLUTION); + // context_ = pango_ft2_font_map_create_context (fontmap); pango_description_ = pango_font_description_copy (description); - // context_ = pango_ft2_font_map_create_context (fontmap); attribute_list_ = pango_attr_list_new (); /* @@ -98,9 +101,11 @@ Pango_font::pango_item_string_stencil (PangoItem *item, String str, Real dx) con PANGO_ASCENT (ink_rect))); b.scale (scale_); - + SCM glyph_exprs = SCM_EOL; SCM *tail = &glyph_exprs; + + bool cid_keyed = false; for (int i = 0; i < pgs->num_glyphs; i++) { PangoGlyphInfo *pgi = pgs->glyphs + i; @@ -109,9 +114,23 @@ Pango_font::pango_item_string_stencil (PangoItem *item, String str, Real dx) con PangoGlyphGeometry ggeo = pgi->geometry; FT_Get_Glyph_Name (ftface, pg, glyph_name, GLYPH_NAME_LEN); - *tail = scm_cons (scm_list_3 (scm_from_double (ggeo.x_offset * scale_ + dx), + + + SCM char_id; + if (glyph_name[0] == '\0') + { + /* + CID entry + */ + cid_keyed = true; + char_id = scm_from_int (pg); + } + else + char_id = scm_makfrom0str (glyph_name); + *tail = scm_cons (scm_list_3 (scm_from_double (ggeo.x_offset * scale_ + + dx), scm_from_double (ggeo.y_offset * scale_), - scm_makfrom0str (glyph_name)), + char_id), SCM_EOL); dx = 0.0; tail = SCM_CDRLOC (*tail); @@ -122,32 +141,34 @@ Pango_font::pango_item_string_stencil (PangoItem *item, String str, Real dx) con / (Real (PANGO_SCALE)); FcPattern *fcpat = fcfont->font_pattern; - char *filename = 0; - FcPatternGetString (fcpat, FC_FILE, 0, (FcChar8 **) & filename); + char *file_name = 0; + FcPatternGetString (fcpat, FC_FILE, 0, (FcChar8 **) & file_name); +#ifdef __MINGW32__ + /* Normalize file name. */ + // FIXME: memleak(s?), drop the #ifdef? + file_name = File_name (file_name).to_string ().get_copy_str0 (); +#endif + char const *ps_name_str0 = FT_Get_Postscript_Name (ftface); if (!ps_name_str0) - warning (_f ("No PS font name for font `%s'", filename)); + warning (_f ("no PostScript font name for font `%s'", file_name)); String ps_name; if (!ps_name_str0 - && filename - && (String (filename).index (".otf") >= 0 - || String (filename).index (".cff") >= 0)) + && file_name + && (String (file_name).index (".otf") >= 0 + || String (file_name).index (".cff") >= 0)) { - /* - UGH: kludge a PS name for OTF/CFF fonts. - - */ - - String name = filename; - int idx = String (filename).index (".otf") - >? String (filename).index (".cff"); + /* UGH: kludge a PS name for OTF/CFF fonts. */ + String name = file_name; + int idx = max (String (file_name).index (".otf"), + String (file_name).index (".cff")); name = name.left_string (idx); - int slash_idx = name.index_last ('/'); // UGh. What's happens on windows? + int slash_idx = name.index_last ('/'); if (slash_idx >= 0) name = name.right_string (name.length () - slash_idx - 1); @@ -162,21 +183,20 @@ Pango_font::pango_item_string_stencil (PangoItem *item, String str, Real dx) con if (ps_name.length ()) { - ((Pango_font *) this)->register_font_file (filename, ps_name); + ((Pango_font *) this)->register_font_file (file_name, ps_name); pango_fc_font_unlock_face (fcfont); - - SCM expr = scm_list_4 (ly_symbol2scm ("glyph-string"), + + SCM expr = scm_list_5 (ly_symbol2scm ("glyph-string"), scm_makfrom0str (ps_name.to_str0 ()), scm_from_double (size), + scm_from_bool (cid_keyed), ly_quote_scm (glyph_exprs)); return Stencil (b, expr); } - else - { - warning (_ ("FreeType face has no PostScript font name.")); - return Stencil (); - } + + warning (_ ("FreeType face has no PostScript font name")); + return Stencil (); } SCM @@ -221,7 +241,7 @@ Pango_font::text_stencil (String str) const */ char *descr_string = pango_font_description_to_string (pango_description_); SCM exp - = scm_list_3 (ly_symbol2scm ("utf8-string"), + = scm_list_3 (ly_symbol2scm ("utf-8-string"), scm_makfrom0str (descr_string), scm_makfrom0str (str.to_str0 ())); @@ -232,8 +252,7 @@ Pango_font::text_stencil (String str) const return Stencil (b, exp); } -#if 0 - // check extents. +#if 0 /* Check extents. */ if (!dest.extent_box ()[X_AXIS].is_empty ()) { Stencil frame = Lookup::frame (dest.extent_box (), 0.1, 0.1);