* src/truetype/*: Clean up interface.

Ensure that all driver functions use the signature of the service or driver.
This avoids pointer mismatches, which are technically undefined behaviour.
Recent compilers are more picky in catching them as part of Control Flow
Integrity tests.
This commit is contained in:
Werner Lemberg 2023-05-07 06:43:21 +02:00
parent e245951c43
commit 3a85bf0b3f
7 changed files with 219 additions and 197 deletions

View File

@ -57,7 +57,7 @@
* PROPERTY SERVICE * PROPERTY SERVICE
* *
*/ */
static FT_Error FT_CALLBACK_DEF( FT_Error )
tt_property_set( FT_Module module, /* TT_Driver */ tt_property_set( FT_Module module, /* TT_Driver */
const char* property_name, const char* property_name,
const void* value, const void* value,
@ -124,10 +124,10 @@
} }
static FT_Error FT_CALLBACK_DEF( FT_Error )
tt_property_get( FT_Module module, /* TT_Driver */ tt_property_get( FT_Module module, /* TT_Driver */
const char* property_name, const char* property_name,
const void* value ) void* value )
{ {
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
TT_Driver driver = (TT_Driver)module; TT_Driver driver = (TT_Driver)module;
@ -208,35 +208,35 @@
* *
* They can be implemented by format-specific interfaces. * They can be implemented by format-specific interfaces.
*/ */
static FT_Error FT_CALLBACK_DEF( FT_Error )
tt_get_kerning( FT_Face ttface, /* TT_Face */ tt_get_kerning( FT_Face face, /* TT_Face */
FT_UInt left_glyph, FT_UInt left_glyph,
FT_UInt right_glyph, FT_UInt right_glyph,
FT_Vector* kerning ) FT_Vector* kerning )
{ {
TT_Face face = (TT_Face)ttface; TT_Face ttface = (TT_Face)face;
SFNT_Service sfnt = (SFNT_Service)face->sfnt; SFNT_Service sfnt = (SFNT_Service)ttface->sfnt;
kerning->x = 0; kerning->x = 0;
kerning->y = 0; kerning->y = 0;
if ( sfnt ) if ( sfnt )
kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); kerning->x = sfnt->get_kerning( ttface, left_glyph, right_glyph );
return 0; return 0;
} }
static FT_Error FT_CALLBACK_DEF( FT_Error )
tt_get_advances( FT_Face ttface, tt_get_advances( FT_Face face, /* TT_Face */
FT_UInt start, FT_UInt start,
FT_UInt count, FT_UInt count,
FT_Int32 flags, FT_Int32 flags,
FT_Fixed *advances ) FT_Fixed *advances )
{ {
FT_UInt nn; FT_UInt nn;
TT_Face face = (TT_Face)ttface; TT_Face ttface = (TT_Face)face;
/* XXX: TODO: check for sbits */ /* XXX: TODO: check for sbits */
@ -245,8 +245,8 @@
{ {
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
/* no fast retrieval for blended MM fonts without VVAR table */ /* no fast retrieval for blended MM fonts without VVAR table */
if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) && if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
!( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
return FT_THROW( Unimplemented_Feature ); return FT_THROW( Unimplemented_Feature );
#endif #endif
@ -257,7 +257,7 @@
/* since we don't need `tsb', we use zero for `yMax' parameter */ /* since we don't need `tsb', we use zero for `yMax' parameter */
TT_Get_VMetrics( face, start + nn, 0, &tsb, &ah ); TT_Get_VMetrics( ttface, start + nn, 0, &tsb, &ah );
advances[nn] = ah; advances[nn] = ah;
} }
} }
@ -265,8 +265,8 @@
{ {
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
/* no fast retrieval for blended MM fonts without HVAR table */ /* no fast retrieval for blended MM fonts without HVAR table */
if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) && if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
!( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
return FT_THROW( Unimplemented_Feature ); return FT_THROW( Unimplemented_Feature );
#endif #endif
@ -276,7 +276,7 @@
FT_UShort aw; FT_UShort aw;
TT_Get_HMetrics( face, start + nn, &lsb, &aw ); TT_Get_HMetrics( ttface, start + nn, &lsb, &aw );
advances[nn] = aw; advances[nn] = aw;
} }
} }
@ -300,7 +300,7 @@
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
static FT_Error FT_CALLBACK_DEF( FT_Error )
tt_size_select( FT_Size size, tt_size_select( FT_Size size,
FT_ULong strike_index ) FT_ULong strike_index )
{ {
@ -337,7 +337,7 @@
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
static FT_Error FT_CALLBACK_DEF( FT_Error )
tt_size_request( FT_Size size, tt_size_request( FT_Size size,
FT_Size_Request req ) FT_Size_Request req )
{ {
@ -436,15 +436,15 @@
* @Return: * @Return:
* FreeType error code. 0 means success. * FreeType error code. 0 means success.
*/ */
static FT_Error FT_CALLBACK_DEF( FT_Error )
tt_glyph_load( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ tt_glyph_load( FT_GlyphSlot slot, /* TT_GlyphSlot */
FT_Size ttsize, /* TT_Size */ FT_Size size, /* TT_Size */
FT_UInt glyph_index, FT_UInt glyph_index,
FT_Int32 load_flags ) FT_Int32 load_flags )
{ {
TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; TT_GlyphSlot ttslot = (TT_GlyphSlot)slot;
TT_Size size = (TT_Size)ttsize; TT_Size ttsize = (TT_Size)size;
FT_Face face = ttslot->face; FT_Face face = ttslot->face;
FT_Error error; FT_Error error;
@ -486,12 +486,12 @@
} }
/* use hinted metrics only if we load a glyph with hinting */ /* use hinted metrics only if we load a glyph with hinting */
size->metrics = ( load_flags & FT_LOAD_NO_HINTING ) ttsize->metrics = ( load_flags & FT_LOAD_NO_HINTING )
? &ttsize->metrics ? &size->metrics
: &size->hinted_metrics; : &ttsize->hinted_metrics;
/* now fill in the glyph slot with outline/bitmap/layered */ /* now fill in the glyph slot with outline/bitmap/layered */
error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); error = TT_Load_Glyph( ttsize, ttslot, glyph_index, load_flags );
/* force drop-out mode to 2 - irrelevant now */ /* force drop-out mode to 2 - irrelevant now */
/* slot->outline.dropout_mode = 2; */ /* slot->outline.dropout_mode = 2; */

View File

@ -1612,8 +1612,14 @@
else else
#endif /* FT_CONFIG_OPTION_INCREMENTAL */ #endif /* FT_CONFIG_OPTION_INCREMENTAL */
{
FT_ULong len;
offset = tt_face_get_location( face, glyph_index, &loader->byte_len );
offset = tt_face_get_location( FT_FACE( face ), glyph_index, &len );
loader->byte_len = (FT_UInt)len;
}
if ( loader->byte_len > 0 ) if ( loader->byte_len > 0 )
{ {

View File

@ -466,7 +466,7 @@
if ( store_offset ) if ( store_offset )
{ {
error = tt_var_load_item_variation_store( error = tt_var_load_item_variation_store(
face, FT_FACE( face ),
table_offset + store_offset, table_offset + store_offset,
&table->itemStore ); &table->itemStore );
if ( error ) if ( error )
@ -476,7 +476,7 @@
if ( axisMap_offset ) if ( axisMap_offset )
{ {
error = tt_var_load_delta_set_index_mapping( error = tt_var_load_delta_set_index_mapping(
face, FT_FACE( face ),
table_offset + axisMap_offset, table_offset + axisMap_offset,
&table->axisMap, &table->axisMap,
&table->itemStore, &table->itemStore,
@ -493,10 +493,11 @@
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
tt_var_load_item_variation_store( TT_Face face, tt_var_load_item_variation_store( FT_Face face, /* TT_Face */
FT_ULong offset, FT_ULong offset,
GX_ItemVarStore itemStore ) GX_ItemVarStore itemStore )
{ {
TT_Face ttface = (TT_Face)face;
FT_Stream stream = FT_FACE_STREAM( face ); FT_Stream stream = FT_FACE_STREAM( face );
FT_Memory memory = stream->memory; FT_Memory memory = stream->memory;
@ -511,7 +512,7 @@
FT_UInt i, j, k; FT_UInt i, j, k;
FT_Bool long_words; FT_Bool long_words;
GX_Blend blend = face->blend; GX_Blend blend = ttface->blend;
FT_ULong* dataOffsetArray = NULL; FT_ULong* dataOffsetArray = NULL;
@ -715,7 +716,7 @@
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
tt_var_load_delta_set_index_mapping( TT_Face face, tt_var_load_delta_set_index_mapping( FT_Face face, /* TT_Face */
FT_ULong offset, FT_ULong offset,
GX_DeltaSetIdxMap map, GX_DeltaSetIdxMap map,
GX_ItemVarStore itemStore, GX_ItemVarStore itemStore,
@ -942,7 +943,7 @@
} }
error = tt_var_load_item_variation_store( error = tt_var_load_item_variation_store(
face, FT_FACE( face ),
table_offset + store_offset, table_offset + store_offset,
&table->itemStore ); &table->itemStore );
if ( error ) if ( error )
@ -951,7 +952,7 @@
if ( widthMap_offset ) if ( widthMap_offset )
{ {
error = tt_var_load_delta_set_index_mapping( error = tt_var_load_delta_set_index_mapping(
face, FT_FACE( face ),
table_offset + widthMap_offset, table_offset + widthMap_offset,
&table->widthMap, &table->widthMap,
&table->itemStore, &table->itemStore,
@ -993,11 +994,12 @@
FT_LOCAL_DEF( FT_ItemVarDelta ) FT_LOCAL_DEF( FT_ItemVarDelta )
tt_var_get_item_delta( TT_Face face, tt_var_get_item_delta( FT_Face face, /* TT_Face */
GX_ItemVarStore itemStore, GX_ItemVarStore itemStore,
FT_UInt outerIndex, FT_UInt outerIndex,
FT_UInt innerIndex ) FT_UInt innerIndex )
{ {
TT_Face ttface = (TT_Face)face;
FT_Stream stream = FT_FACE_STREAM( face ); FT_Stream stream = FT_FACE_STREAM( face );
FT_Memory memory = stream->memory; FT_Memory memory = stream->memory;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
@ -1010,7 +1012,7 @@
FT_ItemVarDelta returnValue; FT_ItemVarDelta returnValue;
if ( !face->blend || !face->blend->normalizedcoords ) if ( !ttface->blend || !ttface->blend->normalizedcoords )
return 0; return 0;
/* OpenType 1.8.4+: No variation data for this item */ /* OpenType 1.8.4+: No variation data for this item */
@ -1061,27 +1063,27 @@
else if ( axis->peakCoord == 0 ) else if ( axis->peakCoord == 0 )
continue; continue;
else if ( face->blend->normalizedcoords[j] == axis->peakCoord ) else if ( ttface->blend->normalizedcoords[j] == axis->peakCoord )
continue; continue;
/* ignore this region if coords are out of range */ /* ignore this region if coords are out of range */
else if ( face->blend->normalizedcoords[j] <= axis->startCoord || else if ( ttface->blend->normalizedcoords[j] <= axis->startCoord ||
face->blend->normalizedcoords[j] >= axis->endCoord ) ttface->blend->normalizedcoords[j] >= axis->endCoord )
{ {
scalar = 0; scalar = 0;
break; break;
} }
/* cumulative product of all the axis scalars */ /* cumulative product of all the axis scalars */
else if ( face->blend->normalizedcoords[j] < axis->peakCoord ) else if ( ttface->blend->normalizedcoords[j] < axis->peakCoord )
scalar = scalar =
FT_MulDiv( scalar, FT_MulDiv( scalar,
face->blend->normalizedcoords[j] - axis->startCoord, ttface->blend->normalizedcoords[j] - axis->startCoord,
axis->peakCoord - axis->startCoord ); axis->peakCoord - axis->startCoord );
else else
scalar = scalar =
FT_MulDiv( scalar, FT_MulDiv( scalar,
axis->endCoord - face->blend->normalizedcoords[j], axis->endCoord - ttface->blend->normalizedcoords[j],
axis->endCoord - axis->peakCoord ); axis->endCoord - axis->peakCoord );
} /* per-axis loop */ } /* per-axis loop */
@ -1207,7 +1209,7 @@
innerIndex = gindex; innerIndex = gindex;
} }
delta = tt_var_get_item_delta( face, delta = tt_var_get_item_delta( FT_FACE( face ),
&table->itemStore, &table->itemStore,
outerIndex, outerIndex,
innerIndex ); innerIndex );
@ -1230,20 +1232,20 @@
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
tt_hadvance_adjust( TT_Face face, tt_hadvance_adjust( FT_Face face, /* TT_Face */
FT_UInt gindex, FT_UInt gindex,
FT_Int *avalue ) FT_Int *avalue )
{ {
return tt_hvadvance_adjust( face, gindex, avalue, 0 ); return tt_hvadvance_adjust( (TT_Face)face, gindex, avalue, 0 );
} }
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
tt_vadvance_adjust( TT_Face face, tt_vadvance_adjust( FT_Face face, /* TT_Face */
FT_UInt gindex, FT_UInt gindex,
FT_Int *avalue ) FT_Int *avalue )
{ {
return tt_hvadvance_adjust( face, gindex, avalue, 1 ); return tt_hvadvance_adjust( (TT_Face)face, gindex, avalue, 1 );
} }
@ -1390,7 +1392,7 @@
records_offset = FT_STREAM_POS(); records_offset = FT_STREAM_POS();
error = tt_var_load_item_variation_store( error = tt_var_load_item_variation_store(
face, FT_FACE( face ),
table_offset + store_offset, table_offset + store_offset,
&blend->mvar_table->itemStore ); &blend->mvar_table->itemStore );
if ( error ) if ( error )
@ -1489,16 +1491,19 @@
* The font face. * The font face.
*/ */
FT_LOCAL_DEF( void ) FT_LOCAL_DEF( void )
tt_apply_mvar( TT_Face face ) tt_apply_mvar( FT_Face face ) /* TT_Face */
{ {
GX_Blend blend = face->blend; TT_Face ttface = (TT_Face)face;
GX_Blend blend = ttface->blend;
GX_Value value, limit; GX_Value value, limit;
FT_Short mvar_hasc_delta = 0; FT_Short mvar_hasc_delta = 0;
FT_Short mvar_hdsc_delta = 0; FT_Short mvar_hdsc_delta = 0;
FT_Short mvar_hlgp_delta = 0; FT_Short mvar_hlgp_delta = 0;
if ( !( face->variation_support & TT_FACE_FLAG_VAR_MVAR ) ) if ( !( ttface->variation_support & TT_FACE_FLAG_VAR_MVAR ) )
return; return;
value = blend->mvar_table->values; value = blend->mvar_table->values;
@ -1506,7 +1511,7 @@
for ( ; value < limit; value++ ) for ( ; value < limit; value++ )
{ {
FT_Short* p = ft_var_get_value_pointer( face, value->tag ); FT_Short* p = ft_var_get_value_pointer( ttface, value->tag );
FT_Int delta; FT_Int delta;
@ -1544,9 +1549,7 @@
/* adjust all derived values */ /* adjust all derived values */
{ {
FT_Service_MetricsVariations var = FT_Service_MetricsVariations var =
(FT_Service_MetricsVariations)face->face_var; (FT_Service_MetricsVariations)ttface->face_var;
FT_Face root = &face->root;
/* /*
* Apply the deltas of hasc, hdsc and hlgp to the FT_Face's ascender, * Apply the deltas of hasc, hdsc and hlgp to the FT_Face's ascender,
@ -1574,23 +1577,23 @@
* whether they were actually changed or the font had the OS/2 table's * whether they were actually changed or the font had the OS/2 table's
* fsSelection's bit 7 (USE_TYPO_METRICS) set. * fsSelection's bit 7 (USE_TYPO_METRICS) set.
*/ */
FT_Short current_line_gap = root->height - root->ascender + FT_Short current_line_gap = face->height - face->ascender +
root->descender; face->descender;
root->ascender = root->ascender + mvar_hasc_delta; face->ascender = face->ascender + mvar_hasc_delta;
root->descender = root->descender + mvar_hdsc_delta; face->descender = face->descender + mvar_hdsc_delta;
root->height = root->ascender - root->descender + face->height = face->ascender - face->descender +
current_line_gap + mvar_hlgp_delta; current_line_gap + mvar_hlgp_delta;
root->underline_position = face->postscript.underlinePosition - face->underline_position = ttface->postscript.underlinePosition -
face->postscript.underlineThickness / 2; ttface->postscript.underlineThickness / 2;
root->underline_thickness = face->postscript.underlineThickness; face->underline_thickness = ttface->postscript.underlineThickness;
/* iterate over all FT_Size objects and call `var->size_reset' */ /* iterate over all FT_Size objects and call `var->size_reset' */
/* to propagate the metrics changes */ /* to propagate the metrics changes */
if ( var && var->size_reset ) if ( var && var->size_reset )
FT_List_Iterate( &root->sizes_list, FT_List_Iterate( &face->sizes_list,
ft_size_reset_iterator, ft_size_reset_iterator,
(void*)var ); (void*)var );
} }
@ -2103,7 +2106,7 @@
innerIndex = table->axisMap.innerIndex[idx]; innerIndex = table->axisMap.innerIndex[idx];
} }
delta = tt_var_get_item_delta( face, delta = tt_var_get_item_delta( FT_FACE( face ),
&table->itemStore, &table->itemStore,
outerIndex, outerIndex,
innerIndex ); innerIndex );
@ -2265,11 +2268,12 @@
* FreeType error code. 0 means success. * FreeType error code. 0 means success.
*/ */
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
TT_Get_MM_Var( TT_Face face, TT_Get_MM_Var( FT_Face face, /* TT_Face */
FT_MM_Var* *master ) FT_MM_Var* *master )
{ {
FT_Stream stream = face->root.stream; TT_Face ttface = (TT_Face)face;
FT_Memory memory = face->root.memory; FT_Stream stream = FT_FACE_STREAM( face );
FT_Memory memory = FT_FACE_MEMORY( face );
FT_ULong table_len; FT_ULong table_len;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
FT_ULong fvar_start = 0; FT_ULong fvar_start = 0;
@ -2333,19 +2337,19 @@
/* the default instance, which might be missing in the table of named */ /* the default instance, which might be missing in the table of named */
/* instances (in 'fvar'). This value is validated in `sfobjs.c` and */ /* instances (in 'fvar'). This value is validated in `sfobjs.c` and */
/* may be reset to 0 if consistency checks fail. */ /* may be reset to 0 if consistency checks fail. */
num_instances = (FT_UInt)face->root.style_flags >> 16; num_instances = (FT_UInt)face->style_flags >> 16;
/* read the font data and set up the internal representation */ /* read the font data and set up the internal representation */
/* if not already done */ /* if not already done */
need_init = !face->blend; need_init = !ttface->blend;
if ( need_init ) if ( need_init )
{ {
FT_TRACE2(( "FVAR " )); FT_TRACE2(( "FVAR " ));
if ( FT_SET_ERROR( face->goto_table( face, TTAG_fvar, if ( FT_SET_ERROR( ttface->goto_table( ttface, TTAG_fvar,
stream, &table_len ) ) ) stream, &table_len ) ) )
{ {
FT_TRACE1(( "is missing\n" )); FT_TRACE1(( "is missing\n" ));
goto Exit; goto Exit;
@ -2378,14 +2382,14 @@
fvar_head.axisCount, fvar_head.axisCount,
fvar_head.axisCount == 1 ? "is" : "es" )); fvar_head.axisCount == 1 ? "is" : "es" ));
if ( FT_NEW( face->blend ) ) if ( FT_NEW( ttface->blend ) )
goto Exit; goto Exit;
num_axes = fvar_head.axisCount; num_axes = fvar_head.axisCount;
face->blend->num_axis = num_axes; ttface->blend->num_axis = num_axes;
} }
else else
num_axes = face->blend->num_axis; num_axes = ttface->blend->num_axis;
/* prepare storage area for MM data; this cannot overflow */ /* prepare storage area for MM data; this cannot overflow */
/* 32-bit arithmetic because of the size limits used in the */ /* 32-bit arithmetic because of the size limits used in the */
@ -2414,16 +2418,16 @@
if ( need_init ) if ( need_init )
{ {
face->blend->mmvar_len = mmvar_size + ttface->blend->mmvar_len = mmvar_size +
axis_flags_size + axis_flags_size +
axis_size + axis_size +
namedstyle_size + namedstyle_size +
next_coords_size + next_coords_size +
next_name_size; next_name_size;
if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) if ( FT_ALLOC( mmvar, ttface->blend->mmvar_len ) )
goto Exit; goto Exit;
face->blend->mmvar = mmvar; ttface->blend->mmvar = mmvar;
/* set up pointers and offsets into the `mmvar' array; */ /* set up pointers and offsets into the `mmvar' array; */
/* the data gets filled in later on */ /* the data gets filled in later on */
@ -2529,16 +2533,16 @@
/* named instance coordinates are stored as design coordinates; */ /* named instance coordinates are stored as design coordinates; */
/* we have to convert them to normalized coordinates also */ /* we have to convert them to normalized coordinates also */
if ( FT_NEW_ARRAY( face->blend->normalized_stylecoords, if ( FT_NEW_ARRAY( ttface->blend->normalized_stylecoords,
num_axes * num_instances ) ) num_axes * num_instances ) )
goto Exit; goto Exit;
if ( fvar_head.instanceCount && !face->blend->avar_loaded ) if ( fvar_head.instanceCount && !ttface->blend->avar_loaded )
{ {
FT_ULong offset = FT_STREAM_POS(); FT_ULong offset = FT_STREAM_POS();
ft_var_load_avar( face ); ft_var_load_avar( ttface );
if ( FT_STREAM_SEEK( offset ) ) if ( FT_STREAM_SEEK( offset ) )
goto Exit; goto Exit;
@ -2549,7 +2553,7 @@
fvar_head.instanceCount == 1 ? "" : "s" )); fvar_head.instanceCount == 1 ? "" : "s" ));
ns = mmvar->namedstyle; ns = mmvar->namedstyle;
nsc = face->blend->normalized_stylecoords; nsc = ttface->blend->normalized_stylecoords;
for ( i = 0; i < fvar_head.instanceCount; i++, ns++ ) for ( i = 0; i < fvar_head.instanceCount; i++, ns++ )
{ {
/* PostScript names add 2 bytes to the instance record size */ /* PostScript names add 2 bytes to the instance record size */
@ -2572,7 +2576,7 @@
#ifdef FT_DEBUG_LEVEL_TRACE #ifdef FT_DEBUG_LEVEL_TRACE
{ {
SFNT_Service sfnt = (SFNT_Service)face->sfnt; SFNT_Service sfnt = (SFNT_Service)ttface->sfnt;
FT_String* strname = NULL; FT_String* strname = NULL;
FT_String* psname = NULL; FT_String* psname = NULL;
@ -2584,7 +2588,7 @@
if ( ns->strid != 0xFFFF ) if ( ns->strid != 0xFFFF )
{ {
(void)sfnt->get_name( face, (void)sfnt->get_name( ttface,
(FT_UShort)ns->strid, (FT_UShort)ns->strid,
&strname ); &strname );
if ( strname && !ft_strcmp( strname, ".notdef" ) ) if ( strname && !ft_strcmp( strname, ".notdef" ) )
@ -2593,7 +2597,7 @@
if ( ns->psid != 0xFFFF ) if ( ns->psid != 0xFFFF )
{ {
(void)sfnt->get_name( face, (void)sfnt->get_name( ttface,
(FT_UShort)ns->psid, (FT_UShort)ns->psid,
&psname ); &psname );
if ( psname && !ft_strcmp( psname, ".notdef" ) ) if ( psname && !ft_strcmp( psname, ".notdef" ) )
@ -2616,7 +2620,7 @@
} }
#endif /* FT_DEBUG_LEVEL_TRACE */ #endif /* FT_DEBUG_LEVEL_TRACE */
ft_var_to_normalized( face, num_axes, ns->coords, nsc ); ft_var_to_normalized( ttface, num_axes, ns->coords, nsc );
nsc += num_axes; nsc += num_axes;
FT_FRAME_EXIT(); FT_FRAME_EXIT();
@ -2624,7 +2628,7 @@
if ( num_instances != fvar_head.instanceCount ) if ( num_instances != fvar_head.instanceCount )
{ {
SFNT_Service sfnt = (SFNT_Service)face->sfnt; SFNT_Service sfnt = (SFNT_Service)ttface->sfnt;
FT_Int found, dummy1, dummy2; FT_Int found, dummy1, dummy2;
FT_UInt strid = ~0U; FT_UInt strid = ~0U;
@ -2634,7 +2638,7 @@
/* of named instances; try to synthesize an entry. */ /* of named instances; try to synthesize an entry. */
/* If this fails, `default_named_instance` remains */ /* If this fails, `default_named_instance` remains */
/* at value zero, which doesn't do any harm. */ /* at value zero, which doesn't do any harm. */
found = sfnt->get_name_id( face, found = sfnt->get_name_id( ttface,
TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY, TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY,
&dummy1, &dummy1,
&dummy2 ); &dummy2 );
@ -2642,7 +2646,7 @@
strid = TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY; strid = TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY;
else else
{ {
found = sfnt->get_name_id( face, found = sfnt->get_name_id( ttface,
TT_NAME_ID_FONT_SUBFAMILY, TT_NAME_ID_FONT_SUBFAMILY,
&dummy1, &dummy1,
&dummy2 ); &dummy2 );
@ -2652,7 +2656,7 @@
if ( found ) if ( found )
{ {
found = sfnt->get_name_id( face, found = sfnt->get_name_id( ttface,
TT_NAME_ID_PS_NAME, TT_NAME_ID_PS_NAME,
&dummy1, &dummy1,
&dummy2 ); &dummy2 );
@ -2662,7 +2666,7 @@
" Adding default instance to named instances\n" )); " Adding default instance to named instances\n" ));
/* named instance indices start with value 1 */ /* named instance indices start with value 1 */
face->var_default_named_instance = num_instances; ttface->var_default_named_instance = num_instances;
ns = &mmvar->namedstyle[fvar_head.instanceCount]; ns = &mmvar->namedstyle[fvar_head.instanceCount];
@ -2677,7 +2681,7 @@
} }
} }
ft_var_load_mvar( face ); ft_var_load_mvar( ttface );
} }
/* fill the output array if requested */ /* fill the output array if requested */
@ -2687,9 +2691,9 @@
FT_UInt n; FT_UInt n;
if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) if ( FT_ALLOC( mmvar, ttface->blend->mmvar_len ) )
goto Exit; goto Exit;
FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len ); FT_MEM_COPY( mmvar, ttface->blend->mmvar, ttface->blend->mmvar_len );
axis_flags = axis_flags =
(FT_UShort*)( (char*)mmvar + mmvar_size ); (FT_UShort*)( (char*)mmvar + mmvar_size );
@ -2765,7 +2769,7 @@
if ( !face->blend ) if ( !face->blend )
{ {
if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) if ( FT_SET_ERROR( TT_Get_MM_Var( FT_FACE( face ), NULL ) ) )
goto Exit; goto Exit;
} }
@ -2971,11 +2975,11 @@
* axis values. * axis values.
*/ */
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
TT_Set_MM_Blend( TT_Face face, TT_Set_MM_Blend( FT_Face face, /* TT_Face */
FT_UInt num_coords, FT_UInt num_coords,
FT_Fixed* coords ) FT_Fixed* coords )
{ {
return tt_set_mm_blend( face, num_coords, coords, 1 ); return tt_set_mm_blend( (TT_Face)face, num_coords, coords, 1 );
} }
@ -3007,28 +3011,30 @@
* axis values. * axis values.
*/ */
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
TT_Get_MM_Blend( TT_Face face, TT_Get_MM_Blend( FT_Face face, /* TT_Face */
FT_UInt num_coords, FT_UInt num_coords,
FT_Fixed* coords ) FT_Fixed* coords )
{ {
TT_Face ttface = (TT_Face)face;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
GX_Blend blend; GX_Blend blend;
FT_UInt i, nc; FT_UInt i, nc;
if ( !face->blend ) if ( !ttface->blend )
{ {
if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
return error; return error;
} }
blend = face->blend; blend = ttface->blend;
if ( !blend->coords ) if ( !blend->coords )
{ {
/* select default instance coordinates */ /* select default instance coordinates */
/* if no instance is selected yet */ /* if no instance is selected yet */
if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) ) if ( FT_SET_ERROR( tt_set_mm_blend( ttface, 0, NULL, 1 ) ) )
return error; return error;
} }
@ -3041,7 +3047,7 @@
nc = blend->num_axis; nc = blend->num_axis;
} }
if ( face->doblend ) if ( ttface->doblend )
{ {
for ( i = 0; i < nc; i++ ) for ( i = 0; i < nc; i++ )
coords[i] = blend->normalizedcoords[i]; coords[i] = blend->normalizedcoords[i];
@ -3088,15 +3094,16 @@
* FreeType error code. 0 means success. * FreeType error code. 0 means success.
*/ */
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
TT_Set_Var_Design( TT_Face face, TT_Set_Var_Design( FT_Face face, /* TT_Face */
FT_UInt num_coords, FT_UInt num_coords,
FT_Fixed* coords ) FT_Fixed* coords )
{ {
TT_Face ttface = (TT_Face)face;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
GX_Blend blend; GX_Blend blend;
FT_MM_Var* mmvar; FT_MM_Var* mmvar;
FT_UInt i; FT_UInt i;
FT_Memory memory = face->root.memory; FT_Memory memory = FT_FACE_MEMORY( face );
FT_Fixed* c; FT_Fixed* c;
FT_Fixed* n; FT_Fixed* n;
@ -3105,13 +3112,13 @@
FT_Bool have_diff = 0; FT_Bool have_diff = 0;
if ( !face->blend ) if ( !ttface->blend )
{ {
if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
goto Exit; goto Exit;
} }
blend = face->blend; blend = ttface->blend;
mmvar = blend->mmvar; mmvar = blend->mmvar;
if ( num_coords > mmvar->num_axis ) if ( num_coords > mmvar->num_axis )
@ -3139,13 +3146,13 @@
} }
} }
if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ) if ( FT_IS_NAMED_INSTANCE( face ) )
{ {
FT_UInt instance_index; FT_UInt instance_index;
FT_Var_Named_Style* named_style; FT_Var_Named_Style* named_style;
instance_index = (FT_UInt)face->root.face_index >> 16; instance_index = (FT_UInt)face->face_index >> 16;
named_style = mmvar->namedstyle + instance_index - 1; named_style = mmvar->namedstyle + instance_index - 1;
n = named_style->coords + num_coords; n = named_style->coords + num_coords;
@ -3182,14 +3189,14 @@
if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
goto Exit; goto Exit;
if ( !face->blend->avar_loaded ) if ( !ttface->blend->avar_loaded )
ft_var_load_avar( face ); ft_var_load_avar( ttface );
FT_TRACE5(( "TT_Set_Var_Design:\n" )); FT_TRACE5(( "TT_Set_Var_Design:\n" ));
FT_TRACE5(( " normalized design coordinates:\n" )); FT_TRACE5(( " normalized design coordinates:\n" ));
ft_var_to_normalized( face, num_coords, blend->coords, normalized ); ft_var_to_normalized( ttface, num_coords, blend->coords, normalized );
error = tt_set_mm_blend( face, mmvar->num_axis, normalized, 0 ); error = tt_set_mm_blend( ttface, mmvar->num_axis, normalized, 0 );
if ( error ) if ( error )
goto Exit; goto Exit;
@ -3225,28 +3232,29 @@
* FreeType error code. 0~means success. * FreeType error code. 0~means success.
*/ */
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
TT_Get_Var_Design( TT_Face face, TT_Get_Var_Design( FT_Face face, /* TT_Face */
FT_UInt num_coords, FT_UInt num_coords,
FT_Fixed* coords ) FT_Fixed* coords )
{ {
FT_Error error = FT_Err_Ok; TT_Face ttface = (TT_Face)face;
FT_Error error = FT_Err_Ok;
GX_Blend blend; GX_Blend blend;
FT_UInt i, nc; FT_UInt i, nc;
if ( !face->blend ) if ( !ttface->blend )
{ {
if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
return error; return error;
} }
blend = face->blend; blend = ttface->blend;
if ( !blend->coords ) if ( !blend->coords )
{ {
/* select default instance coordinates */ /* select default instance coordinates */
/* if no instance is selected yet */ /* if no instance is selected yet */
if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) ) if ( FT_SET_ERROR( tt_set_mm_blend( ttface, 0, NULL, 1 ) ) )
return error; return error;
} }
@ -3259,7 +3267,7 @@
nc = blend->num_axis; nc = blend->num_axis;
} }
if ( face->doblend ) if ( ttface->doblend )
{ {
for ( i = 0; i < nc; i++ ) for ( i = 0; i < nc; i++ )
coords[i] = blend->coords[i]; coords[i] = blend->coords[i];
@ -3299,28 +3307,29 @@
* axis values. * axis values.
*/ */
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
TT_Set_Named_Instance( TT_Face face, TT_Set_Named_Instance( FT_Face face, /* TT_Face */
FT_UInt instance_index ) FT_UInt instance_index )
{ {
TT_Face ttface = (TT_Face)face;
FT_Error error; FT_Error error;
GX_Blend blend; GX_Blend blend;
FT_MM_Var* mmvar; FT_MM_Var* mmvar;
FT_Memory memory = face->root.memory; FT_Memory memory = FT_FACE_MEMORY( face );
FT_UInt num_instances; FT_UInt num_instances;
if ( !face->blend ) if ( !ttface->blend )
{ {
if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
goto Exit; goto Exit;
} }
blend = face->blend; blend = ttface->blend;
mmvar = blend->mmvar; mmvar = blend->mmvar;
num_instances = (FT_UInt)face->root.style_flags >> 16; num_instances = (FT_UInt)face->style_flags >> 16;
/* `instance_index' starts with value 1, thus `>' */ /* `instance_index' starts with value 1, thus `>' */
if ( instance_index > num_instances ) if ( instance_index > num_instances )
@ -3331,7 +3340,7 @@
if ( instance_index > 0 ) if ( instance_index > 0 )
{ {
SFNT_Service sfnt = (SFNT_Service)face->sfnt; SFNT_Service sfnt = (SFNT_Service)ttface->sfnt;
FT_Var_Named_Style* named_style; FT_Var_Named_Style* named_style;
FT_String* style_name; FT_String* style_name;
@ -3339,15 +3348,15 @@
named_style = mmvar->namedstyle + instance_index - 1; named_style = mmvar->namedstyle + instance_index - 1;
error = sfnt->get_name( face, error = sfnt->get_name( ttface,
(FT_UShort)named_style->strid, (FT_UShort)named_style->strid,
&style_name ); &style_name );
if ( error ) if ( error )
goto Exit; goto Exit;
/* set (or replace) style name */ /* set (or replace) style name */
FT_FREE( face->root.style_name ); FT_FREE( face->style_name );
face->root.style_name = style_name; face->style_name = style_name;
/* finally, select the named instance */ /* finally, select the named instance */
error = TT_Set_Var_Design( face, error = TT_Set_Var_Design( face,
@ -3357,8 +3366,8 @@
else else
{ {
/* restore non-VF style name */ /* restore non-VF style name */
FT_FREE( face->root.style_name ); FT_FREE( face->style_name );
if ( FT_STRDUP( face->root.style_name, face->non_var_style_name ) ) if ( FT_STRDUP( face->style_name, ttface->non_var_style_name ) )
goto Exit; goto Exit;
error = TT_Set_Var_Design( face, 0, NULL ); error = TT_Set_Var_Design( face, 0, NULL );
} }
@ -3388,19 +3397,20 @@
* FreeType error code. 0~means success. * FreeType error code. 0~means success.
*/ */
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
TT_Get_Default_Named_Instance( TT_Face face, TT_Get_Default_Named_Instance( FT_Face face,
FT_UInt *instance_index ) FT_UInt *instance_index )
{ {
FT_Error error = FT_Err_Ok; TT_Face ttface = (TT_Face)face;
FT_Error error = FT_Err_Ok;
if ( !face->blend ) if ( !ttface->blend )
{ {
if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
goto Exit; goto Exit;
} }
*instance_index = face->var_default_named_instance; *instance_index = ttface->var_default_named_instance;
Exit: Exit:
return error; return error;
@ -3411,12 +3421,13 @@
/* field in `TT_Face`. */ /* field in `TT_Face`. */
FT_LOCAL_DEF( void ) FT_LOCAL_DEF( void )
tt_construct_ps_name( TT_Face face ) tt_construct_ps_name( FT_Face face )
{ {
FT_Memory memory = face->root.memory; TT_Face ttface = (TT_Face)face;
FT_Memory memory = FT_FACE_MEMORY( face );
FT_FREE( face->postscript_name ); FT_FREE( ttface->postscript_name );
} }
@ -4452,22 +4463,25 @@
* the MM machinery in case it isn't loaded yet. * the MM machinery in case it isn't loaded yet.
*/ */
FT_LOCAL_DEF( FT_Error ) FT_LOCAL_DEF( FT_Error )
tt_get_var_blend( TT_Face face, tt_get_var_blend( FT_Face face, /* TT_Face */
FT_UInt *num_coords, FT_UInt *num_coords,
FT_Fixed* *coords, FT_Fixed* *coords,
FT_Fixed* *normalizedcoords, FT_Fixed* *normalizedcoords,
FT_MM_Var* *mm_var ) FT_MM_Var* *mm_var )
{ {
if ( face->blend ) TT_Face ttface = (TT_Face)face;
if ( ttface->blend )
{ {
if ( num_coords ) if ( num_coords )
*num_coords = face->blend->num_axis; *num_coords = ttface->blend->num_axis;
if ( coords ) if ( coords )
*coords = face->blend->coords; *coords = ttface->blend->coords;
if ( normalizedcoords ) if ( normalizedcoords )
*normalizedcoords = face->blend->normalizedcoords; *normalizedcoords = ttface->blend->normalizedcoords;
if ( mm_var ) if ( mm_var )
*mm_var = face->blend->mmvar; *mm_var = ttface->blend->mmvar;
} }
else else
{ {
@ -4484,7 +4498,7 @@
FT_LOCAL_DEF( void ) FT_LOCAL_DEF( void )
tt_var_done_item_variation_store( TT_Face face, tt_var_done_item_variation_store( FT_Face face,
GX_ItemVarStore itemStore ) GX_ItemVarStore itemStore )
{ {
FT_Memory memory = FT_FACE_MEMORY( face ); FT_Memory memory = FT_FACE_MEMORY( face );
@ -4513,7 +4527,7 @@
FT_LOCAL_DEF( void ) FT_LOCAL_DEF( void )
tt_var_done_delta_set_index_map( TT_Face face, tt_var_done_delta_set_index_map( FT_Face face,
GX_DeltaSetIdxMap deltaSetIdxMap ) GX_DeltaSetIdxMap deltaSetIdxMap )
{ {
FT_Memory memory = FT_FACE_MEMORY( face ); FT_Memory memory = FT_FACE_MEMORY( face );
@ -4533,10 +4547,11 @@
* Free the blend internal data structure. * Free the blend internal data structure.
*/ */
FT_LOCAL_DEF( void ) FT_LOCAL_DEF( void )
tt_done_blend( TT_Face face ) tt_done_blend( FT_Face face )
{ {
TT_Face ttface = (TT_Face)face;
FT_Memory memory = FT_FACE_MEMORY( face ); FT_Memory memory = FT_FACE_MEMORY( face );
GX_Blend blend = face->blend; GX_Blend blend = ttface->blend;
if ( blend ) if ( blend )

View File

@ -347,39 +347,39 @@ FT_BEGIN_HEADER
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
TT_Set_MM_Blend( TT_Face face, TT_Set_MM_Blend( FT_Face face,
FT_UInt num_coords, FT_UInt num_coords,
FT_Fixed* coords ); FT_Fixed* coords );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
TT_Get_MM_Blend( TT_Face face, TT_Get_MM_Blend( FT_Face face,
FT_UInt num_coords, FT_UInt num_coords,
FT_Fixed* coords ); FT_Fixed* coords );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
TT_Set_Var_Design( TT_Face face, TT_Set_Var_Design( FT_Face face,
FT_UInt num_coords, FT_UInt num_coords,
FT_Fixed* coords ); FT_Fixed* coords );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
TT_Get_MM_Var( TT_Face face, TT_Get_MM_Var( FT_Face face,
FT_MM_Var* *master ); FT_MM_Var* *master );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
TT_Get_Var_Design( TT_Face face, TT_Get_Var_Design( FT_Face face,
FT_UInt num_coords, FT_UInt num_coords,
FT_Fixed* coords ); FT_Fixed* coords );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
TT_Set_Named_Instance( TT_Face face, TT_Set_Named_Instance( FT_Face face,
FT_UInt instance_index ); FT_UInt instance_index );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
TT_Get_Default_Named_Instance( TT_Face face, TT_Get_Default_Named_Instance( FT_Face face,
FT_UInt *instance_index ); FT_UInt *instance_index );
FT_LOCAL( void ) FT_LOCAL( void )
tt_construct_ps_name( TT_Face face ); tt_construct_ps_name( FT_Face face );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
tt_face_vary_cvt( TT_Face face, tt_face_vary_cvt( TT_Face face,
@ -392,54 +392,54 @@ FT_BEGIN_HEADER
FT_Vector* unrounded ); FT_Vector* unrounded );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
tt_hadvance_adjust( TT_Face face, tt_hadvance_adjust( FT_Face face,
FT_UInt gindex, FT_UInt gindex,
FT_Int *adelta ); FT_Int *adelta );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
tt_vadvance_adjust( TT_Face face, tt_vadvance_adjust( FT_Face face,
FT_UInt gindex, FT_UInt gindex,
FT_Int *adelta ); FT_Int *adelta );
FT_LOCAL( void ) FT_LOCAL( void )
tt_apply_mvar( TT_Face face ); tt_apply_mvar( FT_Face face );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
tt_var_load_item_variation_store( TT_Face face, tt_var_load_item_variation_store( FT_Face face,
FT_ULong offset, FT_ULong offset,
GX_ItemVarStore itemStore ); GX_ItemVarStore itemStore );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
tt_var_load_delta_set_index_mapping( TT_Face face, tt_var_load_delta_set_index_mapping( FT_Face face,
FT_ULong offset, FT_ULong offset,
GX_DeltaSetIdxMap map, GX_DeltaSetIdxMap map,
GX_ItemVarStore itemStore, GX_ItemVarStore itemStore,
FT_ULong table_len ); FT_ULong table_len );
FT_LOCAL( FT_ItemVarDelta ) FT_LOCAL( FT_ItemVarDelta )
tt_var_get_item_delta( TT_Face face, tt_var_get_item_delta( FT_Face face,
GX_ItemVarStore itemStore, GX_ItemVarStore itemStore,
FT_UInt outerIndex, FT_UInt outerIndex,
FT_UInt innerIndex ); FT_UInt innerIndex );
FT_LOCAL( void ) FT_LOCAL( void )
tt_var_done_item_variation_store( TT_Face face, tt_var_done_item_variation_store( FT_Face face,
GX_ItemVarStore itemStore ); GX_ItemVarStore itemStore );
FT_LOCAL( void ) FT_LOCAL( void )
tt_var_done_delta_set_index_map( TT_Face face, tt_var_done_delta_set_index_map( FT_Face face,
GX_DeltaSetIdxMap deltaSetIdxMap ); GX_DeltaSetIdxMap deltaSetIdxMap );
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
tt_get_var_blend( TT_Face face, tt_get_var_blend( FT_Face face,
FT_UInt *num_coords, FT_UInt *num_coords,
FT_Fixed* *coords, FT_Fixed* *coords,
FT_Fixed* *normalizedcoords, FT_Fixed* *normalizedcoords,
FT_MM_Var* *mm_var ); FT_MM_Var* *mm_var );
FT_LOCAL( void ) FT_LOCAL( void )
tt_done_blend( TT_Face face ); tt_done_blend( FT_Face face );
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */

View File

@ -581,7 +581,7 @@
FT_Bool result = FALSE; FT_Bool result = FALSE;
TT_Face face = (TT_Face)ttface; TT_Face face = (TT_Face)ttface;
FT_UInt asize; FT_ULong asize;
FT_ULong i; FT_ULong i;
FT_ULong glyph_index = 0; FT_ULong glyph_index = 0;
FT_UInt count = 0; FT_UInt count = 0;
@ -589,7 +589,7 @@
for( i = 0; i < face->num_locations; i++ ) for( i = 0; i < face->num_locations; i++ )
{ {
tt_face_get_location( face, i, &asize ); tt_face_get_location( ttface, i, &asize );
if ( asize > 0 ) if ( asize > 0 )
{ {
count += 1; count += 1;
@ -854,7 +854,7 @@
face->cvt_program_size = 0; face->cvt_program_size = 0;
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
tt_done_blend( face ); tt_done_blend( ttface );
face->blend = NULL; face->blend = NULL;
#endif #endif
} }

View File

@ -180,10 +180,11 @@
FT_LOCAL_DEF( FT_ULong ) FT_LOCAL_DEF( FT_ULong )
tt_face_get_location( TT_Face face, tt_face_get_location( FT_Face face, /* TT_Face */
FT_UInt gindex, FT_UInt gindex,
FT_UInt *asize ) FT_ULong *asize )
{ {
TT_Face ttface = (TT_Face)face;
FT_ULong pos1, pos2; FT_ULong pos1, pos2;
FT_Byte* p; FT_Byte* p;
FT_Byte* p_limit; FT_Byte* p_limit;
@ -191,12 +192,12 @@
pos1 = pos2 = 0; pos1 = pos2 = 0;
if ( gindex < face->num_locations ) if ( gindex < ttface->num_locations )
{ {
if ( face->header.Index_To_Loc_Format != 0 ) if ( ttface->header.Index_To_Loc_Format != 0 )
{ {
p = face->glyph_locations + gindex * 4; p = ttface->glyph_locations + gindex * 4;
p_limit = face->glyph_locations + face->num_locations * 4; p_limit = ttface->glyph_locations + ttface->num_locations * 4;
pos1 = FT_NEXT_ULONG( p ); pos1 = FT_NEXT_ULONG( p );
pos2 = pos1; pos2 = pos1;
@ -206,8 +207,8 @@
} }
else else
{ {
p = face->glyph_locations + gindex * 2; p = ttface->glyph_locations + gindex * 2;
p_limit = face->glyph_locations + face->num_locations * 2; p_limit = ttface->glyph_locations + ttface->num_locations * 2;
pos1 = FT_NEXT_USHORT( p ); pos1 = FT_NEXT_USHORT( p );
pos2 = pos1; pos2 = pos1;
@ -221,30 +222,30 @@
} }
/* Check broken location data. */ /* Check broken location data. */
if ( pos1 > face->glyf_len ) if ( pos1 > ttface->glyf_len )
{ {
FT_TRACE1(( "tt_face_get_location:" FT_TRACE1(( "tt_face_get_location:"
" too large offset (0x%08lx) found for glyph index %d,\n", " too large offset (0x%08lx) found for glyph index %d,\n",
pos1, gindex )); pos1, gindex ));
FT_TRACE1(( " " FT_TRACE1(( " "
" exceeding the end of `glyf' table (0x%08lx)\n", " exceeding the end of `glyf' table (0x%08lx)\n",
face->glyf_len )); ttface->glyf_len ));
*asize = 0; *asize = 0;
return 0; return 0;
} }
if ( pos2 > face->glyf_len ) if ( pos2 > ttface->glyf_len )
{ {
/* We try to sanitize the last `loca' entry. */ /* We try to sanitize the last `loca' entry. */
if ( gindex == face->num_locations - 2 ) if ( gindex == ttface->num_locations - 2 )
{ {
FT_TRACE1(( "tt_face_get_location:" FT_TRACE1(( "tt_face_get_location:"
" too large size (%ld bytes) found for glyph index %d,\n", " too large size (%ld bytes) found for glyph index %d,\n",
pos2 - pos1, gindex )); pos2 - pos1, gindex ));
FT_TRACE1(( " " FT_TRACE1(( " "
" truncating at the end of `glyf' table to %ld bytes\n", " truncating at the end of `glyf' table to %ld bytes\n",
face->glyf_len - pos1 )); ttface->glyf_len - pos1 ));
pos2 = face->glyf_len; pos2 = ttface->glyf_len;
} }
else else
{ {
@ -253,7 +254,7 @@
pos2, gindex + 1 )); pos2, gindex + 1 ));
FT_TRACE1(( " " FT_TRACE1(( " "
" exceeding the end of `glyf' table (0x%08lx)\n", " exceeding the end of `glyf' table (0x%08lx)\n",
face->glyf_len )); ttface->glyf_len ));
*asize = 0; *asize = 0;
return 0; return 0;
} }
@ -268,9 +269,9 @@
/* We get (intentionally) a wrong, non-zero result in case the */ /* We get (intentionally) a wrong, non-zero result in case the */
/* `glyf' table is missing. */ /* `glyf' table is missing. */
if ( pos2 >= pos1 ) if ( pos2 >= pos1 )
*asize = (FT_UInt)( pos2 - pos1 ); *asize = (FT_ULong)( pos2 - pos1 );
else else
*asize = (FT_UInt)( face->glyf_len - pos1 ); *asize = (FT_ULong)( ttface->glyf_len - pos1 );
return pos1; return pos1;
} }

View File

@ -31,9 +31,9 @@ FT_BEGIN_HEADER
FT_Stream stream ); FT_Stream stream );
FT_LOCAL( FT_ULong ) FT_LOCAL( FT_ULong )
tt_face_get_location( TT_Face face, tt_face_get_location( FT_Face face,
FT_UInt gindex, FT_UInt gindex,
FT_UInt *asize ); FT_ULong *asize );
FT_LOCAL( void ) FT_LOCAL( void )
tt_face_done_loca( TT_Face face ); tt_face_done_loca( TT_Face face );