@ -220,114 +220,134 @@
*
*/
/* handling of PID/EID 3/0 and 3/1 is the same */
# define IS_WIN( n ) ( (n)->platformID == 3 && \
( ( n ) - > encodingID = = 1 | | ( n ) - > encodingID = = 0 ) & & \
( n ) - > languageID = = 0x409 )
# define IS_APPLE( n ) ( (n)->platformID == 1 && \
( n ) - > encodingID = = 0 & & \
( n ) - > languageID = = 0 )
static const char *
sfnt_get_ps_name ( TT_Face face )
get_win_string ( FT_Memory memory ,
FT_Stream stream ,
TT_Name entry )
{
FT_Int n , found_win , found_apple ;
const char * result = NULL ;
FT_Error error = FT_Err_Ok ;
const char * result ;
FT_String * r ;
FT_Char * p ;
FT_UInt len ;
/* shouldn't happen, but just in case to avoid memory leaks */
if ( face - > postscript_name )
return face - > postscript_name ;
FT_UNUSED ( error ) ;
/* scan the name table to see whether we have a Postscript name here, */
/* either in Macintosh or Windows platform encodings */
found_win = - 1 ;
found_apple = - 1 ;
for ( n = 0 ; n < face - > num_names ; n + + )
if ( FT_ALLOC ( result , entry - > stringLength / 2 + 1 ) )
return NULL ;
if ( FT_STREAM_SEEK ( entry - > stringOffset ) | |
FT_FRAME_ENTER ( entry - > stringLength ) )
{
TT_Name name = face - > name_table . names + n ;
FT_FREE ( result ) ;
entry - > stringLength = 0 ;
entry - > stringOffset = 0 ;
FT_FREE ( entry - > string ) ;
return NULL ;
}
if ( name - > nameID = = 6 & & name - > stringLength > 0 )
{
/* handling of PID/EID 3/0 and 3/1 is the same */
if ( name - > platformID = = 3 & &
( name - > encodingID = = 1 | | name - > encodingID = = 0 ) & &
name - > languageID = = 0x409 )
found_win = n ;
r = ( FT_String * ) result ;
p = ( FT_Char * ) stream - > cursor ;
if ( name - > platformID = = 1 & &
name - > encodingID = = 0 & &
name - > languageID = = 0 )
found_apple = n ;
}
for ( len = entry - > stringLength / 2 ; len > 0 ; len - - , p + = 2 )
{
if ( p [ 0 ] = = 0 & & p [ 1 ] > = 32 )
* r + + = p [ 1 ] ;
}
* r = ' \0 ' ;
if ( found_win ! = - 1 )
{
FT_Memory memory = face - > root . memory ;
TT_Name name = face - > name_table . names + found_win ;
FT_UInt len = name - > stringLength / 2 ;
FT_Error error = FT_Err_Ok ;
FT_FRAME_EXIT ( ) ;
FT_UNUSED ( error ) ;
return result ;
}
if ( ! FT_ALLOC ( result , name - > stringLength + 1 ) )
{
FT_Stream stream = face - > name_table . stream ;
FT_String * r = ( FT_String * ) result ;
FT_Char * p ;
static const char *
get_apple_string ( FT_Memory memory ,
FT_Stream stream ,
TT_Name entry )
{
FT_Error error = FT_Err_Ok ;
const char * result ;
if ( FT_STREAM_SEEK ( name - > stringOffset ) | |
FT_FRAME_ENTER ( name - > stringLength ) )
{
FT_FREE ( result ) ;
name - > stringLength = 0 ;
name - > stringOffset = 0 ;
FT_FREE ( name - > string ) ;
FT_UNUSED ( error ) ;
goto Exit ;
}
p = ( FT_Char * ) stream - > cursor ;
if ( FT_ALLOC ( result , entry - > stringLength + 1 ) )
return NULL ;
for ( ; len > 0 ; len - - , p + = 2 )
{
if ( p [ 0 ] = = 0 & & p [ 1 ] > = 32 )
* r + + = p [ 1 ] ;
}
* r = ' \0 ' ;
if ( FT_STREAM_SEEK ( entry - > stringOffset ) | |
FT_STREAM_READ ( result , entry - > stringLength ) )
{
FT_FREE ( result ) ;
entry - > stringOffset = 0 ;
entry - > stringLength = 0 ;
FT_FREE ( entry - > string ) ;
FT_FRAME_EXIT ( ) ;
}
goto Exit ;
return NULL ;
}
if ( found_apple ! = - 1 )
{
FT_Memory memory = face - > root . memory ;
TT_Name name = face - > name_table . names + found_apple ;
FT_UInt len = name - > stringLength ;
FT_Error error = FT_Err_Ok ;
( ( char * ) result ) [ entry - > stringLength ] = ' \0 ' ;
FT_UNUSED ( error ) ;
return result ;
}
if ( ! FT_ALLOC ( result , len + 1 ) )
{
FT_Stream stream = face - > name_table . stream ;
static const char *
sfnt_get_ps_name ( TT_Face face )
{
FT_Int n , found_win , found_apple ;
const char * result = NULL ;
if ( FT_STREAM_SEEK ( name - > stringOffset ) | |
FT_STREAM_READ ( result , len ) )
{
name - > stringOffset = 0 ;
name - > stringLength = 0 ;
FT_FREE ( name - > string ) ;
FT_FREE ( result ) ;
goto Exit ;
}
( ( char * ) result ) [ len ] = ' \0 ' ;
if ( face - > postscript_name )
return face - > postscript_name ;
/* scan the name table to see whether we have a Postscript name here, */
/* either in Macintosh or Windows platform encodings */
found_win = - 1 ;
found_apple = - 1 ;
for ( n = 0 ; n < face - > num_names ; n + + )
{
TT_Name name = face - > name_table . names + n ;
if ( name - > nameID = = 6 & & name - > stringLength > 0 )
{
if ( IS_WIN ( name ) )
found_win = n ;
if ( IS_APPLE ( name ) )
found_apple = n ;
}
}
Exit :
/* prefer Windows entries over Apple */
if ( found_win ! = - 1 )
result = get_win_string ( face - > root . memory ,
face - > name_table . stream ,
face - > name_table . names + found_win ) ;
else if ( found_apple ! = - 1 )
result = get_apple_string ( face - > root . memory ,
face - > name_table . stream ,
face - > name_table . names + found_apple ) ;
face - > postscript_name = result ;
return result ;
}