shithub: freetype+ttf2subf

Download patch

ref: 08fdac980acd8e2ef3a17685f4f32fbe3625b96f
parent: cbfaedcefa88cc7cbaff9e6fcaa451f7598d2052
author: David Turner <[email protected]>
date: Mon Feb 21 11:01:33 EST 2000

fixed a bug in the glyph loader that caused a memory
block to be freed twice. Also performed changes to use
the new glyph zone object that has appeared in ftobjs.h

git/fs: mount .git/fs: mount/attach disallowed
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -153,8 +153,8 @@
   /*    assemble composite glyphs.                                         */
   /*                                                                       */
   static
-  void  mount_zone( TT_GlyphZone*  source,
-                    TT_GlyphZone*  target )
+  void  mount_zone( FT_GlyphZone*  source,
+                    FT_GlyphZone*  target )
   {
     TT_UInt  np;
     TT_Int   nc;
@@ -164,7 +164,7 @@
 
     target->org   = source->org + np;
     target->cur   = source->cur + np;
-    target->touch = source->touch + np;
+    target->flags = source->flags + np;
 
     target->contours = source->contours + nc;
 
@@ -194,7 +194,7 @@
   {
     TT_Error       error;
     FT_Stream      stream = load->stream;
-    TT_GlyphZone*  zone   = &load->zone;
+    FT_GlyphZone*  zone   = &load->zone;
     TT_Face        face = load->face;
 
     TT_UShort      n_ins;
@@ -258,11 +258,14 @@
     }
 
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
-    MEM_Copy( load->exec->glyphIns, stream->cursor, n_ins );
+    if ( (load->load_flags & (FT_LOAD_NO_SCALE|FT_LOAD_NO_HINTING))==0 )
+    {
+      MEM_Copy( load->exec->glyphIns, stream->cursor, n_ins );
 
-    error = TT_Set_CodeRange( load->exec, tt_coderange_glyph,
-                              load->exec->glyphIns, n_ins );
-    if (error) goto Fail;
+      error = TT_Set_CodeRange( load->exec, tt_coderange_glyph,
+                                load->exec->glyphIns, n_ins );
+      if (error) goto Fail;
+    }
 #endif
 
     stream->cursor += n_ins;
@@ -271,7 +274,7 @@
     /* reading the point flags                                           */
 
     {    
-      TT_Byte*  flag  = load->zone.touch;
+      TT_Byte*  flag  = load->zone.flags;
       TT_Byte*  limit = flag + n_points;
       TT_Byte   c, count;
       
@@ -292,7 +295,7 @@
     {
       TT_Vector*  vec   = zone->org;
       TT_Vector*  limit = vec + n_points;
-      TT_Byte*    flag  = zone->touch;
+      TT_Byte*    flag  = zone->flags;
       TT_Pos      x     = 0;
       
       for ( ; vec < limit; vec++, flag++ )
@@ -313,12 +316,12 @@
     }
 
     /*********************************************************************/
-    /* reading the YX coordinates                                         */
+    /* reading the Y coordinates                                         */
 
     {
       TT_Vector*  vec   = zone->org;
       TT_Vector*  limit = vec + n_points;
-      TT_Byte*    flag  = zone->touch;
+      TT_Byte*    flag  = zone->flags;
       TT_Pos      x     = 0;
       
       for ( ; vec < limit; vec++, flag++ )
@@ -362,10 +365,10 @@
         
       /* clear the touch flags */
       for ( n = 0; n < n_points; n++ )
-        zone->touch[n] &= FT_Curve_Tag_On;
+        zone->flags[n] &= FT_Curve_Tag_On;
 
-      zone->touch[n_points    ] = 0;
-      zone->touch[n_points + 1] = 0;
+      zone->flags[n_points    ] = 0;
+      zone->flags[n_points + 1] = 0;
     }
     /* Note that we return two more points that are not */
     /* part of the glyph outline.                       */
@@ -418,7 +421,7 @@
           load->exec->is_composite     = FALSE;
           load->exec->pedantic_hinting = (TT_Bool)(load->load_flags & FT_LOAD_PEDANTIC);
           load->exec->pts              = *zone;
-          load->exec->pts.n_points   += 2;
+          load->exec->pts.n_points    += 2;
 
           error = TT_Run_Context( load->exec, debug );
           if ( error && load->exec->pedantic_hinting )
@@ -485,6 +488,7 @@
     
     x_scale = 0x10000;
     y_scale = 0x10000;
+    if ( (loader->load_flags & FT_LOAD_NO_SCALE)==0 )
     {
       x_scale = loader->size->root.metrics.x_scale;
       y_scale = loader->size->root.metrics.y_scale;
@@ -819,7 +823,7 @@
           TT_UShort       n_ins;
           TT_ExecContext  exec = loader->exec;
           TT_UInt         n_points = loader->base.n_points;
-          TT_GlyphZone*   pts;
+          FT_GlyphZone*   pts;
           TT_Vector*      pp1;
           
           /* read size of instructions */
@@ -857,8 +861,8 @@
           pp1[0] = loader->pp1;
           pp1[1] = loader->pp2;
       
-          pts->touch[num_points - 1] = 0;
-          pts->touch[num_points - 2] = 0;
+          pts->flags[num_points + 1] = 0;
+          pts->flags[num_points + 2] = 0;
       
           /* if hinting, round the phantom points */
           if ( IS_HINTED(loader->load_flags) )
@@ -870,7 +874,7 @@
           {
             TT_UInt  k;
             for ( k = 0; k < n_points; k++ )
-              pts->touch[k] &= FT_Curve_Tag_On;
+              pts->flags[k] &= FT_Curve_Tag_On;
           }
       
           cur_to_org( n_points, pts );
@@ -946,7 +950,7 @@
       for ( u = 0; u < num_points + 2; u++ )
       {
         glyph->outline.points[u] = loader->base.cur[u];
-        glyph->outline.flags [u] = loader->base.touch[u];
+        glyph->outline.flags [u] = loader->base.flags[u];
       }
 
       for ( u = 0; u < num_contours; u++ )
@@ -1148,6 +1152,7 @@
     FT_Memory        memory;
     TT_Error         error;
     TT_Loader        loader;
+    FT_GlyphZone*    zone;
     
     face   = (TT_Face)glyph->face;
     sfnt   = (SFNT_Interface*)face->sfnt;
@@ -1209,11 +1214,23 @@
     if (error)
     {
       FT_ERROR(( "TT.GLoad: could not access glyph table\n" ));
-      return error;
+      goto Exit;
     }
 
     MEM_Set( &loader, 0, sizeof(loader) );
 
+    /* update the glyph zone bounds */
+    zone   = &((TT_Driver)face->root.driver)->zone;
+    error  = FT_Update_GlyphZone( zone,
+                                  face->root.max_points,
+                                  face->root.max_contours );
+    if (error)
+    {
+      FT_ERROR(( "TT.GLoad: could not update loader glyph zone\n" ));
+      goto Exit;
+    }
+    loader.base = *zone;
+
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
     if ( size )
     {
@@ -1234,11 +1251,7 @@
       glyph->outline.high_precision = ( size->root.metrics.y_ppem < 24 );
 
     /************************************************************************/
-    /* let's initialise our loader now                                      */
-    error = TT_New_GlyphZone( memory, &loader.base,
-                              face->root.max_points, face->root.max_contours );
-    if (error) return error;
-
+    /* let's initialise the rest of our loader now                          */
     loader.left_points   = face->root.max_points;
     loader.left_contours = face->root.max_contours;
     loader.load_flags    = load_flags;
@@ -1267,7 +1280,7 @@
       TT_Done_Context( loader.exec );
 #endif
 
-    TT_Done_GlyphZone( memory, &loader.base );
+  Exit:
     return error;
   }
 
--- a/src/truetype/ttgload.h
+++ b/src/truetype/ttgload.h
@@ -53,8 +53,8 @@
     TT_ULong        glyf_offset;
         
     /* the zone where we load our glyphs */
-    TT_GlyphZone    base;
-    TT_GlyphZone    zone;
+    FT_GlyphZone    base;
+    FT_GlyphZone    zone;
     
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
     TT_ExecContext  exec;
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -383,7 +383,6 @@
     exec->loadSize = 0;
 
     /* points zone */
-    TT_Done_GlyphZone( exec->memory, &exec->pts );
     exec->maxPoints   = 0;
     exec->maxContours = 0;
 
@@ -518,58 +517,7 @@
   }
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Update_Zone                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Checks the size of a zone and reallocates it if necessary.         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    newPoints   :: The new capacity for points.  We add two slots for  */
-  /*                   phantom points.                                     */
-  /*                                                                       */
-  /*    newContours :: The new capacity for contours.                      */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    zone        :: The address of the target zone.                     */
-  /*                                                                       */
-  /*    maxPoints   :: The address of the zone's current capacity for      */
-  /*                   points.                                             */
-  /*                                                                       */
-  /*    maxContours :: The address of the zone's current capacity for      */
-  /*                   contours.                                           */
-  /*                                                                       */
-  static
-  TT_Error  Update_Zone( FT_Memory      memory,
-                         TT_GlyphZone*  zone,
-                         TT_UShort*     maxPoints,
-                         TT_Short*      maxContours,
-                         TT_UShort      newPoints,
-                         TT_Short       newContours )
-  {
-    newPoints += 2;
 
-    if ( *maxPoints < newPoints || *maxContours < newContours )
-    {
-      TT_Error  error;
-
-
-      TT_Done_GlyphZone( memory, zone );
-
-      error = TT_New_GlyphZone( memory, zone, newPoints, newContours );
-      if ( error )
-        return error;
-
-      *maxPoints   = newPoints;
-      *maxContours = newContours;
-    }
-
-    return TT_Err_Ok;
-  }
-
-
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -601,7 +549,6 @@
     TT_MaxProfile*  maxp;
     TT_Error        error;
 
-
     exec->face = face;
     maxp       = &face->max_profile;
     exec->size = size;
@@ -665,16 +612,6 @@
     if ( error )
       return error;
 
-    /* XXX: Update_Zone() reserves two positions for the phantom points! */
-    error = Update_Zone( exec->memory,
-                         &exec->pts,
-                         &exec->maxPoints,
-                         &exec->maxContours,
-                         exec->face->root.max_points,
-                         exec->face->root.max_contours );
-    if ( error )
-      return error;
-
     exec->pts.n_points   = 0;
     exec->pts.n_contours = 0;
 
@@ -1427,7 +1364,7 @@
   /*    zone     :: The affected glyph zone.                               */
   /*                                                                       */
   static
-  void  Direct_Move( EXEC_OP_ TT_GlyphZone*  zone,
+  void  Direct_Move( EXEC_OP_ FT_GlyphZone*  zone,
                               TT_UShort      point,
                               TT_F26Dot6     distance )
   {
@@ -1446,7 +1383,7 @@
                                        v * 0x10000L,
                                        CUR.F_dot_P );
 #endif
-      zone->touch[point] |= FT_Curve_Tag_Touch_X;
+      zone->flags[point] |= FT_Curve_Tag_Touch_X;
     }
 
     v = CUR.GS.freeVector.y;
@@ -1461,7 +1398,7 @@
                                        v * 0x10000L,
                                        CUR.F_dot_P );
 #endif
-      zone->touch[point] |= FT_Curve_Tag_Touch_Y;
+      zone->flags[point] |= FT_Curve_Tag_Touch_Y;
     }
   }
 
@@ -1476,7 +1413,7 @@
   /*************************************************************************/
 
   static
-  void  Direct_Move_X( EXEC_OP_ TT_GlyphZone*  zone,
+  void  Direct_Move_X( EXEC_OP_ FT_GlyphZone*  zone,
                                 TT_UShort      point,
                                 TT_F26Dot6     distance )
   {
@@ -1483,12 +1420,12 @@
     UNUSED_EXEC;
 
     zone->cur[point].x += distance;
-    zone->touch[point] |= FT_Curve_Tag_Touch_X;
+    zone->flags[point] |= FT_Curve_Tag_Touch_X;
   }
 
 
   static
-  void  Direct_Move_Y( EXEC_OP_ TT_GlyphZone*  zone,
+  void  Direct_Move_Y( EXEC_OP_ FT_GlyphZone*  zone,
                                 TT_UShort      point,
                                 TT_F26Dot6     distance )
   {
@@ -1495,7 +1432,7 @@
     UNUSED_EXEC;
 
     zone->cur[point].y += distance;
-    zone->touch[point] |= FT_Curve_Tag_Touch_Y;
+    zone->flags[point] |= FT_Curve_Tag_Touch_Y;
   }
 
 
@@ -4854,7 +4791,7 @@
         }
       }
       else
