Репозиторий ALT Linux backports/2.4
Последнее обновление: 9 июля 2008 | Пакетов: 497 | Посещений: 1583445
 поиск   регистрация   авторизация 
 
Группа :: Система/Библиотеки
Пакет: freetype2

 Главная   Изменения   Спек   Патчи   Загрузить   Bugs and FR 

Патч: freetype-2.1.10-cvsfixes.patch


--- freetype2/include/freetype/internal/ftobjs.h	27 May 2005 06:01:28 -0000	1.90
+++ freetype2/include/freetype/internal/ftobjs.h	20 Jun 2005 09:04:49 -0000	1.91
@@ -452,6 +452,13 @@ FT_BEGIN_HEADER
  /* */
 
  /*
+  * grid-fit slot->metrics
+  */
+  FT_BASE( void )
+  ft_glyphslot_grid_fit_metrics( FT_GlyphSlot  slot );
+
+
+ /*
   * Free the bitmap of a given glyphslot when needed
   * (i.e., only when it was allocated with ft_glyphslot_alloc_bitmap).
   */
Index: src/base/ftobjs.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/base/ftobjs.c,v
retrieving revision 1.215
retrieving revision 1.217
diff -u -p -r1.215 -r1.217
--- freetype2/src/base/ftobjs.c	6 Jun 2005 07:01:47 -0000	1.215
+++ freetype2/src/base/ftobjs.c	23 Jun 2005 20:31:48 -0000	1.217
@@ -251,6 +251,29 @@
 
 
   FT_BASE_DEF( void )
+  ft_glyphslot_grid_fit_metrics( FT_GlyphSlot  slot )
+  {
+    FT_Pos  tmp;
+
+
+    tmp = FT_PIX_CEIL( slot->metrics.horiBearingX + slot->metrics.width );
+    slot->metrics.horiBearingX = FT_PIX_FLOOR( slot->metrics.horiBearingX );
+    slot->metrics.width        = tmp - slot->metrics.horiBearingX;
+
+    tmp = FT_PIX_FLOOR( slot->metrics.horiBearingY - slot->metrics.height );
+    slot->metrics.horiBearingY = FT_PIX_CEIL( slot->metrics.horiBearingY );
+    slot->metrics.height       = slot->metrics.horiBearingY - tmp;
+
+    slot->metrics.horiAdvance  = FT_PIX_ROUND( slot->metrics.horiAdvance );
+
+    slot->metrics.vertBearingX = FT_PIX_FLOOR( slot->metrics.vertBearingX );
+    /* note that vertBearingY should be floor'ed */
+    slot->metrics.vertBearingY = FT_PIX_FLOOR( slot->metrics.vertBearingY );
+    slot->metrics.vertAdvance  = FT_PIX_ROUND( slot->metrics.vertAdvance );
+  }
+
+
+  FT_BASE_DEF( void )
   ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
                            FT_Byte*      buffer )
   {
Index: src/base/ftoutln.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/base/ftoutln.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -p -r1.62 -r1.63
--- freetype2/src/base/ftoutln.c	25 May 2005 05:51:01 -0000	1.62
+++ freetype2/src/base/ftoutln.c	16 Jun 2005 19:07:08 -0000	1.63
@@ -683,6 +683,7 @@
     if ( !outline )
       return FT_Err_Invalid_Argument;
 
+    strength /= 2;
     if ( strength == 0 )
       return FT_Err_Ok;
 
Index: src/base/ftsynth.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/base/ftsynth.c,v
retrieving revision 1.27
retrieving revision 1.30
diff -u -p -r1.27 -r1.30
--- freetype2/src/base/ftsynth.c	30 May 2005 07:54:20 -0000	1.27
+++ freetype2/src/base/ftsynth.c	23 Jun 2005 20:31:48 -0000	1.30
@@ -81,13 +81,16 @@
 
     /* some reasonable strength */
     xstr = FT_MulFix( face->units_per_EM,
-                      face->size->metrics.y_scale ) / 42;
+                      face->size->metrics.y_scale ) / 24;
     ystr = xstr;
 
     if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
     {
       error = FT_Outline_Embolden( &slot->outline, xstr );
-      xstr = xstr * 4;  /* according to the documentation */
+
+      /* this is more than enough for most glyphs;                         */
+      /* if you need accurate values, you have to call FT_Outline_Get_CBox */
+      xstr = xstr * 2;
       ystr = xstr;
     }
     else if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
@@ -122,8 +125,8 @@
     /* modify the metrics accordingly */
     if ( !error )
     {
+      /* assume the layout is horizontal */
       slot->advance.x += xstr;
-      slot->advance.y += ystr;
 
       slot->metrics.width        += xstr;
       slot->metrics.height       += ystr;
Index: src/cff/cffgload.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/cff/cffgload.c,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -p -r1.66 -r1.67
--- freetype2/src/cff/cffgload.c	18 Apr 2005 07:13:07 -0000	1.66
+++ freetype2/src/cff/cffgload.c	20 Jun 2005 09:04:50 -0000	1.67
@@ -2510,11 +2510,8 @@
         glyph->root.linearHoriAdvance           = decoder.glyph_width;
         glyph->root.internal->glyph_transformed = 0;
 
-        /* make up vertical metrics */
-        metrics->vertBearingX = 0;
-        metrics->vertBearingY = 0;
+        /* make up vertical ones */
         metrics->vertAdvance  = 0;
-
         glyph->root.linearVertAdvance = 0;
 
         glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
@@ -2559,42 +2556,26 @@
               vec->y = FT_MulFix( vec->y, y_scale );
             }
 
-          FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
-
           /* Then scale the metrics */
           metrics->horiAdvance  = FT_MulFix( metrics->horiAdvance,  x_scale );
           metrics->vertAdvance  = FT_MulFix( metrics->vertAdvance,  y_scale );
-
-          metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
-          metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
-
-          if ( hinting )
-          {
-            metrics->horiAdvance  = FT_PIX_ROUND( metrics->horiAdvance );
-            metrics->vertAdvance  = FT_PIX_ROUND( metrics->vertAdvance );
-
-            metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX );
-            metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY );
-          }
         }
 
         /* compute the other metrics */
         FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
 
-        /* grid fit the bounding box if necessary */
-        if ( hinting )
-        {
-          cbox.xMin &= -64;
-          cbox.yMin &= -64;
-          cbox.xMax  = ( cbox.xMax + 63 ) & -64;
-          cbox.yMax  = ( cbox.yMax + 63 ) & -64;
-        }
-
         metrics->width  = cbox.xMax - cbox.xMin;
         metrics->height = cbox.yMax - cbox.yMin;
 
         metrics->horiBearingX = cbox.xMin;
         metrics->horiBearingY = cbox.yMax;
+
+        /* make up vertical ones */
+        metrics->vertBearingX = 0;
+        metrics->vertBearingY = 0;
+
+        if ( hinting )
+          ft_glyphslot_grid_fit_metrics( &glyph->root );
       }
     }
 
Index: src/cid/cidgload.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/cid/cidgload.c,v
retrieving revision 1.70
retrieving revision 1.72
diff -u -p -r1.70 -r1.72
--- freetype2/src/cid/cidgload.c	6 May 2004 11:48:35 -0000	1.70
+++ freetype2/src/cid/cidgload.c	23 Jun 2005 20:31:48 -0000	1.72
@@ -358,12 +358,10 @@
         cidglyph->linearHoriAdvance           = decoder.builder.advance.x;
         cidglyph->internal->glyph_transformed = 0;
 
-        /* make up vertical metrics */
-        metrics->vertBearingX = 0;
-        metrics->vertBearingY = 0;
+        /* make up vertical ones */
         metrics->vertAdvance  = 0;
-
         cidglyph->linearVertAdvance = 0;
+
         cidglyph->format            = FT_GLYPH_FORMAT_OUTLINE;
 
         if ( size && cidsize->metrics.y_ppem < 24 )
@@ -403,42 +401,26 @@
               vec->y = FT_MulFix( vec->y, y_scale );
             }
 
-          FT_Outline_Get_CBox( &cidglyph->outline, &cbox );
-
           /* Then scale the metrics */
           metrics->horiAdvance  = FT_MulFix( metrics->horiAdvance,  x_scale );
           metrics->vertAdvance  = FT_MulFix( metrics->vertAdvance,  y_scale );
-
-          metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
-          metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
-
-          if ( hinting )
-          {
-            metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
-            metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
-
-            metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX );
-            metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY );
-          }
         }
 
         /* compute the other metrics */
         FT_Outline_Get_CBox( &cidglyph->outline, &cbox );
 
