diff --git a/ChangeLog b/ChangeLog index 839023a52..b3592bb1c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2016-05-30 Werner Lemberg + + [type42] Support `CharStrings' entry format as created by LilyPond. + + * src/type42/t42parse.c (t42_parse_charstrings): Handle entries + having the format + + (foo) cvn 12345 def + 2016-05-28 Werner Lemberg * src/autofit/afranges.c: Remove `UL' postfix from hex numbers. diff --git a/src/type42/t42parse.c b/src/type42/t42parse.c index cf9009bb7..f948916af 100644 --- a/src/type42/t42parse.c +++ b/src/type42/t42parse.c @@ -899,8 +899,13 @@ for (;;) { - /* The format is simple: */ - /* `/glyphname' + index [+ def] */ + /* We support two formats. */ + /* */ + /* `/glyphname' + index [+ `def'] */ + /* `(glyphname)' [+ `cvn'] + index [+ `def'] */ + /* */ + /* The latter format gets created by the */ + /* LilyPond typesetting program. */ T1_Skip_Spaces( parser ); @@ -928,12 +933,13 @@ if ( parser->root.error ) return; - if ( *cur == '/' ) + if ( *cur == '/' || *cur == '(' ) { FT_UInt len; + FT_Bool have_literal = ( *cur == '(' ); - if ( cur + 2 >= limit ) + if ( cur + ( have_literal ? 3 : 2 ) >= limit ) { FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); error = FT_THROW( Invalid_File_Format ); @@ -942,6 +948,8 @@ cur++; /* skip `/' */ len = (FT_UInt)( parser->root.cursor - cur ); + if ( have_literal ) + len--; error = T1_Add_Table( name_table, n, cur, len + 1 ); if ( error ) @@ -961,6 +969,9 @@ T1_Skip_Spaces( parser ); + if ( have_literal ) + T1_Skip_PS_Token( parser ); + cur = parser->root.cursor; (void)T1_ToInt( parser );