ref: 03ccfd004fcfd3fab4a0c0cea307bdcb0cd79129
parent: 3d7e53f6a85bdf988fadede50148d1351e914738
author: Werner Lemberg <[email protected]>
date: Sun Feb 22 03:25:16 EST 2015
[pcf] Signedness fixes. * src/pcf/pcf.h, src/pcf/pcfdrivr.c: Apply. * src/pcf/pcfread.c: Apply. (pcf_get_encodings): Ignore invalid negative encoding offsets.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-02-22 Werner Lemberg <[email protected]>
+
+ [pcf] Signedness fixes.
+
+ * src/pcf/pcf.h, src/pcf/pcfdrivr.c: Apply.
+ * src/pcf/pcfread.c: Apply.
+ (pcf_get_encodings): Ignore invalid negative encoding offsets.
+
2015-02-21 Werner Lemberg <[email protected]>
* src/winfonts/winfnt.c: Signedness fixes.
--- a/src/pcf/pcf.h
+++ b/src/pcf/pcf.h
@@ -148,9 +148,9 @@
int nprops;
PCF_Property properties;
- FT_Long nmetrics;
+ FT_ULong nmetrics;
PCF_Metric metrics;
- FT_Long nencodings;
+ FT_ULong nencodings;
PCF_Encoding encodings;
FT_Short defaultChar;
--- a/src/pcf/pcfdrivr.c
+++ b/src/pcf/pcfdrivr.c
@@ -64,7 +64,7 @@
typedef struct PCF_CMapRec_
{
FT_CMapRec root;
- FT_UInt num_encodings;
+ FT_ULong num_encodings;
PCF_Encoding encodings;
} PCF_CMapRec, *PCF_CMap;
@@ -80,7 +80,7 @@
FT_UNUSED( init_data );
- cmap->num_encodings = (FT_UInt)face->nencodings;
+ cmap->num_encodings = face->nencodings;
cmap->encodings = face->encodings;
return FT_Err_Ok;
@@ -104,7 +104,7 @@
{
PCF_CMap cmap = (PCF_CMap)pcfcmap;
PCF_Encoding encodings = cmap->encodings;
- FT_UInt min, max, mid;
+ FT_ULong min, max, mid;
FT_UInt result = 0;
@@ -117,7 +117,7 @@
mid = ( min + max ) >> 1;
- code = encodings[mid].enc;
+ code = (FT_ULong)encodings[mid].enc;
if ( charcode == code )
{
@@ -141,7 +141,7 @@
{
PCF_CMap cmap = (PCF_CMap)pcfcmap;
PCF_Encoding encodings = cmap->encodings;
- FT_UInt min, max, mid;
+ FT_ULong min, max, mid;
FT_ULong charcode = *acharcode + 1;
FT_UInt result = 0;
@@ -155,7 +155,7 @@
mid = ( min + max ) >> 1;
- code = encodings[mid].enc;
+ code = (FT_ULong)encodings[mid].enc;
if ( charcode == code )
{
@@ -172,7 +172,7 @@
charcode = 0;
if ( min < cmap->num_encodings )
{
- charcode = encodings[min].enc;
+ charcode = (FT_ULong)encodings[min].enc;
result = encodings[min].glyph + 1;
}
@@ -487,7 +487,7 @@
FT_Error error = FT_Err_Ok;
FT_Bitmap* bitmap = &slot->bitmap;
PCF_Metric metric;
- FT_Offset bytes;
+ FT_ULong bytes;
FT_UNUSED( load_flags );
@@ -513,8 +513,10 @@
metric = face->metrics + glyph_index;
- bitmap->rows = metric->ascent + metric->descent;
- bitmap->width = metric->rightSideBearing - metric->leftSideBearing;
+ bitmap->rows = (unsigned int)( metric->ascent +
+ metric->descent );
+ bitmap->width = (unsigned int)( metric->rightSideBearing -
+ metric->leftSideBearing );
bitmap->num_grays = 1;
bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
@@ -526,19 +528,19 @@
switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) )
{
case 1:
- bitmap->pitch = ( bitmap->width + 7 ) >> 3;
+ bitmap->pitch = (int)( ( bitmap->width + 7 ) >> 3 );
break;
case 2:
- bitmap->pitch = ( ( bitmap->width + 15 ) >> 4 ) << 1;
+ bitmap->pitch = (int)( ( ( bitmap->width + 15 ) >> 4 ) << 1 );
break;
case 4:
- bitmap->pitch = ( ( bitmap->width + 31 ) >> 5 ) << 2;
+ bitmap->pitch = (int)( ( ( bitmap->width + 31 ) >> 5 ) << 2 );
break;
case 8:
- bitmap->pitch = ( ( bitmap->width + 63 ) >> 6 ) << 3;
+ bitmap->pitch = (int)( ( ( bitmap->width + 63 ) >> 6 ) << 3 );
break;
default:
@@ -546,7 +548,7 @@
}
/* XXX: to do: are there cases that need repadding the bitmap? */
- bytes = bitmap->pitch * bitmap->rows;
+ bytes = (FT_ULong)bitmap->pitch * bitmap->rows;
error = ft_glyphslot_alloc_bitmap( slot, (FT_ULong)bytes );
if ( error )
@@ -581,12 +583,12 @@
slot->bitmap_left = metric->leftSideBearing;
slot->bitmap_top = metric->ascent;
- slot->metrics.horiAdvance = metric->characterWidth << 6;
- slot->metrics.horiBearingX = metric->leftSideBearing << 6;
- slot->metrics.horiBearingY = metric->ascent << 6;
- slot->metrics.width = ( metric->rightSideBearing -
- metric->leftSideBearing ) << 6;
- slot->metrics.height = bitmap->rows << 6;
+ slot->metrics.horiAdvance = (FT_Pos)( metric->characterWidth << 6 );
+ slot->metrics.horiBearingX = (FT_Pos)( metric->leftSideBearing << 6 );
+ slot->metrics.horiBearingY = (FT_Pos)( metric->ascent << 6 );
+ slot->metrics.width = (FT_Pos)( ( metric->rightSideBearing -
+ metric->leftSideBearing ) << 6 );
+ slot->metrics.height = (FT_Pos)( bitmap->rows << 6 );
ft_synthesize_vertical_metrics( &slot->metrics,
( face->accel.fontAscent +
--- a/src/pcf/pcfread.c
+++ b/src/pcf/pcfread.c
@@ -485,9 +485,9 @@
goto Bail;
FT_TRACE4(( " nprop = %d (truncate %d props)\n",
- (int)nprops, nprops - (int)nprops ));
+ (int)nprops, nprops - (FT_ULong)(int)nprops ));
- nprops = (int)nprops;
+ nprops = (FT_ULong)(int)nprops;
/* rough estimate */
if ( nprops > size / PCF_PROPERTY_SIZE )
@@ -766,8 +766,7 @@
FT_TRACE4(( " number of bitmaps: %d\n", nbitmaps ));
- /* XXX: PCF_Face->nmetrics is signed FT_Long, see pcf.h */
- if ( face->nmetrics < 0 || nbitmaps != (FT_ULong)face->nmetrics )
+ if ( nbitmaps != face->nmetrics )
return FT_THROW( Invalid_File_Format );
if ( FT_NEW_ARRAY( offsets, nbitmaps ) )
@@ -795,9 +794,10 @@
if ( error )
goto Bail;
- sizebitmaps = bitmapSizes[PCF_GLYPH_PAD_INDEX( format )];
+ sizebitmaps = (FT_ULong)bitmapSizes[PCF_GLYPH_PAD_INDEX( format )];
- FT_TRACE4(( " padding %d implies a size of %ld\n", i, bitmapSizes[i] ));
+ FT_TRACE4(( " padding %d implies a size of %ld\n",
+ i, bitmapSizes[i] ));
}
FT_TRACE4(( " %d bitmaps, padding index %ld\n",
@@ -817,7 +817,7 @@
" invalid offset to bitmap data of glyph %d\n", i ));
}
else
- face->metrics[i].bits = stream->pos + offsets[i];
+ face->metrics[i].bits = stream->pos + (FT_ULong)offsets[i];
}
face->bitmapsFormat = format;
@@ -837,8 +837,10 @@
FT_ULong format, size;
int firstCol, lastCol;
int firstRow, lastRow;
- int nencoding, encodingOffset;
- int i, j, k;
+ FT_ULong nencoding;
+ int encodingOffset;
+ int i, j;
+ FT_ULong k;
PCF_Encoding encoding = NULL;
@@ -893,7 +895,8 @@
FT_TRACE4(( " firstCol %d, lastCol %d, firstRow %d, lastRow %d\n",
firstCol, lastCol, firstRow, lastRow ));
- nencoding = ( lastCol - firstCol + 1 ) * ( lastRow - firstRow + 1 );
+ nencoding = (FT_ULong)( lastCol - firstCol + 1 ) *
+ (FT_ULong)( lastRow - firstRow + 1 );
if ( FT_NEW_ARRAY( encoding, nencoding ) )
return FT_THROW( Out_Of_Memory );
@@ -912,10 +915,10 @@
else
encodingOffset = FT_GET_SHORT_LE();
- if ( encodingOffset != -1 )
+ if ( encodingOffset > -1 )
{
encoding[k].enc = i * 256 + j;
- encoding[k].glyph = (FT_Short)encodingOffset;
+ encoding[k].glyph = (FT_UShort)encodingOffset;
FT_TRACE5(( " code %d (0x%04X): idx %d\n",
encoding[k].enc, encoding[k].enc, encoding[k].glyph ));
@@ -1256,7 +1259,7 @@
*
* This implies bumping the number of `available' glyphs by 1.
*/
- root->num_glyphs = face->nmetrics + 1;
+ root->num_glyphs = (FT_Long)( face->nmetrics + 1 );
root->num_fixed_sizes = 1;
if ( FT_NEW_ARRAY( root->available_sizes, 1 ) )