freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] master f147fb2: [truetype] More fixes for GX.


From: Werner LEMBERG
Subject: [freetype2] master f147fb2: [truetype] More fixes for GX.
Date: Sat, 16 Jul 2016 05:40:09 +0000 (UTC)

branch: master
commit f147fb28817c5ca33cbefca8f0509579af13d5da
Author: Werner Lemberg <address@hidden>
Commit: Werner Lemberg <address@hidden>

    [truetype] More fixes for GX.
    
    This finally fixes the rendering of the cyclist and the lizard in
    the `Zycon' font.
    
    * src/truetype/ttgxvar.c (ft_var_readpackedpoints): `first' point
    index is always cumulative.
    
    (tt_handle_deltas): Rename to...
    (tt_interpolate_deltas): ... This.
    Add new parameter for output point array.
    Update caller.
    
    (TT_Vary_Apply_Glyph_Deltas): Add `points_out' array; it now holds
    the intermediate results of `tt_interpolate_deltas' that are to be
    added to `outline->points'.
---
 ChangeLog              |   19 +++++++++++++++++++
 src/truetype/ttgxvar.c |   39 +++++++++++++++++++++++++--------------
 2 files changed, 44 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 34394a4..9ae3ce6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2016-07-14  Behdad Esfahbod  <address@hidden>
+
+       [truetype] More fixes for GX.
+
+       This finally fixes the rendering of the cyclist and the lizard in
+       the `Zycon' font.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): `first' point
+       index is always cumulative.
+
+       (tt_handle_deltas): Rename to...
+       (tt_interpolate_deltas): ... This.
+       Add new parameter for output point array.
+       Update caller.
+
+       (TT_Vary_Apply_Glyph_Deltas): Add `points_out' array; it now holds
+       the intermediate results of `tt_interpolate_deltas' that are to be
+       added to `outline->points'.
+
 2016-07-15  Werner Lemberg  <address@hidden>
 
        * src/autofit/aflatin.c (af_latin_hints_compute_segments): Thinko.
diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c
index 906ca4a..1a57153 100644
--- a/src/truetype/ttgxvar.c
+++ b/src/truetype/ttgxvar.c
@@ -163,6 +163,7 @@
 
     *point_cnt = n;
 
+    first = 0;
     i = 0;
     while ( i < n )
     {
@@ -170,7 +171,7 @@
       if ( runcnt & GX_PT_POINTS_ARE_WORDS )
       {
         runcnt     &= GX_PT_POINT_RUN_COUNT_MASK;
-        first       = FT_GET_USHORT();
+        first      += FT_GET_USHORT();
         points[i++] = first;
 
         if ( runcnt < 1 || i + runcnt > n )
@@ -185,7 +186,7 @@
       }
       else
       {
-        first       = FT_GET_BYTE();
+        first      += FT_GET_BYTE();
         points[i++] = first;
 
         if ( runcnt < 1 || i + runcnt > n )
@@ -1716,12 +1717,11 @@
   /* modeled after `Ins_IUP */
 
   static void
-  tt_handle_deltas( FT_Outline*  outline,
-                    FT_Vector*   in_points,
-                    FT_Bool*     has_delta )
+  tt_interpolate_deltas( FT_Outline*  outline,
+                         FT_Vector*   out_points,
+                         FT_Vector*   in_points,
+                         FT_Bool*     has_delta )
   {
-    FT_Vector*  out_points;
-
     FT_Int  first_point;
     FT_Int  end_point;
 
@@ -1736,8 +1736,6 @@
     if ( !outline->n_contours )
       return;
 
-    out_points = outline->points;
-
     contour = 0;
     point   = 0;
 
@@ -1841,6 +1839,7 @@
     GX_Blend    blend  = face->blend;
 
     FT_Vector*  points_org = NULL;
+    FT_Vector*  points_out = NULL;
     FT_Bool*    has_delta  = NULL;
 
     FT_Error    error;
@@ -1872,6 +1871,7 @@
     }
 
     if ( FT_NEW_ARRAY( points_org, n_points ) ||
+         FT_NEW_ARRAY( points_out, n_points ) ||
          FT_NEW_ARRAY( has_delta, n_points )  )
       goto Fail1;
 
@@ -2060,7 +2060,10 @@
         /* we have to interpolate the missing deltas similar to the */
         /* IUP bytecode instruction                                 */
         for ( j = 0; j < n_points; j++ )
+        {
           has_delta[j]  = FALSE;
+          points_out[j] = points_org[j];
+        }
 
         for ( j = 0; j < point_count; j++ )
         {
@@ -2072,15 +2075,22 @@
 
           has_delta[idx] = TRUE;
 
-          outline->points[idx].x += FT_MulFix( deltas_x[j], apply );
-          outline->points[idx].y += FT_MulFix( deltas_y[j], apply );
+          points_out[idx].x += FT_MulFix( deltas_x[j], apply );
+          points_out[idx].y += FT_MulFix( deltas_y[j], apply );
         }
 
         /* no need to handle phantom points here,      */
         /* since solitary points can't be interpolated */
-        tt_handle_deltas( outline,
-                          points_org,
-                          has_delta );
+        tt_interpolate_deltas( outline,
+                               points_out,
+                               points_org,
+                               has_delta );
+
+        for ( j = 0; j < n_points; j++ )
+        {
+          outline->points[j].x += points_out[j].x - points_org[j].x;
+          outline->points[j].y += points_out[j].y - points_org[j].y;
+        }
 
 #ifdef FT_DEBUG_LEVEL_TRACE
         FT_TRACE7(( "    point deltas:\n" ));
@@ -2128,6 +2138,7 @@
 
   Fail1:
     FT_FREE( points_org );
+    FT_FREE( points_out );
     FT_FREE( has_delta );
 
     return error;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]