ref: 0d565fdc1d3a383d032a198561be26739a0c55f5
parent: 5225402a527e9f35283a3b3db595d41df1c67e1d
author: Wu, Chia-I (吳佳一) <[email protected]>
date: Wed Feb 15 02:44:31 EST 2006
* 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.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,51 @@
+2006-02-15 Chia-I Wu <[email protected]>
+
+ * 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 <[email protected]>
* include/freetype/ftoutln.h (FT_Outline_Embolden): Mention in
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -213,9 +213,6 @@
/* */
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;
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -1102,10 +1102,6 @@
/* 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 @@
#endif
TT_MaxProfile max_profile;
- FT_ULong max_components;
FT_Bool vertical_info;
TT_VertHeader vertical; /* TT Vertical header, if present */
--- a/src/cff/cffobjs.h
+++ b/src/cff/cffobjs.h
@@ -116,9 +116,13 @@
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 );
--- 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:
--- a/src/sfnt/sfdriver.c
+++ b/src/sfnt/sfdriver.c
@@ -434,6 +434,7 @@
0,
0,
0,
+ 0,
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -481,11 +481,38 @@
}
-#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 )
sfnt_load_face( FT_Stream stream,
TT_Face face,
@@ -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,29 +562,40 @@
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 ) );
+ if ( !has_outline && sfnt->load_bhed )
+ {
+ LOAD_( bhed );
+ is_apple_sbit = !error;
+ }
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
/* 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 */
@@ -562,11 +602,10 @@
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 )
--- 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 )
{
--- 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,20 +493,9 @@
};
- 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;
@@ -513,9 +502,8 @@
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,11 +1020,9 @@
};
- 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;
@@ -1089,8 +1029,11 @@
/* 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;
--- 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,27 +111,19 @@
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
@@ -147,20 +130,15 @@
{
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;
-
- Fail:
- if ( error == SFNT_Err_Table_Missing )
- FT_TRACE2(( "missing\n" ));
+ if ( vertical )
+ face->vertical.number_Of_VMetrics = num_longs;
else
- FT_TRACE2(( "failed\n" ));
+ face->horizontal.number_Of_HMetrics = num_longs;
+ Fail:
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;
--- 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
--- 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;
}
--- 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,7 +179,6 @@
FT_ULong strike_index,
FT_Size_Metrics* metrics )
{
- FT_Bitmap_Size* bsize;
FT_Byte* strike;
@@ -229,15 +185,14 @@
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 */
--- 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;
--- 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;
@@ -593,14 +587,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. */
--- a/src/truetype/ttinterp.h
+++ b/src/truetype/ttinterp.h
@@ -216,9 +216,6 @@
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;
--- 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;
}
{
--- 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 )