📄 ttpost.c
字号:
}
Fail:
FT_FREE( name_strings );
FT_FREE( glyph_indices );
Exit:
return error;
}
static FT_Error
load_format_25( TT_Face face,
FT_Stream stream )
{
FT_Memory memory = stream->memory;
FT_Error error;
FT_Int num_glyphs;
FT_Char* offset_table = 0;
/* UNDOCUMENTED! This value appears only in the Apple TT specs. */
if ( FT_READ_USHORT( num_glyphs ) )
goto Exit;
/* check the number of glyphs */
if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 )
{
error = SFNT_Err_Invalid_File_Format;
goto Exit;
}
if ( FT_NEW_ARRAY( offset_table, num_glyphs ) ||
FT_STREAM_READ( offset_table, num_glyphs ) )
goto Fail;
/* now check the offset table */
{
FT_Int n;
for ( n = 0; n < num_glyphs; n++ )
{
FT_Long idx = (FT_Long)n + offset_table[n];
if ( idx < 0 || idx > num_glyphs )
{
error = SFNT_Err_Invalid_File_Format;
goto Fail;
}
}
}
/* OK, set table fields and exit successfuly */
{
TT_Post_25 table = &face->postscript_names.names.format_25;
table->num_glyphs = (FT_UShort)num_glyphs;
table->offsets = offset_table;
}
return SFNT_Err_Ok;
Fail:
FT_FREE( offset_table );
Exit:
return error;
}
static FT_Error
load_post_names( TT_Face face )
{
FT_Stream stream;
FT_Error error;
FT_Fixed format;
/* get a stream for the face's resource */
stream = face->root.stream;
/* seek to the beginning of the PS names table */
error = face->goto_table( face, TTAG_post, stream, 0 );
if ( error )
goto Exit;
format = face->postscript.FormatType;
/* go to beginning of subtable */
if ( FT_STREAM_SKIP( 32 ) )
goto Exit;
/* now read postscript table */
if ( format == 0x00020000L )
error = load_format_20( face, stream );
else if ( format == 0x00028000L )
error = load_format_25( face, stream );
else
error = SFNT_Err_Invalid_File_Format;
face->postscript_names.loaded = 1;
Exit:
return error;
}
FT_LOCAL_DEF( void )
tt_face_free_ps_names( TT_Face face )
{
FT_Memory memory = face->root.memory;
TT_Post_Names names = &face->postscript_names;
FT_Fixed format;
if ( names->loaded )
{
format = face->postscript.FormatType;
if ( format == 0x00020000L )
{
TT_Post_20 table = &names->names.format_20;
FT_UShort n;
FT_FREE( table->glyph_indices );
table->num_glyphs = 0;
for ( n = 0; n < table->num_names; n++ )
FT_FREE( table->glyph_names[n] );
FT_FREE( table->glyph_names );
table->num_names = 0;
}
else if ( format == 0x00028000L )
{
TT_Post_25 table = &names->names.format_25;
FT_FREE( table->offsets );
table->num_glyphs = 0;
}
}
names->loaded = 0;
}
/*************************************************************************/
/* */
/* <Function> */
/* tt_face_get_ps_name */
/* */
/* <Description> */
/* Gets the PostScript glyph name of a glyph. */
/* */
/* <Input> */
/* face :: A handle to the parent face. */
/* */
/* idx :: The glyph index. */
/* */
/* PSname :: The address of a string pointer. Will be NULL in case */
/* of error, otherwise it is a pointer to the glyph name. */
/* */
/* You must not modify the returned string! */
/* */
/* <Output> */
/* FreeType error code. 0 means success. */
/* */
FT_LOCAL_DEF( FT_Error )
tt_face_get_ps_name( TT_Face face,
FT_UInt idx,
FT_String** PSname )
{
FT_Error error;
TT_Post_Names names;
FT_Fixed format;
#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
FT_Service_PsCMaps psnames;
#endif
if ( !face )
return SFNT_Err_Invalid_Face_Handle;
if ( idx >= (FT_UInt)face->max_profile.numGlyphs )
return SFNT_Err_Invalid_Glyph_Index;
#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
psnames = (FT_Service_PsCMaps)face->psnames;
if ( !psnames )
return SFNT_Err_Unimplemented_Feature;
#endif
names = &face->postscript_names;
/* `.notdef' by default */
*PSname = MAC_NAME( 0 );
format = face->postscript.FormatType;
if ( format == 0x00010000L )
{
if ( idx < 258 ) /* paranoid checking */
*PSname = MAC_NAME( idx );
}
else if ( format == 0x00020000L )
{
TT_Post_20 table = &names->names.format_20;
if ( !names->loaded )
{
error = load_post_names( face );
if ( error )
goto End;
}
if ( idx < (FT_UInt)table->num_glyphs )
{
FT_UShort name_index = table->glyph_indices[idx];
if ( name_index < 258 )
*PSname = MAC_NAME( name_index );
else
*PSname = (FT_String*)table->glyph_names[name_index - 258];
}
}
else if ( format == 0x00028000L )
{
TT_Post_25 table = &names->names.format_25;
if ( !names->loaded )
{
error = load_post_names( face );
if ( error )
goto End;
}
if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */
{
idx += table->offsets[idx];
*PSname = MAC_NAME( idx );
}
}
/* nothing to do for format == 0x00030000L */
End:
return SFNT_Err_Ok;
}
/* END */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -