- char *filename = 0;
- 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;
+ 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 PostScript font name for font `%s'", file_name));
+
+ String ps_name;
+ if (!ps_name_str0
+ && 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 = 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 ('/');
+ 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 (file_name, ps_name);
+ pango_fc_font_unlock_face (fcfont);
+
+ 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);
+ }
+
+ warning (_ ("FreeType face has no PostScript font name"));
+ return Stencil ();