-        CUR.pts.touch[point] ^= FT_Curve_Tag_On;
+        CUR.pts.flags[point] ^= FT_Curve_Tag_On;
 
       CUR.GS.loop--;
     }
@@ -4888,7 +4825,7 @@
     }
 
     for ( I = L; I <= K; I++ )
-      CUR.pts.touch[I] |= FT_Curve_Tag_On;
+      CUR.pts.flags[I] |= FT_Curve_Tag_On;
   }
 
 
@@ -4916,7 +4853,7 @@
     }
 
     for ( I = L; I <= K; I++ )
-      CUR.pts.touch[I] &= ~FT_Curve_Tag_On;
+      CUR.pts.flags[I] &= ~FT_Curve_Tag_On;
   }
 
 
@@ -4923,10 +4860,10 @@
   static
   TT_Bool  Compute_Point_Displacement( EXEC_OP_ TT_F26Dot6*    x,
                                                 TT_F26Dot6*    y,
-                                                TT_GlyphZone*  zone,
+                                                FT_GlyphZone*  zone,
                                                 TT_UShort*     refp )
   {
-    TT_GlyphZone  zp;
+    FT_GlyphZone  zp;
     TT_UShort     p;
     TT_F26Dot6    d;
 
@@ -4979,7 +4916,7 @@
     {
       CUR.zp2.cur[point].x += dx;
       if ( touch )
-        CUR.zp2.touch[point] |= FT_Curve_Tag_Touch_X;
+        CUR.zp2.flags[point] |= FT_Curve_Tag_Touch_X;
     }
 
     if ( CUR.GS.freeVector.y != 0 )
@@ -4986,7 +4923,7 @@
     {
       CUR.zp2.cur[point].y += dy;
       if ( touch )
-        CUR.zp2.touch[point] |= FT_Curve_Tag_Touch_Y;
+        CUR.zp2.flags[point] |= FT_Curve_Tag_Touch_Y;
     }
   }
 
