[sfnt] Consolidate POST version 2.0 and 2.5 (pt 2).

* src/sfnt/ttpost.c (load_format_20, load_format_25): Update arguments
and move shared calls and checks upstream to...
(load_post_names): ... this function.
(tt_face_free_ps_names, tt_face_get_ps_name): Updated.
This commit is contained in:
Alexei Podtelezhnikov 2023-04-01 23:37:51 -04:00
parent 9597a62bac
commit 8f7b145524
1 changed files with 62 additions and 108 deletions

View File

@ -156,64 +156,51 @@
static FT_Error static FT_Error
load_format_20( TT_Face face, load_format_20( TT_Post_Names names,
FT_Stream stream, FT_Stream stream,
FT_ULong post_len ) FT_UShort num_glyphs,
FT_ULong post_len )
{ {
FT_Memory memory = stream->memory; FT_Memory memory = stream->memory;
FT_Error error; FT_Error error;
FT_UShort num_glyphs; FT_UShort n;
FT_UShort num_names = 0; FT_UShort num_names = 0;
FT_UShort* glyph_indices = NULL; FT_UShort* glyph_indices = NULL;
FT_Byte** name_strings = NULL; FT_Byte** name_strings = NULL;
if ( FT_READ_USHORT( num_glyphs ) ) if ( (FT_ULong)num_glyphs * 2 > post_len )
goto Exit;
/* UNDOCUMENTED! The number of glyphs in this table can be smaller */
/* than the value in the maxp table (cf. cyberbit.ttf). */
/* There already exist fonts which have more than 32768 glyph names */
/* in this table, so the test for this threshold has been dropped. */
if ( num_glyphs > face->max_profile.numGlyphs ||
(FT_ULong)num_glyphs * 2 > post_len )
{ {
error = FT_THROW( Invalid_File_Format ); error = FT_THROW( Invalid_File_Format );
goto Exit; goto Exit;
} }
/* load the indices and note their maximum */ /* load the indices and note their maximum */
if ( FT_QNEW_ARRAY( glyph_indices, num_glyphs ) ||
FT_FRAME_ENTER( num_glyphs * 2 ) )
goto Fail;
for ( n = 0; n < num_glyphs; n++ )
{ {
FT_UShort n; FT_UShort idx = FT_GET_USHORT();
FT_UShort idx;
if ( FT_QNEW_ARRAY( glyph_indices, num_glyphs ) || if ( idx > num_names )
FT_FRAME_ENTER( num_glyphs * 2 ) ) num_names = idx;
goto Fail;
for ( n = 0; n < num_glyphs; n++ ) glyph_indices[n] = idx;
{
glyph_indices[n] = idx = FT_GET_USHORT();
if ( idx > num_names )
num_names = idx;
}
FT_FRAME_EXIT();
} }
FT_FRAME_EXIT();
/* compute number of names stored in table */ /* compute number of names stored in table */
num_names = num_names > 257 ? num_names - 257 : 0; num_names = num_names > 257 ? num_names - 257 : 0;
/* now load the name strings */ /* now load the name strings */
if ( num_names ) if ( num_names )
{ {
FT_UShort n;
FT_ULong p; FT_ULong p;
FT_Byte* strings; FT_Byte* strings;
@ -258,15 +245,11 @@
} }
/* all right, set table fields and exit successfully */ /* all right, set table fields and exit successfully */
{ names->num_glyphs = num_glyphs;
TT_Post_Names table = &face->postscript_names; names->num_names = num_names;
names->glyph_indices = glyph_indices;
names->glyph_names = name_strings;
table->num_glyphs = num_glyphs;
table->num_names = num_names;
table->glyph_indices = glyph_indices;
table->glyph_names = name_strings;
}
return FT_Err_Ok; return FT_Err_Ok;
Fail: Fail:
@ -279,24 +262,21 @@
static FT_Error static FT_Error
load_format_25( TT_Face face, load_format_25( TT_Post_Names names,
FT_Stream stream, FT_Stream stream,
FT_ULong post_len ) FT_UShort num_glyphs,
FT_ULong post_len )
{ {
FT_Memory memory = stream->memory; FT_Memory memory = stream->memory;
FT_Error error; FT_Error error;
FT_UShort n, num_glyphs; FT_UShort n;
FT_UShort* glyph_indices = NULL; FT_UShort* glyph_indices = NULL;
if ( FT_READ_USHORT( num_glyphs ) )
goto Exit;
/* check the number of glyphs, including the theoretical limit */ /* check the number of glyphs, including the theoretical limit */
if ( num_glyphs > face->max_profile.numGlyphs || if ( num_glyphs > post_len ||
num_glyphs > post_len || num_glyphs > 258 + 128 )
num_glyphs > 257 + 128 )
{ {
error = FT_THROW( Invalid_File_Format ); error = FT_THROW( Invalid_File_Format );
goto Exit; goto Exit;
@ -324,13 +304,8 @@
FT_FRAME_EXIT(); FT_FRAME_EXIT();
/* OK, set table fields and exit successfully */ /* OK, set table fields and exit successfully */
{ names->num_glyphs = num_glyphs;
TT_Post_Names table = &face->postscript_names; names->glyph_indices = glyph_indices;
table->num_glyphs = num_glyphs;
table->glyph_indices = glyph_indices;
}
return FT_Err_Ok; return FT_Err_Ok;
@ -345,37 +320,37 @@
static FT_Error static FT_Error
load_post_names( TT_Face face ) load_post_names( TT_Face face )
{ {
FT_Stream stream; FT_Error error = FT_Err_Ok;
FT_Error error; FT_Stream stream = face->root.stream;
FT_Fixed format; FT_Fixed format = face->postscript.FormatType;
FT_ULong post_len; FT_ULong post_len;
FT_UShort num_glyphs;
/* get a stream for the face's resource */
stream = face->root.stream;
/* seek to the beginning of the PS names table */ /* seek to the beginning of the PS names table */
error = face->goto_table( face, TTAG_post, stream, &post_len ); error = face->goto_table( face, TTAG_post, stream, &post_len );
if ( error ) if ( error )
goto Exit; goto Exit;
format = face->postscript.FormatType; /* UNDOCUMENTED! The number of glyphs in this table can be smaller */
/* than the value in the maxp table (cf. cyberbit.ttf). */
/* go to beginning of subtable */ if ( post_len < 34 ||
if ( FT_STREAM_SKIP( 32 ) ) FT_STREAM_SKIP( 32 ) ||
FT_READ_USHORT( num_glyphs ) ||
num_glyphs > face->max_profile.numGlyphs ||
num_glyphs == 0 )
goto Exit; goto Exit;
/* now read postscript table */ /* now read postscript names data */
if ( format == 0x00020000L && post_len >= 34 ) if ( format == 0x00020000L )
error = load_format_20( face, stream, post_len - 34 ); error = load_format_20( &face->postscript_names, stream,
else if ( format == 0x00025000L && post_len >= 34 ) num_glyphs, post_len - 34 );
error = load_format_25( face, stream, post_len - 34 ); else if ( format == 0x00025000L )
else error = load_format_25( &face->postscript_names, stream,
error = FT_THROW( Invalid_File_Format ); num_glyphs, post_len - 34 );
face->postscript_names.loaded = 1;
Exit: Exit:
face->postscript_names.loaded = 1; /* even if failed */
return error; return error;
} }
@ -385,30 +360,20 @@
{ {
FT_Memory memory = face->root.memory; FT_Memory memory = face->root.memory;
TT_Post_Names names = &face->postscript_names; TT_Post_Names names = &face->postscript_names;
FT_Fixed format;
if ( names->loaded ) if ( names->num_glyphs )
{ {
format = face->postscript.FormatType; FT_FREE( names->glyph_indices );
names->num_glyphs = 0;
if ( format == 0x00020000L )
{
FT_FREE( names->glyph_indices );
names->num_glyphs = 0;
if ( names->num_names )
{
FT_FREE( names->glyph_names );
names->num_names = 0;
}
}
else if ( format == 0x00025000L )
{
FT_FREE( names->glyph_indices );
names->num_glyphs = 0;
}
} }
if ( names->num_names )
{
FT_FREE( names->glyph_names );
names->num_names = 0;
}
names->loaded = 0; names->loaded = 0;
} }
@ -476,7 +441,8 @@
if ( idx < 258 ) /* paranoid checking */ if ( idx < 258 ) /* paranoid checking */
*PSname = MAC_NAME( idx ); *PSname = MAC_NAME( idx );
} }
else if ( format == 0x00020000L ) else if ( format == 0x00020000L ||
format == 0x00025000L )
{ {
if ( !names->loaded ) if ( !names->loaded )
{ {
@ -492,22 +458,10 @@
if ( name_index < 258 ) if ( name_index < 258 )
*PSname = MAC_NAME( name_index ); *PSname = MAC_NAME( name_index );
else else /* only for version 2.0 */
*PSname = (FT_String*)names->glyph_names[name_index - 258]; *PSname = (FT_String*)names->glyph_names[name_index - 258];
} }
} }
else if ( format == 0x00025000L )
{
if ( !names->loaded )
{
error = load_post_names( face );
if ( error )
goto End;
}
if ( idx < (FT_UInt)names->num_glyphs ) /* paranoid checking */
*PSname = MAC_NAME( names->glyph_indices[idx] );
}
/* nothing to do for format == 0x00030000L */ /* nothing to do for format == 0x00030000L */