-        /* grid fit the bounding box if necessary */
-        if ( hinting )
-        {
-          cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
-          cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
-          cbox.xMax = FT_PIX_CEIL( cbox.xMax );
-          cbox.yMax = FT_PIX_CEIL( cbox.yMax );
-        }
-
         metrics->width  = cbox.xMax - cbox.xMin;
         metrics->height = cbox.yMax - cbox.yMin;
 
         metrics->horiBearingX = cbox.xMin;
         metrics->horiBearingY = cbox.yMax;
+
+        /* make up vertical ones */
+        metrics->vertBearingX = 0;
+        metrics->vertBearingY = 0;
+
+        if ( hinting )
+          ft_glyphslot_grid_fit_metrics( cidglyph );
       }
     }
 
Index: src/sfnt/ttsbit.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/sfnt/ttsbit.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -p -r1.63 -r1.64
--- freetype2/src/sfnt/ttsbit.c	1 Mar 2005 02:13:50 -0000	1.63
+++ freetype2/src/sfnt/ttsbit.c	16 Jun 2005 19:07:08 -0000	1.64
@@ -1501,7 +1501,7 @@
       /* some heuristic values */
 
       metrics->vertBearingX = (FT_Char)(-metrics->width / 2 );
-      metrics->vertBearingY = (FT_Char)( advance / 10 );
+      metrics->vertBearingY = (FT_Char)( ( advance - metrics->height ) / 2 );
       metrics->vertAdvance  = (FT_Char)( advance * 12 / 10 );
     }
 
Index: src/truetype/ttdriver.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/truetype/ttdriver.c,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -p -r1.78 -r1.79
--- freetype2/src/truetype/ttdriver.c	1 Mar 2005 02:13:50 -0000	1.78
+++ freetype2/src/truetype/ttdriver.c	26 Jul 2005 08:14:03 -0000	1.79
@@ -167,40 +167,33 @@
                   FT_UInt     horz_resolution,
                   FT_UInt     vert_resolution )
   {
-    TT_Size           size     = (TT_Size)ttsize;
-    FT_Size_Metrics*  metrics  = &size->root.metrics;
-    FT_Size_Metrics*  metrics2 = &size->metrics;
-    TT_Face           face     = (TT_Face)size->root.face;
-    FT_Long           dim_x, dim_y;
+    TT_Size           size    = (TT_Size)ttsize;
+    FT_Size_Metrics*  metrics = &size->metrics;
+    TT_Face           face    = (TT_Face)size->root.face;
 
 
-    *metrics2 = *metrics;
+    /* copy the result from base layer */
+    *metrics = size->root.metrics;
 
     /* This bit flag, when set, indicates that the pixel size must be */
-    /* truncated to an integer.  Nearly all TrueType fonts have this  */
-    /* bit set, as hinting won't work really well otherwise.          */
+    /* rounded to integer.  Nearly all TrueType fonts have this  bit  */
+    /* set, as hinting won't work really well otherwise.              */
     /*                                                                */
     if ( ( face->header.Flags & 8 ) != 0 )
     {
-     /* we need to use rounding in the following computations. Otherwise,
-      * the resulting hinted outlines will be very slightly distorted
-      */
-      dim_x = ( ( char_width  * horz_resolution + (36+32*72) ) / 72 ) & ~63;
-      dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & ~63;
-    }
-    else
-    {
-      dim_x = ( ( char_width  * horz_resolution + 36 ) / 72 );
-      dim_y = ( ( char_height * vert_resolution + 36 ) / 72 );
-    }
+      FT_Long  dim_x, dim_y;
 
-    /* we only modify "metrics2", not "metrics", so these changes have */
-    /* no effect on the result of the auto-hinter when it is used      */
-    /*                                                                 */
-    metrics2->x_ppem  = (FT_UShort)( dim_x >> 6 );
-    metrics2->y_ppem  = (FT_UShort)( dim_y >> 6 );
-    metrics2->x_scale = FT_DivFix( dim_x, face->root.units_per_EM );
-    metrics2->y_scale = FT_DivFix( dim_y, face->root.units_per_EM );
+      dim_x = ( char_width  * horz_resolution + 36 ) / 72;
+      dim_y = ( char_height * vert_resolution + 36 ) / 72;
+
+      dim_x = FT_PIX_ROUND(dim_x);
+      dim_y = FT_PIX_ROUND(dim_y);
+
+      metrics->x_ppem  = (FT_UShort)( dim_x >> 6 );
+      metrics->y_ppem  = (FT_UShort)( dim_y >> 6 );
+      metrics->x_scale = FT_DivFix( dim_x, face->root.units_per_EM );
+      metrics->y_scale = FT_DivFix( dim_y, face->root.units_per_EM );
+    }
 
     size->ttmetrics.valid = FALSE;
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
Index: src/truetype/ttgload.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/truetype/ttgload.c,v
retrieving revision 1.138
retrieving revision 1.143
diff -u -p -r1.138 -r1.143
--- freetype2/src/truetype/ttgload.c	6 Apr 2005 14:48:55 -0000	1.138
+++ freetype2/src/truetype/ttgload.c	13 Jul 2005 06:58:13 -0000	1.143
@@ -1707,15 +1707,6 @@
       FT_Outline_Translate( &glyph->outline, -loader->pp1.x, 0 );
 
       FT_Outline_Get_CBox( &glyph->outline, &bbox );