@@ -5000,7 +4937,7 @@
   static
   void  Ins_SHP( INS_ARG )
   {
-    TT_GlyphZone  zp;
+    FT_GlyphZone  zp;
     TT_UShort     refp;
 
     TT_F26Dot6    dx,
@@ -5053,7 +4990,7 @@
   static
   void  Ins_SHC( INS_ARG )
   {
-    TT_GlyphZone zp;
+    FT_GlyphZone zp;
     TT_UShort    refp;
     TT_F26Dot6   dx,
                  dy;
@@ -5109,7 +5046,7 @@
   static
   void  Ins_SHZ( INS_ARG )
   {
-    TT_GlyphZone zp;
+    FT_GlyphZone zp;
     TT_UShort    refp;
     TT_F26Dot6   dx,
                  dy;
@@ -5660,7 +5597,7 @@
     dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;
     dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;
 
-    CUR.zp2.touch[point] |= FT_Curve_Tag_Touch_Both;
+    CUR.zp2.flags[point] |= FT_Curve_Tag_Touch_Both;
 
     discriminant = TT_MULDIV( dax, -dby, 0x40 ) +
                    TT_MULDIV( day, dbx, 0x40 );
@@ -5843,7 +5780,7 @@
     if ( CUR.GS.freeVector.y != 0 )
       mask &= ~FT_Curve_Tag_Touch_Y;
 
-    CUR.zp0.touch[point] &= mask;
+    CUR.zp0.flags[point] &= mask;
   }
 
 
@@ -5996,7 +5933,7 @@
       end_point   = CUR.pts.contours[contour];
       first_point = point;
 
-      while ( point <= end_point && (CUR.pts.touch[point] & mask) == 0 )
+      while ( point <= end_point && (CUR.pts.flags[point] & mask) == 0 )
         point++;
 
       if ( point <= end_point )
@@ -6008,7 +5945,7 @@
 
         while ( point <= end_point )
         {
-          if ( (CUR.pts.touch[point] & mask) != 0 )
+          if ( (CUR.pts.flags[point] & mask) != 0 )
           {
             if ( point > 0 )
               Interp( cur_touched + 1,
@@ -7657,8 +7594,8 @@
 
     TT_Error  error = 0;
 
-    TT_GlyphZone  save;
-    TT_GlyphZone  pts;
+    FT_GlyphZone  save;
+    FT_GlyphZone  pts;
 
 #define TT_Round_Off             5
 #define TT_Round_To_Half_Grid    0
@@ -7695,7 +7632,7 @@
 
     MEM_Alloc( save.org, sizeof ( TT_Vector ) * save.n_points );
     MEM_Alloc( save.cur, sizeof ( TT_Vector ) * save.n_points );
-    MEM_Alloc( save.touch, sizeof ( TT_Byte ) * save.n_points );
+    MEM_Alloc( save.flags, sizeof ( TT_Byte ) * save.n_points );
 
     exc->instruction_trap = 1;
 
@@ -7858,7 +7795,7 @@
 
       MEM_Copy( save.org,   pts.org, pts.n_points * sizeof ( TT_Vector ) );
       MEM_Copy( save.cur,   pts.cur, pts.n_points * sizeof ( TT_Vector ) );
-      MEM_Copy( save.touch, pts.touch, pts.n_points );
+      MEM_Copy( save.flags, pts.flags, pts.n_points );
 
       /* a return indicate the last command */
       if (ch == '\r')
@@ -7912,7 +7849,7 @@
         if ( save.org[A].y != pts.org[A].y ) diff |= 2;
         if ( save.cur[A].x != pts.cur[A].x ) diff |= 4;
         if ( save.cur[A].y != pts.cur[A].y ) diff |= 8;
-        if ( save.touch[A] != pts.touch[A] ) diff |= 16;
+        if ( save.flags[A] != pts.flags[A] ) diff |= 16;
 
         if ( diff )
         {
@@ -7919,7 +7856,7 @@
           FT_TRACE0(( "%02hx  ", A ));
 
           if ( diff & 16 ) temp = "(%01hx)"; else temp = " %01hx ";
-          FT_TRACE0(( temp, save.touch[A] & 7 ));
+          FT_TRACE0(( temp, save.flags[A] & 7 ));
 
           if ( diff & 1 ) temp = "(%08lx)"; else temp = " %08lx ";
           FT_TRACE0(( temp, save.org[A].x ));
@@ -7938,7 +7875,7 @@
           FT_TRACE0(( "%02hx  ", A ));
 
           if ( diff & 16 ) temp = "[%01hx]"; else temp = " %01hx ";
-          FT_TRACE0(( temp, pts.touch[A] & 7 ));
+          FT_TRACE0(( temp, pts.flags[A] & 7 ));
 
           if ( diff & 1 ) temp = "[%08lx]"; else temp = " %08lx ";
           FT_TRACE0(( temp, pts.org[A].x ));
--- a/src/truetype/ttinterp.h
+++ b/src/truetype/ttinterp.h
@@ -71,7 +71,7 @@
                                                  TT_F26Dot6  compensation );
 
   /* Point displacement along the freedom vector routine */
-  typedef void  (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone*  zone,
+  typedef void  (*TT_Move_Func)( EXEC_OP_ FT_GlyphZone*  zone,
                                           TT_UInt        point,
                                           TT_F26Dot6     distance );
 
@@ -125,7 +125,7 @@
     TT_Long         args;
     TT_UInt         new_top;    /* new top after exec.  */
 
-    TT_GlyphZone    zp0,        /* zone records */
+    FT_GlyphZone    zp0,        /* zone records */
                     zp1,
                     zp2,
                     pts,
--- a/src/truetype/ttobjs.c
+++ b/src/truetype/ttobjs.c
@@ -49,75 +49,6 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    TT_New_GlyphZone                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Allocates a new glyph zone.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory      :: A handle to the current memory object.              */
-  /*                                                                       */
-  /*    maxPoints   :: The capacity of glyph zone in points.               */
-  /*                                                                       */
-  /*    maxContours :: The capacity of glyph zone in contours.             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    pts         :: A pointer to the target glyph zone record.          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  LOCAL_FUNC
-  TT_Error  TT_New_GlyphZone( FT_Memory      memory,
-                              TT_GlyphZone*  pts,
-                              TT_UShort      maxPoints,
-                              TT_Short       maxContours )
-  {
-    TT_Error  error;
-
-
-    if ( ALLOC( pts->org, maxPoints * 2 * sizeof ( TT_F26Dot6 )   ) ||
-         ALLOC( pts->cur, maxPoints * 2 * sizeof ( TT_F26Dot6 )   ) ||
-         ALLOC( pts->touch, maxPoints * sizeof ( TT_Byte )        ) ||
-         ALLOC( pts->contours, maxContours * sizeof ( TT_UShort ) ) )
-      return error;
-
-    return TT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Done_GlyphZone                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Deallocates a glyph zone.                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory :: A handle to the current memory object.                   */
-  /*                                                                       */
-  /*    pts    :: A pointer to the target glyph zone record.               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  LOCAL_FUNC
-  TT_Error  TT_Done_GlyphZone( FT_Memory      memory,
-                               TT_GlyphZone*  pts )
-  {
-    FREE( pts->contours );
-    FREE( pts->touch );
-    FREE( pts->cur );
-    FREE( pts->org );
-
-    return TT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
   /*    Get_Name                                                           */
   /*                                                                       */
   /* <Description>                                                         */
@@ -525,7 +456,7 @@
 
     /* reserve twilight zone */
     n_twilight = maxp->maxTwilightPoints;
-    error = TT_New_GlyphZone( memory, &size->twilight, n_twilight, 0 );
+    error = FT_New_GlyphZone( memory, n_twilight, 0, &size->twilight );
     if ( error )
       goto Fail_Memory;
 
@@ -662,7 +593,7 @@
     size->storage_size = 0;
 
     /* twilight zone */
-    TT_Done_GlyphZone( memory, &size->twilight );
+    FT_Done_GlyphZone( &size->twilight );
 
     FREE( size->function_defs );
     FREE( size->instruction_defs );
@@ -894,12 +825,16 @@
   LOCAL_FUNC
   TT_Error  TT_Init_Driver( TT_Driver  driver )
   {
+    FT_Memory  memory = driver->root.memory;
+    FT_Error   error;
+    
+    error = FT_New_GlyphZone( memory, 0, 0, &driver->zone );
+    if (error) return error;
+    
     /* init extension registry if needed */
 #ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
     return TT_Init_Extensions( driver );
 #else
-    UNUSED( driver );
-
     return TT_Err_Ok;
 #endif
   }
@@ -923,6 +858,9 @@
 #ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
     TT_Done_Extensions( driver );
 #endif
+
+    /* remove the loading glyph zone */
+    FT_Done_GlyphZone( &driver->zone );
 
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
     /* destroy the execution context */
--- a/src/truetype/ttobjs.h
+++ b/src/truetype/ttobjs.h
@@ -161,25 +161,7 @@
   } TT_DefRecord, *TT_DefArray;
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* This type defining a set of glyph points will be used to represent    */
-  /* each zone (regular and twilight) during instructions decoding.        */
-  /*                                                                       */
-  typedef struct  TT_GlyphZone_
-  {
-    TT_UShort   n_points;   /* number of points in zone    */
-    TT_Short    n_contours; /* number of contours          */
 
-    TT_Vector*  org;        /* original point coordinates  */
-    TT_Vector*  cur;        /* current point coordinates   */
-
-    TT_Byte*    touch;      /* current touch flags         */
-    TT_UShort*  contours;   /* contour end points          */
-
-  } TT_GlyphZone;
-
-
   /*************************************************************************/
   /*                                                                       */
   /* Subglyph transformation record.                                       */
@@ -210,7 +192,7 @@
     TT_Pos        left_bearing;
     TT_Pos        advance;
 
-    TT_GlyphZone  zone;
+    FT_GlyphZone  zone;
 
     TT_Long       arg1;         /* first argument                      */
     TT_Long       arg2;         /* second argument                     */
@@ -352,7 +334,7 @@
     TT_UShort          storage_size; /* The storage area is now part of */
     TT_Long*           storage;      /* the instance                    */
 
-    TT_GlyphZone       twilight;     /* The instance's twilight zone    */
+    FT_GlyphZone       twilight;     /* The instance's twilight zone    */
 
     /* debugging variables */
 
@@ -375,7 +357,8 @@
   typedef struct  TT_DriverRec_
   {
     FT_DriverRec    root;
-    TT_ExecContext  context;  /* execution context */
+    TT_ExecContext  context;  /* execution context        */
+    FT_GlyphZone    zone;     /* glyph loader points zone */
 
     void*           extension_component;
 
@@ -382,208 +365,36 @@
   } TT_DriverRec;
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_New_GlyphZone                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Allocates a new glyph zone.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory      :: A handle to the current memory object.              */
-  /*                                                                       */
-  /*    maxPoints   :: The capacity of glyph zone in points.               */
-  /*                                                                       */
-  /*    maxContours :: The capacity of glyph zone in contours.             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    pts         :: A pointer to the target glyph zone record.          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
- LOCAL_DEF
- TT_Error  TT_New_GlyphZone( FT_Memory      memory,
-                             TT_GlyphZone*  pts,
-                             TT_UShort      maxPoints,
-                             TT_Short       maxContours );
+ /*************************************************************************/
+ /*  Face Funcs                                                           */ 
 
+  LOCAL_DEF TT_Error  TT_Init_Face( FT_Stream  stream,
+                                    TT_Long    face_index,
+                                    TT_Face    face );
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Done_GlyphZone                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Deallocates a glyph zone.                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory :: A handle to the current memory object.                   */
-  /*                                                                       */
-  /*    pts    :: A pointer to the target glyph zone record.               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  LOCAL_FUNC
-  TT_Error  TT_Done_GlyphZone( FT_Memory      memory,
-                               TT_GlyphZone*  pts );
+  LOCAL_DEF void      TT_Done_Face( TT_Face  face );
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Init_Face                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a given TrueType face object.                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    resource   :: The source font resource.                            */
-  /*    face_index :: The index of the font face in the resource.          */
-  /*    face       :: The newly built face object.                         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  LOCAL_DEF
-  TT_Error  TT_Init_Face( FT_Stream  stream,
-                          TT_Long    face_index,
-                          TT_Face    face );
+ /*************************************************************************/
+ /*  Size funcs                                                           */ 
 
+  LOCAL_DEF TT_Error  TT_Init_Size ( TT_Size  size );
+  LOCAL_DEF void      TT_Done_Size ( TT_Size  size );
+  LOCAL_DEF TT_Error  TT_Reset_Size( TT_Size  size );
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Done_Face                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalizes a given face object.                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: The target face object to finalize.                        */
-  /*                                                                       */
-  LOCAL_DEF
-  void  TT_Done_Face( TT_Face  face );
 
+ /*************************************************************************/
+ /*  GlyphSlot funcs                                                      */ 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Init_Size                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a new TrueType size object.                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    size :: A handle to the size object.                               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  LOCAL_DEF
-  TT_Error  TT_Init_Size( TT_Size  size );
+  LOCAL_DEF TT_Error  TT_Init_GlyphSlot( TT_GlyphSlot  slot );
+  LOCAL_DEF void      TT_Done_GlyphSlot( TT_GlyphSlot  slot );
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Done_Size                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The TrueType size object finalizer.                                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    size :: A handle to the target size object.                        */
-  /*                                                                       */
-  LOCAL_DEF
-  void  TT_Done_Size( TT_Size  size );
+ /*************************************************************************/
+ /*  Driver funcs                                                         */ 
 
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Reset_Size                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Resets a TrueType size when resolutions and character dimensions   */
-  /*    have been changed.                                                 */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    size :: A handle to the target size object.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  LOCAL_DEF
-  TT_Error  TT_Reset_Size( TT_Size  size );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Init_GlyphSlot                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The TrueType glyph slot initializer.                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    glyph :: The glyph record to build.                                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  LOCAL_DEF
-  TT_Error  TT_Init_GlyphSlot( TT_GlyphSlot  slot );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Done_GlyphSlot                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The TrueType glyph slot finalizer.                                 */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    glyph :: A handle to the glyph slot object.                        */
-  /*                                                                       */
-  LOCAL_DEF
-  void  TT_Done_GlyphSlot( TT_GlyphSlot  slot );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Init_Driver                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a given TrueType driver object.                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    driver :: A handle to the target driver object.                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  LOCAL_DEF
-  TT_Error  TT_Init_Driver( TT_Driver  driver );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Done_Driver                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalizes a given TrueType driver.                                 */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    driver :: A handle to the target TrueType driver.                  */
-  /*                                                                       */
-  LOCAL_DEF
-  void  TT_Done_Driver( TT_Driver  driver );
+  LOCAL_DEF  TT_Error  TT_Init_Driver( TT_Driver  driver );
+  LOCAL_DEF  void      TT_Done_Driver( TT_Driver  driver );
 
 
 #ifdef __cplusplus