Commit 61d6b2b9aa6f639dac8cd75e1c1bc7dc9702b0bb

David Turner 2001-05-16T17:49:07

* src/truetype/ttgload.c (load_truetype_glyph): fixed a bug in the composite loader spotted by Keith Packard.

diff --git a/ChangeLog b/ChangeLog
index e499c51..ab801af 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-05-16  David Turner  <david@freetype.org>
+
+    * src/truetype/ttgload.c (load_truetype_glyph): fixed a bug in the
+    composite loader spotted by Keith Packard.
+
 2001-05-14  David Turner  <david@freetype.org>
 
     * src/base/ftcalc.c (FT_DivFix): fixed a bug in the 64-bit code that
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 64bc0be..00877f1 100644
--- 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,18 +479,18 @@
   {
     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;
 
 
     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,7 +760,7 @@
                                            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;
 
diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c
index 7b287c5..ec81e1e 100644
--- 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 );
+          }
         }
 
         /*******************************************************************/