summaryrefslogtreecommitdiff
path: root/src/sfnt/sfdriver.c
diff options
context:
space:
mode:
authorWerner Lemberg <wl@gnu.org>2017-02-23 22:58:14 +0100
committerWerner Lemberg <wl@gnu.org>2017-02-28 15:27:43 +0100
commitc1abd6aa4715db225a71ecbe006fd7dbedf82fcf (patch)
tree088eb145e34155cd8e326d478cc4bfdb67a523fb /src/sfnt/sfdriver.c
parent01f315f07697a719628cd56c80072da36d1182f7 (diff)
downloadfreetype2-c1abd6aa4715db225a71ecbe006fd7dbedf82fcf.tar.gz
[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.
Diffstat (limited to 'src/sfnt/sfdriver.c')
-rw-r--r--src/sfnt/sfdriver.c172
1 files changed, 96 insertions, 76 deletions
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;
}