[pcf] Massive unsigning (part 2).

Treat all size related properties as unsigned values.

* src/pcf/pcf.h (PCF_ParsePropertyRec): Use unsigned `name' and
`value'.
* src/pcf/pcfread.c (pcf_get_propeerties, pcf_load_font): Updated
parsing code and handling of AVERAGE_WIDTH, POINT_SIZE, PIXEL_SIZE,
RESOLUTION_X and RESOLUTION_Y.
This commit is contained in:
Alexei Podtelezhnikov 2018-08-08 01:21:54 -04:00
parent 3d4ab6bac1
commit c633378a5e
3 changed files with 41 additions and 53 deletions

View File

@ -1,3 +1,15 @@
2018-08-08 Alexei Podtelezhnikov <apodtele@gmail.com>
[pcf] Massive unsigning (part 2).
Treat all size related properties as unsigned values.
* src/pcf/pcf.h (PCF_ParsePropertyRec): Use unsigned `name' and
`value'.
* src/pcf/pcfread.c (pcf_get_propeerties, pcf_load_font): Updated
parsing code and handling of AVERAGE_WIDTH, POINT_SIZE, PIXEL_SIZE,
RESOLUTION_X and RESOLUTION_Y.
2018-08-08 Alexei Podtelezhnikov <apodtele@gmail.com> 2018-08-08 Alexei Podtelezhnikov <apodtele@gmail.com>
[pcf] Massive unsigning (part 1). [pcf] Massive unsigning (part 1).

View File

@ -57,9 +57,9 @@ FT_BEGIN_HEADER
typedef struct PCF_ParsePropertyRec_ typedef struct PCF_ParsePropertyRec_
{ {
FT_Long name; FT_ULong name;
FT_Byte isString; FT_Byte isString;
FT_Long value; FT_ULong value;
} PCF_ParsePropertyRec, *PCF_ParseProperty; } PCF_ParsePropertyRec, *PCF_ParseProperty;

View File