-
-      if ( IS_HINTED( loader->load_flags ) )
-      {
-        /* grid-fit the bounding box */
-        bbox.xMin = FT_PIX_FLOOR( bbox.xMin );
-        bbox.yMin = FT_PIX_FLOOR( bbox.yMin );
-        bbox.xMax = FT_PIX_CEIL( bbox.xMax );
-        bbox.yMax = FT_PIX_CEIL( bbox.yMax );
-      }
     }
     else
       bbox = loader->bbox;
@@ -1744,10 +1735,6 @@
     glyph->metrics.horiBearingY = bbox.yMax;
     glyph->metrics.horiAdvance  = loader->pp2.x - loader->pp1.x;
 
-    /* don't forget to hint the advance when we need to */
-    if ( IS_HINTED( loader->load_flags ) )
-      glyph->metrics.horiAdvance = FT_PIX_ROUND( glyph->metrics.horiAdvance );
-
     /* Now take care of vertical metrics.  In the case where there is    */
     /* no vertical information within the font (relatively common), make */
     /* up some metrics by `hand'...                                      */
@@ -1765,41 +1752,45 @@
       if ( face->vertical_info &&
            face->vertical.number_Of_VMetrics > 0 )
       {
-        advance_height = (FT_UShort)( loader->pp4.y - loader->pp3.y );
-        top_bearing    = (FT_Short)( loader->pp3.y - bbox.yMax );
+        top_bearing = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,
+                                           y_scale );
+
+        if ( loader->pp3.y <= loader->pp4.y )
+          advance_height = 0;
+        else
+          advance_height = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,
+                                                 y_scale );
       }
       else
       {
-        /* Make up the distances from the horizontal header.   */
+        FT_Short  max_height, height;
+
+
+        /* XXX Compute top side bearing and advance height in  */
+        /*     Get_VMetrics instead of here.                   */
 
         /* NOTE: The OS/2 values are the only `portable' ones, */
         /*       which is why we use them, if there is an OS/2 */
         /*       table in the font.  Otherwise, we use the     */
         /*       values defined in the horizontal header.      */
-        /*                                                     */
-        /* NOTE2: The sTypoDescender is negative, which is why */
-        /*        we compute the baseline-to-baseline distance */
-        /*        here with:                                   */
-        /*             ascender - descender + linegap          */
-        /*                                                     */
-        /* NOTE3: This is different from what MS's rasterizer  */
-        /*        appears to do when getting default values    */
-        /*        for the vertical phantom points.  We leave   */
-        /*        the old code untouched, but relying on       */
-        /*        phantom points alone might be reasonable     */
-        /*        (i.e., removing the `if' above).             */
+
+        height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin, y_scale );
         if ( face->os2.version != 0xFFFFU )
         {
-          top_bearing    = (FT_Short)( face->os2.sTypoLineGap / 2 );
-          advance_height = (FT_UShort)( face->os2.sTypoAscender -
-                                        face->os2.sTypoDescender +
-                                        face->os2.sTypoLineGap );
+          /* sTypoDescender is negative */
+          max_height     = (FT_Short)(face->os2.sTypoAscender -
+                                      face->os2.sTypoDescender);
+
+          top_bearing    = (FT_Short)( ( max_height - height ) / 2 );
+          advance_height = (FT_UShort)( max_height + face->os2.sTypoLineGap );
         }
         else
         {
-          top_bearing    = (FT_Short)( face->horizontal.Line_Gap / 2 );
-          advance_height = (FT_UShort)( face->horizontal.Ascender  +
-                                        face->horizontal.Descender +
+          max_height = (FT_Short)(face->horizontal.Ascender +
+                                  face->horizontal.Descender);
+
+          top_bearing    = (FT_Short)( ( max_height - height ) / 2 );
+          advance_height = (FT_UShort)( max_height +
                                         face->horizontal.Line_Gap );
         }
       }
