* src/sfnt/sfobjs.c (tt_face_get_name): Modified to return an error

code so that memory allocation problems can be distinguished from
missing table entries.  Reported by Graham Asher.
(GET_NAME): New macro.
(sfnt_load_face): Use it.
This commit is contained in:
Werner Lemberg 2008-11-08 07:20:25 +00:00
parent c321b9b063
commit 9512092859
3 changed files with 46 additions and 35 deletions

View File

@ -1,3 +1,11 @@
2008-11-08 Werner Lemberg <wl@gnu.org>
* src/sfnt/sfobjs.c (tt_face_get_name): Modified to return an error
code so that memory allocation problems can be distinguished from
missing table entries. Reported by Graham Asher.
(GET_NAME): New macro.
(sfnt_load_face): Use it.
2008-11-05 Werner Lemberg <wl@gnu.org>
* devel/ftoption.h, include/freetype/config/ftoption.h

View File

@ -123,14 +123,20 @@
/* */
/* nameid :: The name id of the name record to return. */
/* */
/* <Return> */
/* Character string. NULL if no name is present. */
/* <InOut> */
/* name :: The address of a string pointer. NULL if no name is */
/* present. */
/* */
static FT_String*
tt_face_get_name( TT_Face face,
FT_UShort nameid )
/* <Return> */
/* FreeType error code. 0 means success. */
/* */
static FT_Error
tt_face_get_name( TT_Face face,
FT_UShort nameid,
FT_String** name )
{
FT_Memory memory = face->root.memory;
FT_Error error = SFNT_Err_Ok;
FT_String* result = NULL;
FT_UShort n;
TT_NameEntryRec* rec;
@ -145,6 +151,8 @@
TT_NameEntry_ConvertFunc convert;
FT_ASSERT( name );
rec = face->name_table.names;
for ( n = 0; n < face->num_names; n++, rec++ )
{
@ -256,11 +264,8 @@
{
if ( rec->string == NULL )
{
FT_Error error = SFNT_Err_Ok;
FT_Stream stream = face->name_table.stream;
FT_UNUSED( error );
if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||
FT_STREAM_SEEK( rec->stringOffset ) ||
@ -277,7 +282,8 @@
}
Exit:
return result;
*name = result;
return error;
}
@ -499,6 +505,13 @@
FT_TRACE3(( "\n" )); \
} while ( 0 )
#define GET_NAME( id, field ) \
do { \
error = tt_face_get_name( face, TT_NAME_ID_##id, field ); \
if ( error ) \
goto Exit; \
} while ( 0 )
FT_LOCAL_DEF( FT_Error )
sfnt_load_face( FT_Stream stream,
@ -699,8 +712,6 @@
LOAD_( gasp );
LOAD_( kern );
error = SFNT_Err_Ok;
face->root.num_glyphs = face->max_profile.numGlyphs;
#if 0
@ -713,17 +724,13 @@
if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 )
#endif
{
face->root.family_name =
tt_face_get_name( face, TT_NAME_ID_PREFERRED_FAMILY );
GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
if ( !face->root.family_name )
face->root.family_name =
tt_face_get_name( face, TT_NAME_ID_FONT_FAMILY );
GET_NAME( FONT_FAMILY, &face->root.family_name );
face->root.style_name =
tt_face_get_name( face, TT_NAME_ID_PREFERRED_SUBFAMILY );
GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
if ( !face->root.style_name )
face->root.style_name =
tt_face_get_name( face, TT_NAME_ID_FONT_SUBFAMILY );
GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
}
#if 0
else
@ -732,23 +739,17 @@
/* subfamily) is still under consideration by Microsoft and */
/* not implemented in the current version of WPF. */
face->root.family_name =
tt_face_get_name( face, TT_NAME_ID_WWS_FAMILY );
GET_NAME( WWS_FAMILY, &face->root.family_name );
if ( !face->root.family_name )
face->root.family_name =
tt_face_get_name( face, TT_NAME_ID_PREFERRED_FAMILY );
GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
if ( !face->root.family_name )
face->root.family_name =
tt_face_get_name( face, TT_NAME_ID_FONT_FAMILY );
GET_NAME( FONT_FAMILY, &face->root.family_name );
face->root.style_name =
tt_face_get_name( face, TT_NAME_ID_WWS_SUBFAMILY );
GET_NAME( WWS_SUBFAMILY, &face->root.style_name );
if ( !face->root.style_name )
face->root.style_name =
tt_face_get_name( face, TT_NAME_ID_PREFERRED_SUBFAMILY );
GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
if ( !face->root.style_name )
face->root.style_name =
tt_face_get_name( face, TT_NAME_ID_FONT_SUBFAMILY );
GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
}
#endif
@ -1032,6 +1033,7 @@
#undef LOAD_
#undef LOADM_
#undef GET_NAME
FT_LOCAL_DEF( void )

View File

@ -416,13 +416,14 @@
/* tt_face_get_ps_name */
/* */
/* <Description> */
/* Gets the PostScript glyph name of a glyph. */
/* Get the PostScript glyph name of a glyph. */
/* */
/* <Input> */
/* face :: A handle to the parent face. */
/* */
/* idx :: The glyph index. */
/* */
/* <InOut> */
/* PSname :: The address of a string pointer. Will be NULL in case */
/* of error, otherwise it is a pointer to the glyph name. */
/* */
@ -436,9 +437,9 @@
FT_UInt idx,
FT_String** PSname )
{
FT_Error error;
TT_Post_Names names;
FT_Fixed format;
FT_Error error;
TT_Post_Names names;
FT_Fixed format;
#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
FT_Service_PsCMaps psnames;