@ -239,7 +239,7 @@ THE SOFTWARE.
{ {
for ( j = 0; j < sizeof ( tableNames ) / sizeof ( tableNames[0] ); for ( j = 0; j < sizeof ( tableNames ) / sizeof ( tableNames[0] );
j++ ) j++ )
if ( tables[i].type == (FT_UInt)( 1 << j ) ) if ( tables[i].type == ( 1U << j ) )
name = tableNames[j]; name = tableNames[j];
FT_TRACE4(( " %d: type=%s, format=0x%X," FT_TRACE4(( " %d: type=%s, format=0x%X,"
@ -433,9 +433,9 @@ THE SOFTWARE.
#define FT_STRUCTURE PCF_ParsePropertyRec #define FT_STRUCTURE PCF_ParsePropertyRec
FT_FRAME_START( PCF_PROPERTY_SIZE ), FT_FRAME_START( PCF_PROPERTY_SIZE ),
FT_FRAME_LONG_LE( name ), FT_FRAME_ULONG_LE( name ),
FT_FRAME_BYTE ( isString ), FT_FRAME_BYTE ( isString ),
FT_FRAME_LONG_LE( value ), FT_FRAME_ULONG_LE( value ),
FT_FRAME_END FT_FRAME_END
}; };
@ -447,9 +447,9 @@ THE SOFTWARE.
#define FT_STRUCTURE PCF_ParsePropertyRec #define FT_STRUCTURE PCF_ParsePropertyRec
FT_FRAME_START( PCF_PROPERTY_SIZE ), FT_FRAME_START( PCF_PROPERTY_SIZE ),
FT_FRAME_LONG( name ), FT_FRAME_ULONG( name ),
FT_FRAME_BYTE( isString ), FT_FRAME_BYTE ( isString ),
FT_FRAME_LONG( value ), FT_FRAME_ULONG( value ),
FT_FRAME_END FT_FRAME_END
}; };
@ -623,11 +623,10 @@ THE SOFTWARE.
FT_TRACE4(( "\n" )); FT_TRACE4(( "\n" ));
for ( i = 0; i < nprops; i++ ) for ( i = 0; i < nprops; i++ )
{ {
FT_Long name_offset = props[i].name; FT_ULong name_offset = props[i].name;
if ( ( name_offset < 0 ) || if ( name_offset > string_size )
( (FT_ULong)name_offset > string_size ) )
{ {
error = FT_THROW( Invalid_Offset ); error = FT_THROW( Invalid_Offset );
goto Bail; goto Bail;
@ -642,11 +641,10 @@ THE SOFTWARE.
if ( props[i].isString ) if ( props[i].isString )
{ {
FT_Long value_offset = props[i].value; FT_ULong value_offset = props[i].value;
if ( ( value_offset < 0 ) || if ( value_offset > string_size )
( (FT_ULong)value_offset > string_size ) )
{ {
error = FT_THROW( Invalid_Offset ); error = FT_THROW( Invalid_Offset );
goto Bail; goto Bail;
@ -659,7 +657,7 @@ THE SOFTWARE.
} }
else else
{ {
properties[i].value.l = props[i].value; properties[i].value.ul = props[i].value;
FT_TRACE4(( " %d\n", properties[i].value.l )); FT_TRACE4(( " %d\n", properties[i].value.l ));
} }
@ -1571,94 +1569,72 @@ THE SOFTWARE.
prop = pcf_find_property( face, "AVERAGE_WIDTH" ); prop = pcf_find_property( face, "AVERAGE_WIDTH" );
if ( prop ) if ( prop )
{ {
#ifdef FT_DEBUG_LEVEL_TRACE if ( prop->value.ul > 0x7FFFUL * 10 - 5 )
if ( prop->value.l < 0 )
FT_TRACE0(( "pcf_load_font: negative average width\n" ));
#endif
if ( ( FT_ABS( prop->value.l ) > 0x7FFFL * 10 - 5 ) )
{ {
bsize->width = 0x7FFF; bsize->width = 0x7FFF;
FT_TRACE0(( "pcf_load_font: clamping average width to value %d\n", FT_TRACE0(( "pcf_load_font: clamping average width to value %hd\n",
bsize->width )); bsize->width ));
} }
else else
bsize->width = FT_ABS( (FT_Short)( ( prop->value.l + 5 ) / 10 ) ); bsize->width = (FT_Short)( ( prop->value.ul + 5 ) / 10 );
} }
else else
{ {
/* this is a heuristical value */ /* this is a heuristical value */
bsize->width = (FT_Short)FT_MulDiv( bsize->height, 2, 3 ); bsize->width = bsize->height - bsize->height / 3;
} }
prop = pcf_find_property( face, "POINT_SIZE" ); prop = pcf_find_property( face, "POINT_SIZE" );
if ( prop ) if ( prop )
{ {
#ifdef FT_DEBUG_LEVEL_TRACE
if ( prop->value.l < 0 )
FT_TRACE0(( "pcf_load_font: negative point size\n" ));
#endif
/* convert from 722.7 decipoints to 72 points per inch */ /* convert from 722.7 decipoints to 72 points per inch */
if ( FT_ABS( prop->value.l ) > 0x504C2L ) /* 0x7FFF * 72270/7200 */ if ( prop->value.ul > 0x504C2UL ) /* 0x7FFF * 72270/7200 */
{ {
bsize->size = 0x7FFF; bsize->size = 0x7FFF;
FT_TRACE0(( "pcf_load_font: clamping point size to value %d\n", FT_TRACE0(( "pcf_load_font: clamping point size to value %d\n",
bsize->size )); bsize->size ));
} }
else else
bsize->size = FT_MulDiv( FT_ABS( prop->value.l ), bsize->size = FT_MulDiv( prop->value.l, 64 * 7200, 72270L );
64 * 7200,
72270L );
} }
prop = pcf_find_property( face, "PIXEL_SIZE" ); prop = pcf_find_property( face, "PIXEL_SIZE" );
if ( prop ) if ( prop )
{ {
#ifdef FT_DEBUG_LEVEL_TRACE if ( prop->value.ul > 0x7FFFU )
if ( prop->value.l < 0 )
FT_TRACE0(( "pcf_load_font: negative pixel size\n" ));
#endif
if ( FT_ABS( prop->value.l ) > 0x7FFF )
{ {
bsize->y_ppem = 0x7FFF << 6; bsize->y_ppem = 0x7FFF * 64;
FT_TRACE0(( "pcf_load_font: clamping pixel size to value %d\n", FT_TRACE0(( "pcf_load_font: clamping pixel size to value %d\n",
bsize->y_ppem )); bsize->y_ppem ));
} }
else else
bsize->y_ppem = FT_ABS( (FT_Short)prop->value.l ) << 6; bsize->y_ppem = (FT_Pos)prop->value.ul * 64;
} }
prop = pcf_find_property( face, "RESOLUTION_X" ); prop = pcf_find_property( face, "RESOLUTION_X" );
if ( prop ) if ( prop )
{ {
#ifdef FT_DEBUG_LEVEL_TRACE if ( prop->value.ul > 0x7FFFU )
if ( prop->value.l < 0 )
FT_TRACE0(( "pcf_load_font: negative X resolution\n" ));
#endif
if ( FT_ABS( prop->value.l ) > 0x7FFF )
{ {
resolution_x = 0x7FFF; resolution_x = 0x7FFF;
FT_TRACE0(( "pcf_load_font: clamping X resolution to value %d\n", FT_TRACE0(( "pcf_load_font: clamping X resolution to value %hd\n",
resolution_x )); resolution_x ));
} }
else else
resolution_x = FT_ABS( (FT_Short)prop->value.l ); resolution_x = (FT_Short)prop->value.ul;
} }
prop = pcf_find_property( face, "RESOLUTION_Y" ); prop = pcf_find_property( face, "RESOLUTION_Y" );
if ( prop ) if ( prop )
{ {
#ifdef FT_DEBUG_LEVEL_TRACE if ( prop->value.ul > 0x7FFFU )
if ( prop->value.l < 0 )
FT_TRACE0(( "pcf_load_font: negative Y resolution\n" ));
#endif
if ( FT_ABS( prop->value.l ) > 0x7FFF )
{ {
resolution_y = 0x7FFF; resolution_y = 0x7FFF;
FT_TRACE0(( "pcf_load_font: clamping Y resolution to value %d\n", FT_TRACE0(( "pcf_load_font: clamping Y resolution to value %d\n",
resolution_y )); resolution_y ));
} }
else else
resolution_y = FT_ABS( (FT_Short)prop->value.l ); resolution_y = (FT_Short)prop->value.ul;
} }
if ( bsize->y_ppem == 0 ) if ( bsize->y_ppem == 0 )