- FcPatternGetString(fcpat, FC_FILE, 0, (FcChar8 **) &filename);
- char const *ps_name = FT_Get_Postscript_Name (ftface);
- ((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),
- scm_from_double (size),
- ly_quote_scm (glyph_exprs));
-
- Stencil item_stencil (b, expr);
-
- return item_stencil;
+ FcPatternGetString (fcpat, FC_FILE, 0, (FcChar8 **) & filename);
+ char const *ps_name_str0 = FT_Get_Postscript_Name (ftface);
+
+ if (!ps_name_str0)
+ warning (_f ("no PostScript font name for font `%s'", filename));
+
+ String ps_name;
+ if (!ps_name_str0
+ && filename
+ && (String (filename).index (".otf") >= 0
+ || String (filename).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");
+
+ name = name.left_string (idx);
+
+ int slash_idx = name.index_last ('/'); // UGh. What's happens on windows?
+ if (slash_idx >= 0)
+ name = name.right_string (name.length () - slash_idx - 1);
+
+ String initial = name.cut_string (0, 1);
+ initial.to_upper ();
+ name = name.nomid_string (0, 1);
+ name.to_lower ();
+ ps_name = initial + name;
+ }
+ else if (ps_name_str0)
+ ps_name = ps_name_str0;
+
+ if (ps_name.length ())
+ {
+ ((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),
+ ly_quote_scm (glyph_exprs));
+
+ return Stencil (b, expr);
+ }
+ else
+ {
+ warning (_ ("FreeType face has no PostScript font name"));
+ return Stencil ();
+ }