ref: 61d6b2b9aa6f639dac8cd75e1c1bc7dc9702b0bb
parent: 66cb4790bfc5146158a388c6cc9ab2cc40dcf6fb
author: David Turner <[email protected]>
date: Wed May 16 13:49:07 EDT 2001
* src/truetype/ttgload.c (load_truetype_glyph): fixed a bug in the composite loader spotted by Keith Packard.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-05-16 David Turner <[email protected]>
+
+ * src/truetype/ttgload.c (load_truetype_glyph): fixed a bug in the
+ composite loader spotted by Keith Packard.
+
2001-05-14 David Turner <[email protected]>
* src/base/ftcalc.c (FT_DivFix): fixed a bug in the 64-bit code that
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -423,22 +423,23 @@
FT_Outline* current = &loader->current.outline;
FT_Bool adjust = 1;
- FT_UInt new_max;
+ FT_UInt new_max, old_max;
/* check points & tags */
new_max = base->n_points + current->n_points + n_points;
- if ( new_max > loader->max_points )
+ old_max = loader->max_points;
+
+ if ( new_max > old_max )
{
new_max = ( new_max + 7 ) & -8;
- if ( REALLOC_ARRAY( base->points, base->n_points,
- new_max, FT_Vector ) ||
- REALLOC_ARRAY( base->tags, base->n_points,
- new_max, FT_Byte ) )
+
+ if ( REALLOC_ARRAY( base->points, old_max, new_max, FT_Vector ) ||
+ REALLOC_ARRAY( base->tags, old_max, new_max, FT_Byte ) )
goto Exit;
if ( loader->use_extra &&
- REALLOC_ARRAY( loader->base.extra_points, base->n_points,
+ REALLOC_ARRAY( loader->base.extra_points, old_max,
new_max, FT_Vector ) )
goto Exit;
@@ -447,13 +448,13 @@
}
/* check contours */
+ old_max = loader->max_contours;
new_max = base->n_contours + current->n_contours +
n_contours;
- if ( new_max > loader->max_contours )
+ if ( new_max > old_max )
{
new_max = ( new_max + 3 ) & -4;
- if ( REALLOC_ARRAY( base->contours, base->n_contours,
- new_max, FT_Short ) )
+ if ( REALLOC_ARRAY( base->contours, old_max, new_max, FT_Short ) )
goto Exit;
adjust = 1;
@@ -478,7 +479,7 @@
{
FT_Memory memory = loader->memory;
FT_Error error = FT_Err_Ok;
- FT_UInt new_max;
+ FT_UInt new_max, old_max;
FT_GlyphLoad* base = &loader->base;
FT_GlyphLoad* current = &loader->current;
@@ -485,11 +486,11 @@
new_max = base->num_subglyphs + current->num_subglyphs + n_subs;
- if ( new_max > loader->max_subglyphs )
+ old_max = loader->max_subglyphs;
+ if ( new_max > old_max )
{
new_max = ( new_max + 1 ) & -2;
- if ( REALLOC_ARRAY( base->subglyphs, base->num_subglyphs,
- new_max, FT_SubGlyph ) )
+ if ( REALLOC_ARRAY( base->subglyphs, old_max, new_max, FT_SubGlyph ) )
goto Exit;
loader->max_subglyphs = new_max;
@@ -759,8 +760,8 @@
FT_Vector* delta )
{
FT_Face_Internal internal;
-
+
if ( !face )
return;
@@ -901,8 +902,8 @@
if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )
{
FT_Face_Internal internal = face->internal;
-
-
+
+
/* now, transform the glyph image if needed */
if ( internal->transform_flags )
{
@@ -1066,7 +1067,7 @@
if ( ALLOC( internal, sizeof ( *internal ) ) )
goto Fail;
-
+
face->internal = internal;
face->driver = driver;
@@ -1299,13 +1300,13 @@
/* initialize internal face data */
{
FT_Face_Internal internal = face->internal;
-
+
internal->transform_matrix.xx = 0x10000L;
internal->transform_matrix.xy = 0;
internal->transform_matrix.yx = 0;
internal->transform_matrix.yy = 0x10000L;
-
+
internal->transform_delta.x = 0;
internal->transform_delta.y = 0;
}
@@ -1454,7 +1455,7 @@
goto Exit;
size->face = face;
-
+
/* for now, do not use any internal fields in size objects */
size->internal = 0;
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -891,6 +891,7 @@
if ( error )
goto Fail;
+ /* restore subglyph pointer */
subglyph = gloader->base.subglyphs + num_base_subgs + n;
if ( subglyph->flags & USE_MY_METRICS )
@@ -971,8 +972,16 @@
}
}
- translate_array( num_new_points, loader->zone.cur, x, y );
- cur_to_org( num_new_points, &loader->zone );
+ if ( x | y )
+ {
+ translate_array( num_new_points,
+ gloader->base.outline.points + num_base_points,
+ x, y );
+
+ translate_array( num_new_points,
+ gloader->base.extra_points + num_base_points,
+ x, y );
+ }
}
/*******************************************************************/