@@ -1817,7 +1808,7 @@
 
         metrics.bearing_x = 0;
         metrics.bearing_y = top_bearing;
-        metrics.advance = advance_height;
+        metrics.advance   = advance_height;
         error =
           face->root.internal->incremental_interface->funcs->get_glyph_metrics(
             face->root.internal->incremental_interface->object,
@@ -1834,20 +1825,15 @@
 
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
 
-      /* We must adjust the top_bearing value from the bounding box given */
-      /* in the glyph header to the bounding box calculated with          */
-      /* FT_Get_Outline_CBox().                                           */
-
       /* scale the metrics */
       if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
       {
-        top     = FT_MulFix( top_bearing + loader->bbox.yMax, y_scale )
-                    - bbox.yMax;
+        top     = FT_MulFix( top_bearing, y_scale );
         advance = FT_MulFix( advance_height, y_scale );
       }
       else
       {
-        top     = top_bearing + loader->bbox.yMax - bbox.yMax;
+        top     = top_bearing;
         advance = advance_height;
       }
 
@@ -1860,14 +1846,6 @@
       /*                                                               */
       left = ( bbox.xMin - bbox.xMax ) / 2;
 
-      /* grid-fit them if necessary */
-      if ( IS_HINTED( loader->load_flags ) )
-      {
-        left    = FT_PIX_FLOOR( left );
-        top     = FT_PIX_CEIL( top );
-        advance = FT_PIX_ROUND( advance );
-      }
-
       glyph->metrics.vertBearingX = left;
       glyph->metrics.vertBearingY = top;
       glyph->metrics.vertAdvance  = advance;
@@ -1889,6 +1867,9 @@
     /* set glyph dimensions */
     glyph->metrics.width  = bbox.xMax - bbox.xMin;
     glyph->metrics.height = bbox.yMax - bbox.yMin;
+
+    if ( IS_HINTED( loader->load_flags ) )
+      ft_glyphslot_grid_fit_metrics( glyph );
 
     return 0;
   }
Index: src/truetype/ttobjs.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/truetype/ttobjs.c,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -p -r1.90 -r1.91
--- freetype2/src/truetype/ttobjs.c	1 Mar 2005 02:13:50 -0000	1.90
+++ freetype2/src/truetype/ttobjs.c	31 Jul 2005 11:41:54 -0000	1.91
@@ -121,19 +121,21 @@
     FT_Error  error;
 
 
-    if ( maxPoints > 0 )
-      maxPoints += 2;
-
     FT_MEM_ZERO( zone, sizeof ( *zone ) );
     zone->memory = memory;
 
-    if ( FT_NEW_ARRAY( zone->org,      maxPoints * 2 ) ||
-         FT_NEW_ARRAY( zone->cur,      maxPoints * 2 ) ||
-         FT_NEW_ARRAY( zone->tags,     maxPoints     ) ||
-         FT_NEW_ARRAY( zone->contours, maxContours   ) )
+    if ( FT_NEW_ARRAY( zone->org,      maxPoints   ) ||
+         FT_NEW_ARRAY( zone->cur,      maxPoints   ) ||
+         FT_NEW_ARRAY( zone->tags,     maxPoints   ) ||
+         FT_NEW_ARRAY( zone->contours, maxContours ) )
     {
       tt_glyphzone_done( zone );
     }
+    else
+    {
+      zone->max_points = maxPoints;
+      zone->max_contours = maxContours;
+    }
 
     return error;
   }
