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