diff --git a/ChangeLog b/ChangeLog index 5a0ccee85..abd3fe3b9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,51 @@ +2006-02-15 Chia-I Wu + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove + unused `max_points' and `max_contours'. + + * src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c + (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused + `max_components'. + + * src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused + `loadSize' and `loadStack'. + + * src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context), + src/sfnt/ttload.c (tt_face_load_maxp): Update. + + * src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c + (sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix + compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not + defined. + + * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix + possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions. + (finally!) + + For most OpenType tables, `tt_face_load_xxxx' simply loads the table + and `face->root' is set later in `sfnt_load_face'. Here, we try to + make this work for _all_ tables. + + * src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c, + src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and + then exit. Error handling or setting face->root is done later in + `sfnt_load_face'. + Pretty trace messages. + + * src/sfnt/sfobjs.c (sfnt_load_face): Work harder. + Mac bitmap-only fonts are not scalable. + Check that `face->header.Units_Per_EM' is not zero. + (LOAD_, LOADM_): Pretty trace messages. + + * src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from + `eblc'. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c + (load_format_20, load_format_25, tt_face_get_ps_name): Use + face->max_profile.numGlyphs, instead of face->root.num_glyphs. + 2006-02-14 Werner Lemberg * include/freetype/ftoutln.h (FT_Outline_Embolden): Mention in diff --git a/include/freetype/internal/ftobjs.h b/include/freetype/internal/ftobjs.h index f07e23d5b..4da978931 100644 --- a/include/freetype/internal/ftobjs.h +++ b/include/freetype/internal/ftobjs.h @@ -213,9 +213,6 @@ FT_BEGIN_HEADER /* */ typedef struct FT_Face_InternalRec_ { - FT_UShort max_points; - FT_Short max_contours; - FT_Matrix transform_matrix; FT_Vector transform_delta; FT_Int transform_flags; diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h index 3d951c799..4b6b88dd1 100644 --- a/include/freetype/internal/tttypes.h +++ b/include/freetype/internal/tttypes.h @@ -1102,10 +1102,6 @@ FT_BEGIN_HEADER /* table. We thus define additional fields */ /* below to hold the computed maxima. */ /* */ - /* max_components :: The maximum number of glyph components */ - /* required to load any composite glyph from */ - /* this font. Used to size the load stack. */ - /* */ /* vertical_info :: A boolean which is set when the font file */ /* contains vertical metrics. If not, the */ /* value of the `vertical' field is */ @@ -1277,7 +1273,6 @@ FT_BEGIN_HEADER #endif TT_MaxProfile max_profile; - FT_ULong max_components; FT_Bool vertical_info; TT_VertHeader vertical; /* TT Vertical header, if present */ diff --git a/src/cff/cffobjs.h b/src/cff/cffobjs.h index 33775205b..cc4ab644c 100644 --- a/src/cff/cffobjs.h +++ b/src/cff/cffobjs.h @@ -116,10 +116,14 @@ FT_BEGIN_HEADER cff_size_request( FT_Size size, FT_Size_Request req ); +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + FT_LOCAL( FT_Error ) cff_size_select( FT_Size size, FT_ULong index ); +#endif + FT_LOCAL( void ) cff_slot_done( FT_GlyphSlot slot ); diff --git a/src/cid/cidobjs.c b/src/cid/cidobjs.c index 16ddc47d8..7d318a359 100644 --- a/src/cid/cidobjs.c +++ b/src/cid/cidobjs.c @@ -429,9 +429,6 @@ cidface->underline_position = (FT_Short)info->underline_position; cidface->underline_thickness = (FT_Short)info->underline_thickness; - - cidface->internal->max_points = 0; - cidface->internal->max_contours = 0; } Exit: diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c index df142a541..829a57ed4 100644 --- a/src/sfnt/sfdriver.c +++ b/src/sfnt/sfdriver.c @@ -434,6 +434,7 @@ 0, 0, 0, + 0, #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c index 6c0b7fab8..b79685dcc 100644 --- a/src/sfnt/sfobjs.c +++ b/src/sfnt/sfobjs.c @@ -481,9 +481,36 @@ } -#undef LOAD_ -#define LOAD_( x ) ( ( error = sfnt->load_##x( face, stream ) ) \ - != SFNT_Err_Ok ) +#define LOAD_( x ) \ + do { \ + FT_TRACE2(( "`" #x "' " )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_##x( face, stream ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : ( error == SFNT_Err_Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define LOADM_( x, vertical ) \ + do { \ + FT_TRACE2(( "`%s" #x "' ", \ + vertical ? "vertical " : "" )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_##x( face, stream, vertical ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : ( error == SFNT_Err_Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) FT_LOCAL_DEF( FT_Error ) @@ -521,6 +548,8 @@ /* it doesn't contain outlines. */ /* */ + FT_TRACE2(( "sfnt_load_face: %08p\n\n", face )); + /* do we have outlines in there? */ #ifdef FT_CONFIG_OPTION_INCREMENTAL has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 || @@ -533,40 +562,50 @@ is_apple_sbit = 0; -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - /* if this font doesn't contain outlines, we try to load */ /* a `bhed' table */ - if ( !has_outline ) - is_apple_sbit = FT_BOOL( !LOAD_( bhed ) ); - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + if ( !has_outline && sfnt->load_bhed ) + { + LOAD_( bhed ); + is_apple_sbit = !error; + } /* load the font header (`head' table) if this isn't an Apple */ /* sbit font file */ - if ( !is_apple_sbit && LOAD_( head ) ) + if ( !is_apple_sbit ) + { + LOAD_( head ); + if ( error ) + goto Exit; + } + + if ( face->header.Units_Per_EM == 0 ) + { + error = SFNT_Err_Invalid_Table; + goto Exit; + } /* the following tables are often not present in embedded TrueType */ /* fonts within PDF documents, so don't check for them. */ - (void)LOAD_( maxp ); - (void)LOAD_( cmap ); + LOAD_( maxp ); + LOAD_( cmap ); /* the following tables are optional in PCL fonts -- */ /* don't check for errors */ - (void)LOAD_( name ); - psnames_error = LOAD_( post ); + LOAD_( name ); + LOAD_( post ); + psnames_error = error; /* do not load the metrics headers and tables if this is an Apple */ /* sbit font file */ if ( !is_apple_sbit ) { /* load the `hhea' and `hmtx' tables */ - error = sfnt->load_hhea( face, stream, 0 ); + LOADM_( hhea, 0 ); if ( !error ) { - error = sfnt->load_hmtx( face, stream, 0 ); - + LOADM_( hmtx, 0 ); if ( error == SFNT_Err_Table_Missing ) { error = SFNT_Err_Hmtx_Table_Missing; @@ -590,6 +629,7 @@ if ( face->format_tag == TTAG_true ) { FT_TRACE2(( "This is an SFNT Mac font.\n" )); + has_outline = 0; error = SFNT_Err_Ok; } else @@ -600,10 +640,10 @@ goto Exit; /* try to load the `vhea' and `vmtx' tables */ - error = sfnt->load_hhea( face, stream, 1 ); + LOADM_( hhea, 1 ); if ( !error ) { - error = sfnt->load_hmtx( face, stream, 1 ); + LOADM_( hmtx, 1 ); if ( !error ) face->vertical_info = 1; } @@ -611,35 +651,50 @@ if ( error && error != SFNT_Err_Table_Missing ) goto Exit; - if ( LOAD_( os2 ) ) - goto Exit; + LOAD_( os2 ); + if ( error ) + { + if ( error != SFNT_Err_Table_Missing ) + goto Exit; + + face->os2.version = 0xFFFFU; + } + } /* the optional tables */ -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - /* embedded bitmap support. */ - if ( sfnt->load_eblc && LOAD_( eblc ) ) + if ( sfnt->load_eblc ) { - /* return an error if this font file has no outlines */ - if ( error == SFNT_Err_Table_Missing && has_outline ) - error = SFNT_Err_Ok; - else - goto Exit; + LOAD_( eblc ); + if ( error ) + { + /* return an error if this font file has no outlines */ + if ( error == SFNT_Err_Table_Missing && has_outline ) + error = SFNT_Err_Ok; + else + goto Exit; + } } -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + LOAD_( pclt ); + if ( error ) + { + if ( error != SFNT_Err_Table_Missing ) + goto Exit; - if ( LOAD_( pclt ) ) - goto Exit; + face->pclt.Version = 0; + } /* consider the kerning and gasp tables as optional */ - (void)LOAD_( gasp ); - (void)LOAD_( kern ); + LOAD_( gasp ); + LOAD_( kern ); error = SFNT_Err_Ok; + face->root.num_glyphs = face->max_profile.numGlyphs; + face->root.family_name = tt_face_get_name( face, TT_NAME_ID_PREFERRED_FAMILY ); if ( !face->root.family_name ) @@ -847,18 +902,80 @@ root->underline_position = face->postscript.underlinePosition; root->underline_thickness = face->postscript.underlineThickness; - - /* root->max_points -- already set up */ - /* root->max_contours -- already set up */ } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* + * Now allocate the root array of FT_Bitmap_Size records and + * populate them. Unfortunately, it isn't possible to indicate bit + * depths in the FT_Bitmap_Size record. This is a design error. + */ + { + FT_UInt i, count; + + +#ifdef FT_OPTIMIZE_MEMORY + count = face->sbit_num_strikes; +#else + count = (FT_UInt)face->num_sbit_strikes; +#endif + + if ( count > 0 ) + { + FT_Memory memory = face->root.stream->memory; + FT_UShort em_size = face->header.Units_Per_EM; + FT_Short avgwidth = face->os2.xAvgCharWidth; + FT_Size_Metrics metrics; + + + if ( em_size == 0 || face->os2.version == 0xFFFFU ) + { + avgwidth = 0; + em_size = 1; + } + + if ( FT_NEW_ARRAY( root->available_sizes, count ) ) + goto Exit; + + for ( i = 0; i < count; i++ ) + { + FT_Bitmap_Size* bsize = root->available_sizes + i; + + + error = sfnt->load_strike_metrics( face, i, &metrics ); + if ( error ) + goto Exit; + + bsize->height = metrics.height >> 6; + bsize->width = (FT_Short)( + ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); + + bsize->x_ppem = metrics.x_ppem << 6; + bsize->y_ppem = metrics.y_ppem << 6; + + /* assume 72dpi */ + bsize->size = metrics.y_ppem << 6; + } + + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + root->num_fixed_sizes = (FT_Int)count; + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + } Exit: + FT_TRACE2(( "sfnt_load_face: done\n" )); + return error; } #undef LOAD_ +#undef LOADM_ FT_LOCAL_DEF( void ) diff --git a/src/sfnt/ttcmap.c b/src/sfnt/ttcmap.c index 9deb48388..6f087947d 100644 --- a/src/sfnt/ttcmap.c +++ b/src/sfnt/ttcmap.c @@ -2291,7 +2291,7 @@ ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit, FT_VALIDATE_DEFAULT ); - valid.num_glyphs = (FT_UInt)face->root.num_glyphs; + valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs; if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer ) == 0 ) { diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c index db0e6bba0..c81f80d5e 100644 --- a/src/sfnt/ttload.c +++ b/src/sfnt/ttload.c @@ -60,7 +60,7 @@ TT_Table limit; - FT_TRACE3(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", + FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", face, (FT_Char)( tag >> 24 ), (FT_Char)( tag >> 16 ), @@ -76,12 +76,12 @@ /* tables the same as missing tables. */ if ( entry->Tag == tag && entry->Length != 0 ) { - FT_TRACE3(( "found table.\n" )); + FT_TRACE4(( "found table.\n" )); return entry; } } - FT_TRACE3(( "could not find table!\n" )); + FT_TRACE4(( "could not find table!\n" )); return 0; } @@ -493,29 +493,17 @@ }; - FT_TRACE2(( "tt_face_load_generic_header: " - "%08p, looking up font table `%c%c%c%c'.\n", - face, - (FT_Char)( tag >> 24 ), - (FT_Char)( tag >> 16 ), - (FT_Char)( tag >> 8 ), - (FT_Char)( tag ) )); - error = face->goto_table( face, tag, stream, 0 ); if ( error ) - { - FT_TRACE2(( "tt_face_load_generic_header: Font table is missing!\n" )); goto Exit; - } header = &face->header; if ( FT_STREAM_READ_FIELDS( header_fields, header ) ) goto Exit; - FT_TRACE2(( " Units per EM: %8u\n", header->Units_Per_EM )); - FT_TRACE2(( " IndexToLoc: %8d\n", header->Index_To_Loc_Format )); - FT_TRACE2(( "tt_face_load_generic_header: Font table loaded.\n" )); + FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM )); + FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format )); Exit: return error; @@ -596,8 +584,6 @@ }; - FT_TRACE2(( "Load_TT_MaxProfile: %08p\n", face )); - error = face->goto_table( face, TTAG_maxp, stream, 0 ); if ( error ) goto Exit; @@ -605,8 +591,6 @@ if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) ) goto Exit; - face->root.num_glyphs = maxProfile->numGlyphs; - maxProfile->maxPoints = 0; maxProfile->maxContours = 0; maxProfile->maxCompositePoints = 0; @@ -634,30 +618,9 @@ if ( maxProfile->maxFunctionDefs == 0 ) maxProfile->maxFunctionDefs = 64; - - face->root.internal->max_points = - (FT_UShort)FT_MAX( maxProfile->maxCompositePoints, - maxProfile->maxPoints ); - - face->root.internal->max_contours = - (FT_Short)FT_MAX( maxProfile->maxCompositeContours, - maxProfile->maxContours ); - - face->max_components = (FT_ULong)maxProfile->maxComponentElements + - maxProfile->maxComponentDepth; - - /* XXX: some fonts have maxComponents set to 0; we will */ - /* then use 16 of them by default. */ - if ( face->max_components == 0 ) - face->max_components = 16; - - /* We also increase maxPoints and maxContours in order to support */ - /* some broken fonts. */ - face->root.internal->max_points += (FT_UShort)8; - face->root.internal->max_contours += (FT_Short) 4; } - FT_TRACE2(( "MAXP loaded.\n" )); + FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs )); Exit: return error; @@ -722,16 +685,9 @@ table = &face->name_table; table->stream = stream; - FT_TRACE2(( "Names " )); - error = face->goto_table( face, TTAG_name, stream, &table_len ); if ( error ) - { - /* The name table is required so indicate failure. */ - FT_TRACE2(( "is missing!\n" )); - error = SFNT_Err_Name_Table_Missing; goto Exit; - } table_pos = FT_STREAM_POS(); @@ -751,7 +707,7 @@ if ( storage_start > storage_limit ) { - FT_ERROR(( "tt_face_load_names: invalid `name' table\n" )); + FT_ERROR(( "invalid `name' table\n" )); error = SFNT_Err_Name_Table_Missing; goto Exit; } @@ -798,8 +754,6 @@ FT_FRAME_EXIT(); - FT_TRACE2(( "loaded\n" )); - /* everything went well, update face->num_names */ face->num_names = (FT_UShort) table->numNameRecords; @@ -873,19 +827,10 @@ error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size ); if ( error ) - { - FT_TRACE2(( "No `cmap' table in font !\n" )); - error = SFNT_Err_CMap_Table_Missing; goto Exit; - } - if ( !FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) - FT_TRACE2(( "`cmap' table loaded\n" )); - else - { - FT_ERROR(( "`cmap' table is too short!\n" )); + if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) face->cmap_size = 0; - } Exit: return error; @@ -988,19 +933,12 @@ }; - FT_TRACE2(( "OS/2 Table " )); - /* We now support old Mac fonts where the OS/2 table doesn't */ /* exist. Simply put, we set the `version' field to 0xFFFF */ /* and test this value each time we need to access the table. */ error = face->goto_table( face, TTAG_OS2, stream, 0 ); if ( error ) - { - FT_TRACE2(( "is missing!\n" )); - face->os2.version = 0xFFFFU; - error = SFNT_Err_Ok; goto Exit; - } os2 = &face->os2; @@ -1029,7 +967,11 @@ } } - FT_TRACE2(( "loaded\n" )); + FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender )); + FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender )); + FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent )); + FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent )); + FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection )); Exit: return error; @@ -1078,18 +1020,19 @@ }; - FT_TRACE2(( "PostScript " )); - error = face->goto_table( face, TTAG_post, stream, 0 ); if ( error ) - return SFNT_Err_Post_Table_Missing; + return error; if ( FT_STREAM_READ_FIELDS( post_fields, post ) ) return error; /* we don't load the glyph names, we do that in another */ /* module (ttpost). */ - FT_TRACE2(( "loaded\n" )); + + FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType )); + FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch + ? " yes" : " no" )); return SFNT_Err_Ok; } @@ -1142,22 +1085,14 @@ TT_PCLT* pclt = &face->pclt; - FT_TRACE2(( "PCLT " )); - /* optional table */ error = face->goto_table( face, TTAG_PCLT, stream, 0 ); if ( error ) - { - FT_TRACE2(( "missing (optional)\n" )); - pclt->Version = 0; - return SFNT_Err_Ok; - } + goto Exit; if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) ) goto Exit; - FT_TRACE2(( "loaded\n" )); - Exit: return error; } @@ -1190,12 +1125,10 @@ TT_GaspRange gaspranges; - FT_TRACE2(( "tt_face_load_gasp: %08p\n", face )); - /* the gasp table is optional */ error = face->goto_table( face, TTAG_gasp, stream, 0 ); if ( error ) - return SFNT_Err_Ok; + goto Exit; if ( FT_FRAME_ENTER( 4L ) ) goto Exit; @@ -1206,7 +1139,7 @@ FT_FRAME_EXIT(); num_ranges = face->gasp.numRanges; - FT_TRACE3(( "number of ranges = %d\n", num_ranges )); + FT_TRACE3(( "numRanges: %u\n", num_ranges )); if ( FT_QNEW_ARRAY( gaspranges, num_ranges ) || FT_FRAME_ENTER( num_ranges * 4L ) ) @@ -1219,14 +1152,13 @@ gaspranges[j].maxPPEM = FT_GET_USHORT(); gaspranges[j].gaspFlag = FT_GET_USHORT(); - FT_TRACE3(( " [max:%d flag:%d]", - gaspranges[j].maxPPEM, - gaspranges[j].gaspFlag )); + FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n", + j, + gaspranges[j].maxPPEM, + gaspranges[j].gaspFlag )); } - FT_TRACE3(( "\n" )); FT_FRAME_EXIT(); - FT_TRACE2(( "GASP loaded\n" )); Exit: return error; diff --git a/src/sfnt/ttmtx.c b/src/sfnt/ttmtx.c index 9928f30ee..141574c46 100644 --- a/src/sfnt/ttmtx.c +++ b/src/sfnt/ttmtx.c @@ -66,8 +66,6 @@ FT_ULong* ptable_size; - FT_TRACE2(( "%cmtx ", vertical ? 'v' : 'h' )); - if ( vertical ) { error = face->goto_table( face, TTAG_vmtx, stream, &table_size ); @@ -92,14 +90,7 @@ *ptable_size = table_size; - return SFNT_Err_Ok; - Fail: - if ( error == SFNT_Err_Table_Missing ) - FT_TRACE2(( "missing\n" )); - else - FT_TRACE2(( "failed\n" )); - return error; } @@ -120,47 +111,34 @@ TT_ShortMetrics** shorts; - FT_TRACE2(( "%cmtx ", vertical ? 'v' : 'h' )); - if ( vertical ) { error = face->goto_table( face, TTAG_vmtx, stream, &table_len ); if ( error ) - { - /* Set number_Of_VMetrics to 0! */ - face->vertical.number_Of_VMetrics = 0; - goto Fail; - } num_longs = face->vertical.number_Of_VMetrics; if ( num_longs > table_len / 4 ) - { num_longs = table_len / 4; - face->vertical.number_Of_VMetrics = num_longs; - } - longs = (TT_LongMetrics *) &face->vertical.long_metrics; + face->vertical.number_Of_VMetrics = 0; + + longs = (TT_LongMetrics *)&face->vertical.long_metrics; shorts = (TT_ShortMetrics**)&face->vertical.short_metrics; } else { error = face->goto_table( face, TTAG_hmtx, stream, &table_len ); if ( error ) - { - face->horizontal.number_Of_HMetrics = 0; - goto Fail; - } num_longs = face->horizontal.number_Of_HMetrics; if ( num_longs > table_len / 4 ) - { num_longs = table_len / 4; - face->horizontal.number_Of_HMetrics = num_longs; - } - longs = (TT_LongMetrics *) &face->horizontal.long_metrics; + face->horizontal.number_Of_HMetrics = 0; + + longs = (TT_LongMetrics *)&face->horizontal.long_metrics; shorts = (TT_ShortMetrics**)&face->horizontal.short_metrics; } @@ -171,8 +149,7 @@ if ( num_shorts < 0 ) { - FT_ERROR(( "%cmtx: more metrics than glyphs!\n", - vertical ? 'v' : 'h' )); + FT_ERROR(( "%cmtx has more metrics than glyphs.\n" )); /* Adobe simply ignores this problem. So we shall do the same. */ #if 0 @@ -229,16 +206,12 @@ FT_FRAME_EXIT(); - FT_TRACE2(( "loaded\n" )); - - return SFNT_Err_Ok; + if ( vertical ) + face->vertical.number_Of_VMetrics = num_longs; + else + face->horizontal.number_Of_HMetrics = num_longs; Fail: - if ( error == SFNT_Err_Table_Missing ) - FT_TRACE2(( "missing\n" )); - else - FT_TRACE2(( "failed\n" )); - return error; } @@ -298,8 +271,6 @@ }; - FT_TRACE2(( "%chea ", vertical ? 'v' : 'h' )); - if ( vertical ) { error = face->goto_table( face, TTAG_vhea, stream, 0 ); @@ -320,19 +291,14 @@ if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) ) goto Fail; + FT_TRACE3(( "Ascender: %5d\n", header->Ascender )); + FT_TRACE3(( "Descenter: %5d\n", header->Descender )); + FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics )); + header->long_metrics = NULL; header->short_metrics = NULL; - FT_TRACE2(( "loaded\n" )); - - return SFNT_Err_Ok; - Fail: - if ( error == SFNT_Err_Table_Missing ) - FT_TRACE2(( "missing\n" )); - else - FT_TRACE2(( "failed\n" )); - return error; } @@ -438,7 +404,8 @@ FT_UShort k = header->number_Of_HMetrics; - if ( k == 0 || gindex >= (FT_UInt)face->max_profile.numGlyphs ) + if ( k == 0 || !header->long_metrics || + gindex >= (FT_UInt)face->max_profile.numGlyphs ) { *abearing = *aadvance = 0; return SFNT_Err_Ok; diff --git a/src/sfnt/ttpost.c b/src/sfnt/ttpost.c index 3d526db4c..573b1f0af 100644 --- a/src/sfnt/ttpost.c +++ b/src/sfnt/ttpost.c @@ -175,7 +175,7 @@ /* 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->root.num_glyphs ) + if ( num_glyphs > face->max_profile.numGlyphs ) { error = SFNT_Err_Invalid_File_Format; goto Exit; @@ -286,7 +286,7 @@ goto Exit; /* check the number of glyphs */ - if ( num_glyphs > face->root.num_glyphs || num_glyphs > 258 ) + if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 ) { error = SFNT_Err_Invalid_File_Format; goto Exit; @@ -448,7 +448,7 @@ if ( !face ) return SFNT_Err_Invalid_Face_Handle; - if ( idx >= (FT_UInt)face->root.num_glyphs ) + if ( idx >= (FT_UInt)face->max_profile.numGlyphs ) return SFNT_Err_Invalid_Glyph_Index; #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES diff --git a/src/sfnt/ttsbit.c b/src/sfnt/ttsbit.c index 407c1bdba..9e7a91eb5 100644 --- a/src/sfnt/ttsbit.c +++ b/src/sfnt/ttsbit.c @@ -584,40 +584,6 @@ } } - /* now set up the root fields to indicate the strikes */ - if ( face->num_sbit_strikes ) - { - FT_ULong n; - FT_Face root = FT_FACE( face ); - - - if ( FT_NEW_ARRAY( root->available_sizes, face->num_sbit_strikes ) ) - goto Exit; - - for ( n = 0 ; n < face->num_sbit_strikes ; n++ ) - { - FT_Bitmap_Size* bsize = root->available_sizes + n; - TT_SBit_Strike strike = face->sbit_strikes + n; - FT_UShort fupem = face->header.Units_Per_EM; - FT_Short avg = face->os2.xAvgCharWidth; - - - /* XXX: Is this correct? */ - bsize->height = strike->hori.ascender - strike->hori.descender; - bsize->width = - (FT_Short)( ( avg * strike->y_ppem + fupem / 2 ) / fupem ); - - /* assume 72dpi */ - bsize->size = strike->y_ppem << 6; - - bsize->x_ppem = strike->x_ppem << 6; - bsize->y_ppem = strike->y_ppem << 6; - } - - root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; - root->num_fixed_sizes = (FT_Int)face->num_sbit_strikes; - } - Exit: return error; } diff --git a/src/sfnt/ttsbit0.c b/src/sfnt/ttsbit0.c index 12d5d7a89..1ade208d1 100644 --- a/src/sfnt/ttsbit0.c +++ b/src/sfnt/ttsbit0.c @@ -94,7 +94,7 @@ FT_ULong num_strikes, table_size; FT_Byte* p; FT_Byte* p_limit; - FT_UInt nn, count; + FT_UInt count; face->sbit_num_strikes = 0; @@ -142,50 +142,7 @@ face->sbit_num_strikes = count; - /* - * Now allocate the root array of FT_Bitmap_Size records and - * populate them. Unfortunately, it isn't possible to indicate bit - * depths in the FT_Bitmap_Size record. This is a design error. - */ - { - FT_Memory memory = face->root.stream->memory; - FT_UInt em_size = (FT_UInt)face->header.Units_Per_EM; - FT_Short avgwidth = face->os2.xAvgCharWidth; - - - if ( FT_NEW_ARRAY( face->root.available_sizes, count ) ) - goto Fail; - - for ( nn = 0; nn < count; nn++ ) - { - FT_Bitmap_Size* bsize = face->root.available_sizes + nn; - FT_UInt x_ppem, y_ppem; - FT_Char ascender, descender; - - - ascender = (FT_Char)p[16]; - descender = (FT_Char)p[17]; - x_ppem = p[44]; - y_ppem = p[45]; - - bsize->x_ppem = (FT_Pos)( x_ppem << 6 ); - bsize->y_ppem = (FT_Pos)( y_ppem << 6 ); - - /* XXX: Is this correct? */ - bsize->height = (FT_Short)( ascender - descender ); - bsize->width = (FT_Short)( ( avgwidth * y_ppem + em_size / 2 ) / - em_size ); - - /* assume 72dpi */ - bsize->size = bsize->y_ppem; - - p += 48; - } - - face->root.face_flags |= FT_FACE_FLAG_FIXED_SIZES; - face->root.num_fixed_sizes = count; - } - + FT_TRACE3(( "sbit_num_strikes: %u\n", count )); Exit: return error; @@ -222,22 +179,20 @@ FT_ULong strike_index, FT_Size_Metrics* metrics ) { - FT_Bitmap_Size* bsize; FT_Byte* strike; if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) return SFNT_Err_Invalid_Argument; - bsize = ( (FT_Face)face )->available_sizes + strike_index; strike = face->sbit_table + 8 + strike_index * 48; - metrics->x_ppem = (FT_UShort)( bsize->x_ppem >> 6 ); - metrics->y_ppem = (FT_UShort)( bsize->y_ppem >> 6 ); - metrics->height = (FT_UShort)( bsize->height << 6 ); + metrics->x_ppem = (FT_UShort)strike[44]; + metrics->y_ppem = (FT_UShort)strike[45]; metrics->ascender = (FT_Char)strike[16] << 6; /* hori.ascender */ metrics->descender = (FT_Char)strike[17] << 6; /* hori.descender */ + metrics->height = metrics->ascender - metrics->descender; /* XXX: Is this correct? */ metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */ diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c index 58f2711f8..037480b41 100644 --- a/src/truetype/ttdriver.c +++ b/src/truetype/ttdriver.c @@ -175,7 +175,6 @@ tt_size_request( FT_Size size, FT_Size_Request req ) { - TT_Face ttface = (TT_Face)size->face; TT_Size ttsize = (TT_Size)size; FT_Error error = TT_Err_Ok; @@ -184,6 +183,7 @@ if ( FT_HAS_FIXED_SIZES( size->face ) ) { + TT_Face ttface = (TT_Face)size->face; SFNT_Service sfnt = ttface->sfnt; FT_ULong index; diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c index a6b55b961..df252aaa0 100644 --- a/src/truetype/ttinterp.c +++ b/src/truetype/ttinterp.c @@ -394,10 +394,6 @@ FT_Memory memory = exec->memory; - /* free composite load stack */ - FT_FREE( exec->loadStack ); - exec->loadSize = 0; - /* points zone */ exec->maxPoints = 0; exec->maxContours = 0; @@ -462,11 +458,9 @@ exec->maxContours = 0; exec->stackSize = 0; - exec->loadSize = 0; exec->glyphSize = 0; exec->stack = NULL; - exec->loadStack = NULL; exec->glyphIns = NULL; exec->face = NULL; @@ -594,14 +588,6 @@ exec->twilight = size->twilight; } - error = Update_Max( exec->memory, - &exec->loadSize, - sizeof ( TT_SubGlyphRec ), - (void**)&exec->loadStack, - exec->face->max_components + 1 ); - if ( error ) - return error; - /* XXX: We reserve a little more elements on the stack to deal safely */ /* with broken fonts like arialbs, courbs, timesbs, etc. */ tmp = exec->stackSize; diff --git a/src/truetype/ttinterp.h b/src/truetype/ttinterp.h index 86f1adeea..d8be89223 100644 --- a/src/truetype/ttinterp.h +++ b/src/truetype/ttinterp.h @@ -216,9 +216,6 @@ FT_BEGIN_HEADER TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ - FT_ULong loadSize; - TT_SubGlyph_Stack loadStack; /* loading subglyph stack */ - FT_Bool grayscale; /* are we hinting for grayscale? */ } TT_ExecContextRec; diff --git a/src/type1/t1objs.c b/src/type1/t1objs.c index c7636efaf..74b925a2c 100644 --- a/src/type1/t1objs.c +++ b/src/type1/t1objs.c @@ -439,9 +439,6 @@ root->underline_position = (FT_Short)info->underline_position; root->underline_thickness = (FT_Short)info->underline_thickness; - - root->internal->max_points = 0; - root->internal->max_contours = 0; } { diff --git a/src/type42/t42objs.c b/src/type42/t42objs.c index a67f85875..30d9dcc8f 100644 --- a/src/type42/t42objs.c +++ b/src/type42/t42objs.c @@ -302,9 +302,6 @@ root->underline_position = (FT_Short)info->underline_position; root->underline_thickness = (FT_Short)info->underline_thickness; - root->internal->max_points = 0; - root->internal->max_contours = 0; - /* compute style flags */ root->style_flags = 0; if ( info->italic_angle )