@@ -318,6 +320,162 @@
   /*                                                                       */
   /*************************************************************************/
 
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_run_fpgm                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Run the font program                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to the size object.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_run_fpgm( TT_Size  size )
+  {
+    TT_Face         face = (TT_Face)size->root.face;
+    TT_ExecContext  exec;
+    FT_Error        error;
+
+
+    /* debugging instances have their own context */
+    if ( size->debug )
+      exec = size->context;
+    else
+      exec = TT_New_Context( face );
+
+    if ( !exec )
+      return TT_Err_Could_Not_Find_Context;
+
+    TT_Load_Context( exec, face, size );
+
+    exec->callTop   = 0;
+    exec->top       = 0;
+
+    exec->period    = 64;
+    exec->phase     = 0;
+    exec->threshold = 0;
+
+    exec->instruction_trap = FALSE;
+    exec->F_dot_P = 0x10000L;
+
+    {
+      FT_Size_Metrics*  metrics    = &exec->metrics;
+      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;
+
+
+      metrics->x_ppem   = 0;
+      metrics->y_ppem   = 0;
+      metrics->x_scale  = 0;
+      metrics->y_scale  = 0;
+
+      tt_metrics->ppem  = 0;
+      tt_metrics->scale = 0;
+      tt_metrics->ratio = 0x10000L;
+    }
+
+    /* allow font program execution */
+    TT_Set_CodeRange( exec,
+                      tt_coderange_font,
+                      face->font_program,
+                      face->font_program_size );
+
+    /* disable CVT and glyph programs coderange */
+    TT_Clear_CodeRange( exec, tt_coderange_cvt );
+    TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+    if ( face->font_program_size > 0 )
+    {
+      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
+
+      if ( !error )
+        error = face->interpreter( exec );
+    }
+    else
+      error = TT_Err_Ok;
+
+    if ( !error )
+      TT_Save_Context( exec, size );
+
+    if ( !size->debug )
+      TT_Done_Context( exec );
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_run_prep                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Run the control value program                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to the size object.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_run_prep( TT_Size  size )
+  {
+    TT_Face         face = (TT_Face)size->root.face;
+    TT_ExecContext  exec;
+    FT_Error        error;
+
+
+    /* debugging instances have their own context */
+    if ( size->debug )
+      exec = size->context;
+    else
+      exec = TT_New_Context( face );
+
+    if ( !exec )
+      return TT_Err_Could_Not_Find_Context;
+
+    TT_Load_Context( exec, face, size );
+
+    exec->callTop = 0;
+    exec->top     = 0;
+
+    exec->instruction_trap = FALSE;
+
+    TT_Set_CodeRange( exec,
+                      tt_coderange_cvt,
+                      face->cvt_program,
+                      face->cvt_program_size );
+
+    TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+    if ( face->cvt_program_size > 0 )
+    {
+      error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
+
+      if ( !error && !size->debug )
+        error = face->interpreter( exec );
+    }
+    else
+      error = TT_Err_Ok;
+
+    /* save as default graphics state */
+    size->GS = exec->GS;
+
+    TT_Save_Context( exec, size );
+
+    if ( !size->debug )
+      TT_Done_Context( exec );
+
+    return error;
+  }
+#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
+
 
   /*************************************************************************/
   /*                                                                       */
@@ -338,15 +496,11 @@
   {
     TT_Size   size  = (TT_Size)ttsize;
     FT_Error  error = TT_Err_Ok;
-
-
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
-
     TT_Face    face   = (TT_Face)size->root.face;
     FT_Memory  memory = face->root.memory;
     FT_Int     i;
 
-    TT_ExecContext  exec;
     FT_UShort       n_twilight;
     TT_MaxProfile*  maxp = &face->max_profile;
 
@@ -387,17 +541,30 @@
          FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
          FT_NEW_ARRAY( size->cvt,              size->cvt_size             ) ||
          FT_NEW_ARRAY( size->storage,          size->storage_size         ) )
+    {
+      tt_size_done( ttsize );
 
-      goto Fail_Memory;
+      return error;
+    }
 
     /* reserve twilight zone */
     n_twilight = maxp->maxTwilightPoints;
+
+    /* there are 4 phantom points (do we need this?) */
+    n_twilight += 4;
+
     error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
     if ( error )
-      goto Fail_Memory;
+    {
+      tt_size_done( ttsize );
+
+      return error;
+    }
 
     size->twilight.n_points = n_twilight;
 
+    size->GS = tt_default_graphics_state;
+
     /* set `face->interpreter' according to the debug hook present */
     {
       FT_Library  library = face->root.driver->root.library;
@@ -409,95 +576,17 @@
         face->interpreter = (TT_Interpreter)TT_RunIns;
     }
 
-    /* Fine, now execute the font program! */
-    exec = size->context;
-    /* size objects used during debugging have their own context */
-    if ( !size->debug )
-      exec = TT_New_Context( face );
-
-    if ( !exec )
-    {
-      error = TT_Err_Could_Not_Find_Context;
-      goto Fail_Memory;
-    }
-
-    size->GS = tt_default_graphics_state;
-    TT_Load_Context( exec, face, size );
-
-    exec->callTop   = 0;
-    exec->top       = 0;
-
-    exec->period    = 64;
-    exec->phase     = 0;
-    exec->threshold = 0;
-
-    {
-      FT_Size_Metrics*  metrics    = &exec->metrics;
-      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;
-
-
-      metrics->x_ppem   = 0;
-      metrics->y_ppem   = 0;
-      metrics->x_scale  = 0;
-      metrics->y_scale  = 0;
-
-      tt_metrics->ppem  = 0;
-      tt_metrics->scale = 0;
-      tt_metrics->ratio = 0x10000L;
-    }
+    /* Fine, now run the font program! */
+    error = tt_size_run_fpgm( size );
 
-    exec->instruction_trap = FALSE;
-
-    exec->cvtSize = size->cvt_size;
-    exec->cvt     = size->cvt;
-
-    exec->F_dot_P = 0x10000L;
-
-    /* allow font program execution */
-    TT_Set_CodeRange( exec,
-                      tt_coderange_font,
-                      face->font_program,
-                      face->font_program_size );
-
-    /* disable CVT and glyph programs coderange */
-    TT_Clear_CodeRange( exec, tt_coderange_cvt );
-    TT_Clear_CodeRange( exec, tt_coderange_glyph );
-
-    if ( face->font_program_size > 0 )
-    {
-      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
-      if ( !error )
-        error = face->interpreter( exec );
-
-      if ( error )
-        goto Fail_Exec;
-    }
-    else
-      error = TT_Err_Ok;
-
-    TT_Save_Context( exec, size );
-
-    if ( !size->debug )
-      TT_Done_Context( exec );
+    if ( error )
+      tt_size_done( ttsize );
 
 #endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
 
     size->ttmetrics.valid = FALSE;
-    return error;
-
-#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
-
-  Fail_Exec:
-    if ( !size->debug )
-      TT_Done_Context( exec );
-
-  Fail_Memory:
 
-    tt_size_done( ttsize );
     return error;
-
-#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
-
   }
 
 
