[sfnt] Better PS name handling (#54629).

* src/sfnt/sfdriver (IS_WIN, IS_APPLE): Omit language ID checks.
(get_win_string, get_apple_string): Return NULL when the PostScript
font name characters is not according to specification.
(get_win_string): Make trace output work if the high byte if
non-zero.
(sfnt_get_var_ps_name, sfnt_get_ps_name): Previously we preferred
Win PS name (when there is also an Apple PS name); change this into
a fallback to Apple PS name in case the Win PS name is invalid.
This commit is contained in:
John Tytgat 2018-09-12 08:08:09 +02:00 committed by Werner Lemberg
parent 65681e6dc1
commit 6b53300b01
2 changed files with 54 additions and 44 deletions

View File

@ -1,3 +1,16 @@
2018-09-12 John Tytgat <John.Tytgat@esko.com>
[sfnt] Better PS name handling (#54629).
* src/sfnt/sfdriver (IS_WIN, IS_APPLE): Omit language ID checks.
(get_win_string, get_apple_string): Return NULL when the PostScript
font name characters is not according to specification.
(get_win_string): Make trace output work if the high byte if
non-zero.
(sfnt_get_var_ps_name, sfnt_get_ps_name): Previously we preferred
Win PS name (when there is also an Apple PS name); change this into
a fallback to Apple PS name in case the Win PS name is invalid.
2018-09-12 Werner Lemberg <wl@gnu.org>
[truetype] Improve VF check.

View File

@ -471,12 +471,10 @@
* (https://docs.microsoft.com/en-us/typography/opentype/spec/recom#name).
*/
#define IS_WIN( n ) ( (n)->platformID == 3 && \
( (n)->encodingID == 1 || (n)->encodingID == 0 ) && \
(n)->languageID == 0x409 )
( (n)->encodingID == 1 || (n)->encodingID == 0 ) )
#define IS_APPLE( n ) ( (n)->platformID == 1 && \
(n)->encodingID == 0 && \
(n)->languageID == 0 )
(n)->encodingID == 0 )
static char*
get_win_string( FT_Memory memory,
@ -500,42 +498,40 @@
if ( FT_STREAM_SEEK( entry->stringOffset ) ||
FT_FRAME_ENTER( entry->stringLength ) )
{
FT_FREE( result );
entry->stringLength = 0;
entry->stringOffset = 0;
FT_FREE( entry->string );
return NULL;
}
goto get_win_string_error;
r = (FT_String*)result;
p = (FT_Char*)stream->cursor;
for ( len = entry->stringLength / 2; len > 0; len--, p += 2 )
{
if ( p[0] == 0 )
if ( p[0] == 0 && char_type( p[1] ) )
*r++ = p[1];
else
{
if ( char_type( p[1] ) )
*r++ = p[1];
else
{
if ( report_invalid_characters )
{
FT_TRACE0(( "get_win_string:"
" Character `%c' (0x%X) invalid in PS name string\n",
p[1], p[1] ));
/* it's not the job of FreeType to correct PS names... */
*r++ = p[1];
}
}
if ( report_invalid_characters )
FT_TRACE0(( "get_win_string:"
" Character 0x%X invalid in PS name string\n",
((unsigned)p[0])*256 + (unsigned)p[1] ));
break;
}
}
*r = '\0';
if ( !len )
*r = '\0';
FT_FRAME_EXIT();
return result;
if ( !len )
return result;
get_win_string_error:
FT_FREE( result );
entry->stringLength = 0;
entry->stringOffset = 0;
FT_FREE( entry->string );
return NULL;
}
@ -561,14 +557,7 @@
if ( FT_STREAM_SEEK( entry->stringOffset ) ||
FT_FRAME_ENTER( entry->stringLength ) )
{
FT_FREE( result );
entry->stringOffset = 0;
entry->stringLength = 0;
FT_FREE( entry->string );
return NULL;
}
goto get_apple_string_error;
r = (FT_String*)result;
p = (FT_Char*)stream->cursor;
@ -580,20 +569,28 @@
else
{
if ( report_invalid_characters )
{
FT_TRACE0(( "get_apple_string:"
" Character `%c' (0x%X) invalid in PS name string\n",
*p, *p ));
/* it's not the job of FreeType to correct PS names... */
*r++ = *p;
}
break;
}
}
*r = '\0';
if ( !len )
*r = '\0';
FT_FRAME_EXIT();
return result;
if ( !len )
return result;
get_apple_string_error:
FT_FREE( result );
entry->stringOffset = 0;
entry->stringLength = 0;
FT_FREE( entry->string );
return NULL;
}
@ -837,7 +834,7 @@
face->name_table.names + win,
sfnt_is_alphanumeric,
0 );
else
if ( !result && apple != -1 )
result = get_apple_string( face->root.memory,
face->name_table.stream,
face->name_table.names + apple,
@ -1061,7 +1058,7 @@
face->name_table.names + win,
sfnt_is_postscript,
1 );
else
if ( !result && apple != -1 )
result = get_apple_string( face->root.memory,
face->name_table.stream,
face->name_table.names + apple,