[HarfBuzz] hb_ft_get_glyph_from_name fails for the name of glyph id 0
Jonathan Kew
jfkthame at googlemail.com
Thu Jul 11 11:50:06 PDT 2013
I've run into a small issue with hb_ft_get_glyph_from_name: when passed
the name of glyph 0 (often, but not always, ".notdef"), although it will
(correctly) find the glyph ID and set its glyph outparam appropriately,
it will then return false (which normally indicates that a glyph with
the given name was NOT found).
This causes a problem when using hb_buffer_deserialize_glyphs if the
buffer that was serialized included any instances of glyph 0, and the
serialization used glyph names (rather than numeric IDs), as is the
default behavior. In this case, deserialization stops when the .notdef
glyph is encountered, resulting in a truncated buffer.
As FT_Get_Name_Index doesn't seem to provide any direct means for a
caller to distinguish the case of the .notdef glyph's name from an
unknown glyph name, I suggest the attached patch. OK, so it's not
pretty, but it should resolve the problem.
JK
-------------- next part --------------
diff --git a/src/hb-ft.cc b/src/hb-ft.cc
index d63eba2..0c83bee 100644
--- a/src/hb-ft.cc
+++ b/src/hb-ft.cc
@@ -260,6 +260,16 @@ hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED,
*glyph = FT_Get_Name_Index (ft_face, buf);
}
+ if (*glyph == 0) {
+ /* Check whether the given name was actually the name of the .notdef glyph. */
+ char buf[128];
+ if (!FT_Get_Glyph_Name(ft_face, 0, buf, sizeof (buf)) &&
+ ((len < 0 && !strcmp (buf, name)) ||
+ (len >= 0 && !strncmp (buf, name, len)))) {
+ return true;
+ }
+ }
+
return *glyph != 0;
}
More information about the HarfBuzz
mailing list