diff --git a/ChangeLog b/ChangeLog index d7e69519b..0e707674a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2015-08-08 Werner Lemberg + + [type42] Fix glyph access. + + This is a severe bug: We've missed one level of indirection, as + described in the Type 42 specification. As a result, ftview + sometimes showed incorrect glyphs for given glyph names, and even + displayed `error 0x0006' (invalid argument!) in case the number of + glyph indices differed between the Type 42 font and the embedded + TTF. + + Apparently, noone ever noticed it; this shows how much Type 42 fonts + are in use... + + * src/type42/t42objs.c (T42_GlyphSlot_Load): Map Type 42 glyph index + to embedded TTF's glyph index. + 2015-08-08 Werner Lemberg [type42] Minor clean-up. diff --git a/docs/CHANGES b/docs/CHANGES index 113fbdf1a..022e6b4e7 100644 --- a/docs/CHANGES +++ b/docs/CHANGES @@ -8,6 +8,10 @@ CHANGES BETWEEN 2.6 and 2.6.1 you are using CFFs; otherwise you get cropped glyphs with GUI interfaces like GTK or Qt. + - Accessing Type 42 fonts returned incorrect results if the glyph + order of the embedded TrueType font differs from the glyph order + of the Type 42 charstrings table. + II. IMPORTANT CHANGES @@ -30,6 +34,15 @@ CHANGES BETWEEN 2.6 and 2.6.1 don't need any change to the source code. + III. MISCELLANEOUS + + - The auto-hinter's Arabic script support has been enhanced. + + - The TrueType bytecode interpreter now runs slightly faster. + + - Improved support for builds with cmake. + + ====================================================================== CHANGES BETWEEN 2.5.5 and 2.6 diff --git a/src/type42/t42objs.c b/src/type42/t42objs.c index 2756adfee..01b271f8c 100644 --- a/src/type42/t42objs.c +++ b/src/type42/t42objs.c @@ -652,11 +652,16 @@ FT_Error error; T42_GlyphSlot t42slot = (T42_GlyphSlot)glyph; T42_Size t42size = (T42_Size)size; + T42_Face t42face = (T42_Face)size->face; FT_Driver_Class ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz; FT_TRACE1(( "T42_GlyphSlot_Load: glyph index %d\n", glyph_index )); + /* map T42 glyph index to embedded TTF's glyph index */ + glyph_index = (FT_UInt)ft_atol( + (const char *)t42face->type1.charstrings[glyph_index] ); + t42_glyphslot_clear( t42slot->ttslot ); error = ttclazz->load_glyph( t42slot->ttslot, t42size->ttsize,