From c1abd6aa4715db225a71ecbe006fd7dbedf82fcf Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Thu, 23 Feb 2017 22:58:14 +0100 Subject: [sfnt] Modularize `sfnt_get_ps_name'. * src/sfnt/sfdriver.c (sfnt_get_ps_name): Split off some functionality into... (IS_WIN, IS_APPLE): ... New macros. (get_win_string, get_apple_string): ... New functions. --- src/sfnt/sfdriver.c | 172 +++++++++++++++++++++++++++++----------------------- 1 file changed, 96 insertions(+), 76 deletions(-) (limited to 'src/sfnt/sfdriver.c') diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c index a70f9a2c7..a7bde1668 100644 --- a/src/sfnt/sfdriver.c +++ b/src/sfnt/sfdriver.c @@ -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; } -- cgit v1.2.1