@@ -516,9 +605,7 @@
   tt_size_done( FT_Size  ttsize )           /* TT_Size */
   {
     TT_Size    size = (TT_Size)ttsize;
-
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
-
     FT_Memory  memory = size->root.face->memory;
 
 
@@ -625,10 +712,8 @@
 #endif
 
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
-
     {
-      TT_ExecContext  exec;
-      FT_UInt         i, j;
+      FT_UInt  i;
 
 
       /* Scale the cvt values to the new ppem.          */
@@ -637,12 +722,12 @@
         size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
 
       /* All twilight points are originally zero */
-      for ( j = 0; j < (FT_UInt)size->twilight.n_points; j++ )
+      for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ )
       {
-        size->twilight.org[j].x = 0;
-        size->twilight.org[j].y = 0;
-        size->twilight.cur[j].x = 0;
-        size->twilight.cur[j].y = 0;
+        size->twilight.org[i].x = 0;
+        size->twilight.org[i].y = 0;
+        size->twilight.cur[i].x = 0;
+        size->twilight.cur[i].y = 0;
       }
 
       /* clear storage area */
@@ -651,53 +736,8 @@
 
       size->GS = tt_default_graphics_state;
 
-      /* get execution context and run prep program */
-      if ( size->debug )
-        exec = size->context;
-      else
-        exec = TT_New_Context( face );
-      /* debugging instances have their own context */
-
-      if ( !exec )
-        return TT_Err_Could_Not_Find_Context;
-
-      TT_Load_Context( exec, face, size );
-
-      TT_Set_CodeRange( exec,
-                        tt_coderange_cvt,
-                        face->cvt_program,
-                        face->cvt_program_size );
-
-      TT_Clear_CodeRange( exec, tt_coderange_glyph );
-
-      exec->instruction_trap = FALSE;
-
-      exec->top     = 0;
-      exec->callTop = 0;
-
-      if ( face->cvt_program_size > 0 )
-      {
-        error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
-        if ( error )
-          goto End;
-
-        if ( !size->debug )
-          error = face->interpreter( exec );
-      }
-      else
-        error = TT_Err_Ok;
-
-      size->GS = exec->GS;
-      /* save default graphics state */
-
-    End:
-      TT_Save_Context( exec, size );
-
-      if ( !size->debug )
-        TT_Done_Context( exec );
-      /* debugging instances keep their context */
+      error = tt_size_run_prep( size );
     }
