ref: e12ed563d600299fc7e009311ed412be6fde4188
parent: 815911ae2aac36e581fb7bc2a24024859f6d2771
author: Werner Lemberg <[email protected]>
date: Sun Jun 17 01:31:23 EDT 2007
* src/tools/ftrandom.c (font_size): New global variable. (TestFace): Use it. (main): Handle new option `--size' to set `font_size'. (Usage): Updated. Formatting.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,14 +1,24 @@
-2006-06-16 David Turner <[email protected]>
+2006-06-17 Werner Lemberg <[email protected]>
- * src/smooth/ftgrays.c (gray_hline): prevent integer overflows
- when rendering *very* large outlines
+ * src/tools/ftrandom.c (font_size): New global variable.
+ (TestFace): Use it.
+ (main): Handle new option `--size' to set `font_size'.
+ (Usage): Updated.
- * src/truetype/ttgload.c (TT_Load_Simple_Glyph): check the well-formedness
- of the contours array when loading a glyph
+2006-06-16 David Turner <[email protected]>
- * src/truetype/ttinterp.c (Ins_IP): check argument ranges to reject
- bogus operations properly
+ * src/smooth/ftgrays.c (gray_find_cell, gray_set_cell, gray_hline):
+ Prevent integer overflows when rendering very large outlines.
+ * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check the
+ well-formedness of the contours array when loading a glyph.
+
+ * src/truetype/ttinterp.c (TT_Load_Context): Initialize `zp0', `zp1',
+ and `zp2'.
+ (Ins_IP): Check argument ranges to reject bogus operations properly.
+ (IUP_WorkerRec): Add `max_points' member.
+ (_iup_worker_interpolate): Check argument ranges.
+ (Ins_IUP): Ignore empty outlines.
2006-06-16 Dmitry Timoshkov <[email protected]>
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -197,7 +197,7 @@
#define ONE_PIXEL ( 1L << PIXEL_BITS )
#define PIXEL_MASK ( -1L << PIXEL_BITS )
-#define TRUNC( x ) ( (TCoord)((x) >> PIXEL_BITS) )
+#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) )
#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS )
#define FLOOR( x ) ( (x) & -ONE_PIXEL )
#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )
@@ -397,7 +397,8 @@
PCell *pcell, cell;
int x = ras.ex;
- if (x > ras.max_ex)
+
+ if ( x > ras.max_ex )
x = ras.max_ex;
pcell = &ras.ycells[ras.ey];
@@ -465,7 +466,7 @@
/* min_ex - 1 horizontal position. */
ey -= ras.min_ey;
- if (ex > ras.max_ex)
+ if ( ex > ras.max_ex )
ex = ras.max_ex;
ex -= ras.min_ex;
@@ -1206,7 +1207,7 @@
x += (TCoord)ras.min_ex;
/* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */
- if (x >= 32768)
+ if ( x >= 32768 )
x = 32767;
if ( coverage )
--- a/src/tools/ftrandom/ftrandom.c
+++ b/src/tools/ftrandom/ftrandom.c
@@ -84,6 +84,8 @@
static int error_count = 1;
static int error_fraction = 0;
+ static FT_F26Dot6 font_size = 12 * 64;
+
static struct fontlist
{
char* name;
@@ -156,7 +158,7 @@
if ( nohints )
load_flags |= FT_LOAD_NO_HINTING;
- FT_Set_Char_Size( face, 0, (int)( 12 * 64 ), 72, 72 );
+ FT_Set_Char_Size( face, 0, font_size, 72, 72 );
for ( gid = 0; gid < face->num_glyphs; ++gid )
{
@@ -543,6 +545,7 @@
fprintf( out, " --nohints Turn off hinting.\n" );
fprintf( out, " --rasterize Attempt to rasterize each glyph.\n" );
fprintf( out, " --results <dir> Directory in which to place the test fonts.\n" );
+ fprintf( out, " --size <float> Use the given font size for the tests.\n" );
fprintf( out, " --test <file> Run a single test on an already existing file.\n" );
}
@@ -611,6 +614,15 @@
rasterize = true;
else if ( strcmp( pt, "-results" ) == 0 )
results_dir = argv[++i];
+ else if ( strcmp( pt, "-size" ) == 0 )
+ {
+ font_size = (FT_F26Dot6)( strtod( argv[++i], &end ) * 64 );
+ if ( *end != '\0' || font_size < 64 )
+ {
+ fprintf( stderr, "Bad value for size: %s\n", argv[i] );
+ exit( 1 );
+ }
+ }
else if ( strcmp( pt, "-test" ) == 0 )
testfile = argv[++i];
else
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -264,7 +264,7 @@
cont_limit = cont + n_contours;
/* check space for contours array + instructions count */
- if ( n_contours >= 0xFFF || p + (n_contours + 1) * 2 > limit )
+ if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit )
goto Invalid_Outline;
cont[0] = prev_cont = FT_NEXT_USHORT( p );
@@ -271,9 +271,9 @@
for ( cont++; cont < cont_limit; cont++ )
{
cont[0] = FT_NEXT_USHORT( p );
- if (cont[0] > prev_cont)
+ if ( cont[0] > prev_cont )
{
- /* unordered contours, this is invalid */
+ /* unordered contours: this is invalid */
error = FT_Err_Invalid_Table;
goto Fail;
}
@@ -591,13 +591,14 @@
FT_UInt start_point,
FT_UInt start_contour )
{
- zone->n_points = (FT_UShort)( load->outline.n_points - start_point );
- zone->n_contours = (FT_Short) ( load->outline.n_contours - start_contour );
- zone->org = load->extra_points + start_point;
- zone->cur = load->outline.points + start_point;
- zone->orus = load->extra_points2 + start_point;
- zone->tags = (FT_Byte*)load->outline.tags + start_point;
- zone->contours = (FT_UShort*)load->outline.contours + start_contour;
+ zone->n_points = (FT_UShort)( load->outline.n_points - start_point );
+ zone->n_contours = (FT_Short) ( load->outline.n_contours -
+ start_contour );
+ zone->org = load->extra_points + start_point;
+ zone->cur = load->outline.points + start_point;
+ zone->orus = load->extra_points2 + start_point;
+ zone->tags = (FT_Byte*)load->outline.tags + start_point;
+ zone->contours = (FT_UShort*)load->outline.contours + start_contour;
zone->first_point = (FT_UShort)start_point;
}
@@ -1336,11 +1337,11 @@
/* this provides additional offsets */
/* for each component's translation */
- if ( (error = TT_Vary_Get_Glyph_Deltas(
- face,
- glyph_index,
- &deltas,
- gloader->current.num_subglyphs + 4 )) != 0 )
+ if ( ( error = TT_Vary_Get_Glyph_Deltas(
+ face,
+ glyph_index,
+ &deltas,
+ gloader->current.num_subglyphs + 4 )) != 0 )
goto Exit;
subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -620,6 +620,7 @@
exec->pts.n_points = 0;
exec->pts.n_contours = 0;
+
exec->zp1 = exec->pts;
exec->zp2 = exec->pts;
exec->zp0 = exec->pts;
@@ -6151,7 +6152,7 @@
*/
twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;
- if ( BOUNDS(CUR.GS.rp1, CUR.zp0.n_points) )
+ if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )
{
if ( CUR.pedantic_hinting )
CUR.error = TT_Err_Invalid_Reference;
@@ -6302,8 +6303,8 @@
if ( p1 > p2 )
return;
- if ( BOUNDS(ref1, worker->max_points) ||
- BOUNDS(ref2, worker->max_points) )
+ if ( BOUNDS( ref1, worker->max_points ) ||
+ BOUNDS( ref2, worker->max_points ) )
return;
orus1 = worker->orus[ref1].x;
@@ -6403,6 +6404,7 @@
FT_Short contour; /* current contour */
FT_UNUSED_ARG;
+
/* ignore empty outlines */
if ( CUR.pts.n_contours == 0 )