* src/bdf/bdfdrivr.c: 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-06 19:15:01 +02:00
parent c041411917
commit bc7466ad45
1 changed files with 60 additions and 56 deletions

View File

@ -311,9 +311,9 @@ THE SOFTWARE.
FT_CALLBACK_DEF( void )
BDF_Face_Done( FT_Face bdfface ) /* BDF_Face */
BDF_Face_Done( FT_Face face ) /* BDF_Face */
{
BDF_Face face = (BDF_Face)bdfface;
BDF_Face bdfface = (BDF_Face)face;
FT_Memory memory;
@ -322,31 +322,31 @@ THE SOFTWARE.
memory = FT_FACE_MEMORY( face );
bdf_free_font( face->bdffont );
bdf_free_font( bdfface->bdffont );
FT_FREE( face->en_table );
FT_FREE( bdfface->en_table );
FT_FREE( face->charset_encoding );
FT_FREE( face->charset_registry );
FT_FREE( bdfface->family_name );
FT_FREE( bdfface->style_name );
FT_FREE( bdfface->charset_encoding );
FT_FREE( bdfface->charset_registry );
FT_FREE( face->family_name );
FT_FREE( face->style_name );
FT_FREE( bdfface->available_sizes );
FT_FREE( face->available_sizes );
FT_FREE( face->bdffont );
FT_FREE( bdfface->bdffont );
}
FT_CALLBACK_DEF( FT_Error )
BDF_Face_Init( FT_Stream stream,
FT_Face bdfface, /* BDF_Face */
FT_Face face, /* BDF_Face */
FT_Int face_index,
FT_Int num_params,
FT_Parameter* params )
{
FT_Error error = FT_Err_Ok;
BDF_Face face = (BDF_Face)bdfface;
FT_Memory memory = FT_FACE_MEMORY( face );
FT_Error error = FT_Err_Ok;
BDF_Face bdfface = (BDF_Face)face;
FT_Memory memory = FT_FACE_MEMORY( face );
bdf_font_t* font = NULL;
bdf_options_t options;
@ -375,7 +375,7 @@ THE SOFTWARE.
goto Exit;
/* we have a bdf font: let's construct the face object */
face->bdffont = font;
bdfface->bdffont = font;
/* BDF cannot have multiple faces in a single font file.
* XXX: non-zero face_index is already invalid argument, but
@ -386,7 +386,7 @@ THE SOFTWARE.
if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 )
{
FT_ERROR(( "BDF_Face_Init: invalid face index\n" ));
BDF_Face_Done( bdfface );
BDF_Face_Done( face );
return FT_THROW( Invalid_Argument );
}
@ -401,18 +401,18 @@ THE SOFTWARE.
font->unencoded_size,
font->unencoded_used ));
bdfface->num_faces = 1;
bdfface->face_index = 0;
face->num_faces = 1;
face->face_index = 0;
bdfface->face_flags |= FT_FACE_FLAG_FIXED_SIZES |
FT_FACE_FLAG_HORIZONTAL;
face->face_flags |= FT_FACE_FLAG_FIXED_SIZES |
FT_FACE_FLAG_HORIZONTAL;
prop = bdf_get_font_property( font, "SPACING" );
if ( prop && prop->format == BDF_ATOM &&
prop->value.atom &&
( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' ||
*(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) )
bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
face->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
/* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */
/* FZ XXX: I need a font to implement this */
@ -420,26 +420,27 @@ THE SOFTWARE.
prop = bdf_get_font_property( font, "FAMILY_NAME" );
if ( prop && prop->value.atom )
{
if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) )
if ( FT_STRDUP( face->family_name, prop->value.atom ) )
goto Exit;
}
else
bdfface->family_name = NULL;
face->family_name = NULL;
if ( FT_SET_ERROR( bdf_interpret_style( face ) ) )
if ( FT_SET_ERROR( bdf_interpret_style( bdfface ) ) )
goto Exit;
/* the number of glyphs (with one slot for the undefined glyph */
/* at position 0 and all unencoded glyphs) */
bdfface->num_glyphs = (FT_Long)( font->glyphs_size + 1 );
face->num_glyphs = (FT_Long)( font->glyphs_size + 1 );
bdfface->num_fixed_sizes = 1;
if ( FT_NEW( bdfface->available_sizes ) )
face->num_fixed_sizes = 1;
if ( FT_NEW( face->available_sizes ) )
goto Exit;
{
FT_Bitmap_Size* bsize = bdfface->available_sizes;
FT_Short resolution_x = 0, resolution_y = 0;
FT_Bitmap_Size* bsize = face->available_sizes;
FT_Short resolution_x = 0;
FT_Short resolution_y = 0;
long value;
@ -598,20 +599,20 @@ THE SOFTWARE.
unsigned long n;
if ( FT_QNEW_ARRAY( face->en_table, font->glyphs_size ) )
if ( FT_QNEW_ARRAY( bdfface->en_table, font->glyphs_size ) )
goto Exit;
face->default_glyph = 0;
bdfface->default_glyph = 0;
for ( n = 0; n < font->glyphs_size; n++ )
{
(face->en_table[n]).enc = cur[n].encoding;
(bdfface->en_table[n]).enc = cur[n].encoding;
FT_TRACE4(( " idx %ld, val 0x%lX\n", n, cur[n].encoding ));
(face->en_table[n]).glyph = (FT_UShort)n;
(bdfface->en_table[n]).glyph = (FT_UShort)n;
if ( cur[n].encoding == font->default_char )
{
if ( n < FT_UINT_MAX )
face->default_glyph = (FT_UInt)n;
bdfface->default_glyph = (FT_UInt)n;
else
FT_TRACE1(( "BDF_Face_Init:"
" idx %ld is too large for this system\n", n ));
@ -639,27 +640,27 @@ THE SOFTWARE.
const char* s;
if ( FT_STRDUP( face->charset_encoding,
if ( FT_STRDUP( bdfface->charset_encoding,
charset_encoding->value.atom ) ||
FT_STRDUP( face->charset_registry,
FT_STRDUP( bdfface->charset_registry,
charset_registry->value.atom ) )
goto Exit;
/* Uh, oh, compare first letters manually to avoid dependency */
/* on locales. */
s = face->charset_registry;
s = bdfface->charset_registry;
if ( ( s[0] == 'i' || s[0] == 'I' ) &&
( s[1] == 's' || s[1] == 'S' ) &&
( s[2] == 'o' || s[2] == 'O' ) )
{
s += 3;
if ( !ft_strcmp( s, "10646" ) ||
( !ft_strcmp( s, "8859" ) &&
!ft_strcmp( face->charset_encoding, "1" ) ) )
if ( !ft_strcmp( s, "10646" ) ||
( !ft_strcmp( s, "8859" ) &&
!ft_strcmp( bdfface->charset_encoding, "1" ) ) )
unicode_charmap = 1;
/* another name for ASCII */
else if ( !ft_strcmp( s, "646.1991" ) &&
!ft_strcmp( face->charset_encoding, "IRV" ) )
else if ( !ft_strcmp( s, "646.1991" ) &&
!ft_strcmp( bdfface->charset_encoding, "IRV" ) )
unicode_charmap = 1;
}
@ -667,7 +668,7 @@ THE SOFTWARE.
FT_CharMapRec charmap;
charmap.face = FT_FACE( face );
charmap.face = face;
charmap.encoding = FT_ENCODING_NONE;
/* initial platform/encoding should indicate unset status? */
charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;
@ -693,7 +694,7 @@ THE SOFTWARE.
FT_CharMapRec charmap;
charmap.face = FT_FACE( face );
charmap.face = face;
charmap.encoding = FT_ENCODING_ADOBE_STANDARD;
charmap.platform_id = TT_PLATFORM_ADOBE;
charmap.encoding_id = TT_ADOBE_ID_STANDARD;
@ -701,8 +702,8 @@ THE SOFTWARE.
error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL );
/* Select default charmap */
if ( bdfface->num_charmaps )
bdfface->charmap = bdfface->charmaps[0];
if ( face->num_charmaps )
face->charmap = face->charmaps[0];
}
}
}
@ -711,7 +712,7 @@ THE SOFTWARE.
return error;
Fail:
BDF_Face_Done( bdfface );
BDF_Face_Done( face );
return FT_THROW( Unknown_File_Format );
}
@ -868,17 +869,18 @@ THE SOFTWARE.
*
*/
static FT_Error
bdf_get_bdf_property( BDF_Face face,
FT_CALLBACK_DEF( FT_Error )
bdf_get_bdf_property( FT_Face face, /* BDF_Face */
const char* prop_name,
BDF_PropertyRec *aproperty )
{
BDF_Face bdfface = (BDF_Face)face;
bdf_property_t* prop;
FT_ASSERT( face && face->bdffont );
FT_ASSERT( bdfface && bdfface->bdffont );
prop = bdf_get_font_property( face->bdffont, prop_name );
prop = bdf_get_font_property( bdfface->bdffont, prop_name );
if ( prop )
{
switch ( prop->format )
@ -921,13 +923,16 @@ THE SOFTWARE.
}
static FT_Error
bdf_get_charset_id( BDF_Face face,
FT_CALLBACK_DEF( FT_Error )
bdf_get_charset_id( FT_Face face, /* BDF_Face */
const char* *acharset_encoding,
const char* *acharset_registry )
{
*acharset_encoding = face->charset_encoding;
*acharset_registry = face->charset_registry;
BDF_Face bdfface = (BDF_Face)face;
*acharset_encoding = bdfface->charset_encoding;
*acharset_registry = bdfface->charset_registry;
return 0;
}
@ -964,7 +969,6 @@ THE SOFTWARE.
}
FT_CALLBACK_TABLE_DEF
const FT_Driver_ClassRec bdf_driver_class =
{