-
 #endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
 
     if ( !error )
Index: src/truetype/ttobjs.h
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/truetype/ttobjs.h,v
retrieving revision 1.36
retrieving revision 1.38
diff -u -p -r1.36 -r1.38
--- freetype2/src/truetype/ttobjs.h	4 May 2004 16:53:45 -0000	1.36
+++ freetype2/src/truetype/ttobjs.h	31 Jul 2005 11:41:54 -0000	1.38
@@ -316,7 +316,10 @@ FT_BEGIN_HEADER
   {
     FT_SizeRec         root;
 
-    FT_Size_Metrics    metrics; /* slightly different from the root metrics */
+    /* we have our own copy of metrics so that we can modify */
+    /* it without affecting auto-hinting (when used)         */
+    FT_Size_Metrics    metrics;
+
     TT_Size_Metrics    ttmetrics;
 
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
@@ -413,6 +416,14 @@ FT_BEGIN_HEADER
 
   FT_LOCAL( void )
   tt_size_done( FT_Size  ttsize );          /* TT_Size */
+
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+  FT_LOCAL( FT_Error )
+  tt_size_run_fpgm( TT_Size  size );
+
+  FT_LOCAL( FT_Error )
+  tt_size_run_prep( TT_Size  size );
+#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
 
   FT_LOCAL( FT_Error )
   tt_size_reset( TT_Size  size );
Index: src/type1/t1gload.c
===================================================================
RCS file: /cvsroot/freetype/freetype2/src/type1/t1gload.c,v
retrieving revision 1.85
retrieving revision 1.87
diff -u -p -r1.85 -r1.87
--- freetype2/src/type1/t1gload.c	13 May 2004 12:59:59 -0000	1.85
+++ freetype2/src/type1/t1gload.c	23 Jun 2005 20:31:48 -0000	1.87
@@ -315,11 +315,7 @@
         glyph->root.linearHoriAdvance           = decoder.builder.advance.x;
         glyph->root.internal->glyph_transformed = 0;
 
-        /* make up vertical metrics */
-        metrics->vertBearingX = 0;
-        metrics->vertBearingY = 0;
-        metrics->vertAdvance  = 0;
-
+        metrics->vertAdvance          = 0;
         glyph->root.linearVertAdvance = 0;
 
         glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
@@ -363,42 +359,26 @@
               vec->y = FT_MulFix( vec->y, y_scale );
             }
 
-          FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
-
           /* Then scale the metrics */
           metrics->horiAdvance  = FT_MulFix( metrics->horiAdvance,  x_scale );
           metrics->vertAdvance  = FT_MulFix( metrics->vertAdvance,  y_scale );
-
-          metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
-          metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
-
-          if ( hinting )
-          {
-            metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
-            metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
-
-            metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX );
-            metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY );
-          }
         }
 
         /* compute the other metrics */
         FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
 
-        /* grid fit the bounding box if necessary */
-        if ( hinting )
-        {
-          cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
-          cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
-          cbox.xMax = FT_PIX_CEIL( cbox.xMax );
-          cbox.yMax = FT_PIX_CEIL( cbox.yMax );
-        }
-
         metrics->width  = cbox.xMax - cbox.xMin;
         metrics->height = cbox.yMax - cbox.yMin;
 
         metrics->horiBearingX = cbox.xMin;
         metrics->horiBearingY = cbox.yMax;
+
+        /* make up vertical ones */
+        metrics->vertBearingX = 0;
+        metrics->vertBearingY = 0;
+
+        if ( hinting )
+          ft_glyphslot_grid_fit_metrics( &glyph->root );
       }
 
       /* Set control data to the glyph charstrings.  Note that this is */
 
design & coding: Vladimir Lettiev aka crux © 2004-2005