get_unicode_name (char*s, FT_ULong code)
{
if (code > 0xFFFF)
- sprintf (s, "u%06lX", char_code);
+ sprintf (s, "u%lX", code);
else
- sprintf (s, "uni%04lX", char_code);
+ sprintf (s, "uni%04lX", code);
}
b.scale (scale_);
char const *ps_name_str0 = FT_Get_Postscript_Name (ftface);
FcPattern *fcpat = fcfont->font_pattern;
- char *file_name_as_ptr = 0;
- FcPatternGetString (fcpat, FC_FILE, 0, (FcChar8 **) & file_name_as_ptr);
+ FcChar8 *file_name_as_ptr = 0;
+ FcPatternGetString (fcpat, FC_FILE, 0, &file_name_as_ptr);
string file_name;
if (file_name_as_ptr)
{
/* Normalize file name. */
- file_name = File_name (file_name_as_ptr).to_string ();
+ file_name = File_name ((char const *)file_name_as_ptr).to_string ();
}
SCM glyph_exprs = SCM_EOL;
SCM *tail = &glyph_exprs;
Index_to_charcode_map const *cmap = 0;
- if (! (ftface->face_flags & FT_FACE_FLAG_GLYPH_NAMES))
+ bool has_glyph_names = ftface->face_flags & FT_FACE_FLAG_GLYPH_NAMES;
+ if (! has_glyph_names)
cmap = ((Pango_font*)this)->get_index_to_charcode_map (file_name, ftface);
bool cid_keyed = false;
PangoGlyph pg = pgi->glyph;
PangoGlyphGeometry ggeo = pgi->geometry;
- FT_Get_Glyph_Name (ftface, pg, glyph_name, GLYPH_NAME_LEN);
+ glyph_name[0] = '\0';
+ if (has_glyph_names)
+ {
+ int errorcode = FT_Get_Glyph_Name (ftface, pg, glyph_name, GLYPH_NAME_LEN);
+ if (errorcode)
+ programming_error ("FT_Get_Glyph_Name returns error");
+ }
+
+ SCM char_id = SCM_EOL;
+ if (glyph_name[0] == '\0'
+ && cmap
- SCM char_id;
- if (glyph_name[0] == '\0' && cmap)
+ /* Ugh should ask FreeType about font type. */
+ && (file_name.find (".ttf") != NPOS
+ || file_name.find (".TTF") != NPOS))
{
FT_ULong char_code = cmap->find (pg)->second;
get_unicode_name (glyph_name, char_code);
}
-
-
+
+ if (glyph_name[0] == '\0' && has_glyph_names)
+ {
+ programming_error ("Glyph has no name, but font supports glyph naming. Skipping glyph: "
+ + description_string ());
+ continue;
+ }
+
if (glyph_name[0] == '\0')
{
/*
CID entry
*/
cid_keyed = true;
- char_id = scm_from_int (pg);
+ char_id = scm_from_uint32 (pg);
}
else
char_id = scm_makfrom0str (glyph_name);
/*
For Pango based backends, we take a shortcut.
*/
- char *descr_string = pango_font_description_to_string (pango_description_);
SCM exp
= scm_list_3 (ly_symbol2scm ("utf-8-string"),
- scm_makfrom0str (descr_string),
+ scm_makfrom0str (description_string ().c_str ()),
scm_makfrom0str (str.c_str ()));
- g_free (descr_string);
-
Box b (Interval (0, 0), Interval (0, 0));
b.unite (dest.extent_box ());
return Stencil (b, exp);
return dest;
}
+string
+Pango_font::description_string () const
+{
+ char *descr_string = pango_font_description_to_string (pango_description_);
+ string s (descr_string);
+ g_free (descr_string);
+ return s;
+}
+
+
SCM
Pango_font::font_file_name () const
{