freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] master 4717696 1/8: [truetype] Split off designer/normalized


From: Werner LEMBERG
Subject: [freetype2] master 4717696 1/8: [truetype] Split off designer/normalized conversion routines.
Date: Mon, 6 Mar 2017 14:47:01 -0500 (EST)

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

    [truetype] Split off designer/normalized conversion routines.
    
    * src/truetype/ttgxvar.c (TT_Set_Var_Design): Split off conversion
    code designer->normalized coordinates to...
    (ft_var_to_normalized): ... New function.
    (TT_Get_Var_Design): Split off conversion code normalized->designer
    coordinates to...
    (ft_var_to_design): ... New function.
---
 ChangeLog              |  13 +-
 src/truetype/ttgxvar.c | 363 +++++++++++++++++++++++++++----------------------
 2 files changed, 211 insertions(+), 165 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 7076a6e..d1003b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,15 @@
-2017-02-23  Werner Lemberg  <address@hidden>
+2017-03-02  Werner Lemberg  <address@hidden>
+
+       [truetype] Split off designer/normalized conversion routines.
+
+       * src/truetype/ttgxvar.c (TT_Set_Var_Design): Split off conversion
+       code designer->normalized coordinates to...
+       (ft_var_to_normalized): ... New function.
+       (TT_Get_Var_Design): Split off conversion code normalized->designer
+       coordinates to...
+       (ft_var_to_design): ... New function.
+
+2017-02-28  Werner Lemberg  <address@hidden>
 
        [sfnt] Further generalize `sfnt_get_ps_name'; report invalid data.
 
diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c
index 6907775..22297df 100644
--- a/src/truetype/ttgxvar.c
+++ b/src/truetype/ttgxvar.c
@@ -1683,6 +1683,190 @@
   }
 
 
+  /* convert from design coordinates to normalized coordinates */
+
+  static void
+  ft_var_to_normalized( TT_Face    face,
+                        FT_UInt    num_coords,
+                        FT_Fixed*  coords,
+                        FT_Fixed*  normalized )
+  {
+    GX_Blend        blend;
+    FT_MM_Var*      mmvar;
+    FT_UInt         i, j;
+    FT_Var_Axis*    a;
+    GX_AVarSegment  av;
+
+
+    blend = face->blend;
+    mmvar = blend->mmvar;
+
+    if ( num_coords > mmvar->num_axis )
+    {
+      FT_TRACE2(( "ft_var_to_normalized:"
+                  " only using first %d of %d coordinates\n",
+                  mmvar->num_axis, num_coords ));
+      num_coords = mmvar->num_axis;
+    }
+
+    /* Axis normalization is a two-stage process.  First we normalize */
+    /* based on the [min,def,max] values for the axis to be [-1,0,1]. */
+    /* Then, if there's an `avar' table, we renormalize this range.   */
+
+    FT_TRACE5(( "design coordinates:\n" ));
+
+    a = mmvar->axis;
+    for ( i = 0; i < num_coords; i++, a++ )
+    {
+      FT_Fixed  coord = coords[i];
+
+
+      FT_TRACE5(( "  %.5f\n", coord / 65536.0 ));
+      if ( coord > a->maximum || coord < a->minimum )
+      {
+        FT_TRACE1((
+          "ft_var_to_normalized: design coordinate %.5f\n"
+          "                      is out of range [%.5f;%.5f]; clamping\n",
+          coord / 65536.0,
+          a->minimum / 65536.0,
+          a->maximum / 65536.0 ));
+
+        if ( coord > a->maximum)
+          coord = a->maximum;
+        else
+          coord = a->minimum;
+      }
+
+      if ( coord < a->def )
+        normalized[i] = -FT_DivFix( coords[i] - a->def,
+                                    a->minimum - a->def );
+      else if ( coord > a->def )
+        normalized[i] = FT_DivFix( coords[i] - a->def,
+                                   a->maximum - a->def );
+      else
+        normalized[i] = 0;
+    }
+
+    FT_TRACE5(( "\n" ));
+
+    for ( ; i < mmvar->num_axis; i++ )
+      normalized[i] = 0;
+
+    if ( blend->avar_segment )
+    {
+      FT_TRACE5(( "normalized design coordinates"
+                  " before applying `avar' data:\n" ));
+
+      av = blend->avar_segment;
+      for ( i = 0; i < mmvar->num_axis; i++, av++ )
+      {
+        for ( j = 1; j < (FT_UInt)av->pairCount; j++ )
+        {
+          if ( normalized[i] < av->correspondence[j].fromCoord )
+          {
+            FT_TRACE5(( "  %.5f\n", normalized[i] / 65536.0 ));
+
+            normalized[i] =
+              FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,
+                         av->correspondence[j].toCoord -
+                           av->correspondence[j - 1].toCoord,
+                         av->correspondence[j].fromCoord -
+                           av->correspondence[j - 1].fromCoord ) +
+              av->correspondence[j - 1].toCoord;
+            break;
+          }
+        }
+      }
+    }
+  }
+
+
+  /* convert from normalized coordinates to design coordinates */
+
+  static void
+  ft_var_to_design( TT_Face    face,
+                    FT_UInt    num_coords,
+                    FT_Fixed*  coords,
+                    FT_Fixed*  design )
+  {
+    GX_Blend      blend;
+    FT_MM_Var*    mmvar;
+    FT_Var_Axis*  a;
+
+    FT_UInt  i, j, nc;
+
+
+    blend = face->blend;
+
+    nc = num_coords;
+    if ( num_coords > blend->num_axis )
+    {
+      FT_TRACE2(( "ft_var_to_design:"
+                  " only using first %d of %d coordinates\n",
+                  blend->num_axis, num_coords ));
+      nc = blend->num_axis;
+    }
+
+    if ( face->doblend )
+    {
+      for ( i = 0; i < nc; i++ )
+        design[i] = coords[i];
+    }
+    else
+    {
+      for ( i = 0; i < nc; i++ )
+        design[i] = 0;
+    }
+
+    for ( ; i < num_coords; i++ )
+      design[i] = 0;
+
+    if ( blend->avar_segment )
+    {
+      GX_AVarSegment  av = blend->avar_segment;
+
+
+      FT_TRACE5(( "design coordinates"
+                  " after removing `avar' distortion:\n" ));
+
+      for ( i = 0; i < nc; i++, av++ )
+      {
+        for ( j = 1; j < (FT_UInt)av->pairCount; j++ )
+        {
+          if ( design[i] < av->correspondence[j].toCoord )
+          {
+            design[i] =
+              FT_MulDiv( design[i] - av->correspondence[j - 1].toCoord,
+                         av->correspondence[j].fromCoord -
+                           av->correspondence[j - 1].fromCoord,
+                         av->correspondence[j].toCoord -
+                           av->correspondence[j - 1].toCoord ) +
+              av->correspondence[j - 1].fromCoord;
+
+            FT_TRACE5(( "  %.5f\n", design[i] / 65536.0 ));
+            break;
+          }
+        }
+      }
+    }
+
+    mmvar = blend->mmvar;
+    a     = mmvar->axis;
+
+    for ( i = 0; i < nc; i++, a++ )
+    {
+      if ( design[i] < 0 )
+        design[i] = a->def + FT_MulFix( design[i],
+                                        a->def - a->minimum );
+      else if ( design[i] > 0 )
+        design[i] = a->def + FT_MulFix( design[i],
+                                        a->maximum - a->def );
+      else
+        design[i] = a->def;
+    }
+  }
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -2262,14 +2446,11 @@
                      FT_UInt    num_coords,
                      FT_Fixed*  coords )
   {
-    FT_Error        error      = FT_Err_Ok;
-    FT_Fixed*       normalized = NULL;
-    GX_Blend        blend;
-    FT_MM_Var*      mmvar;
-    FT_UInt         i, j;
-    FT_Var_Axis*    a;
-    GX_AVarSegment  av;
-    FT_Memory       memory = face->root.memory;
+    FT_Error   error  = FT_Err_Ok;
+    FT_Memory  memory = face->root.memory;
+
+    FT_Fixed*  normalized = NULL;
+    FT_UInt    num_axes;
 
 
     if ( !face->blend )
@@ -2278,94 +2459,17 @@
         goto Exit;
     }
 
-    blend = face->blend;
-    mmvar = blend->mmvar;
-
-    if ( num_coords > mmvar->num_axis )
-    {
-      FT_TRACE2(( "TT_Set_Var_Design:"
-                  " only using first %d of %d coordinates\n",
-                  mmvar->num_axis, num_coords ));
-      num_coords = mmvar->num_axis;
-    }
-
-    /* Axis normalization is a two-stage process.  First we normalize */
-    /* based on the [min,def,max] values for the axis to be [-1,0,1]. */
-    /* Then, if there's an `avar' table, we renormalize this range.   */
+    num_axes = face->blend->mmvar->num_axis;
 
-    if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
+    if ( FT_NEW_ARRAY( normalized, num_axes ) )
       goto Exit;
 
-    FT_TRACE5(( "design coordinates:\n" ));
-
-    a = mmvar->axis;
-    for ( i = 0; i < num_coords; i++, a++ )
-    {
-      FT_Fixed  coord = coords[i];
-
-
-      FT_TRACE5(( "  %.5f\n", coord / 65536.0 ));
-      if ( coord > a->maximum || coord < a->minimum )
-      {
-        FT_TRACE1((
-          "TT_Set_Var_Design: design coordinate %.5f\n"
-          "                   is out of range [%.5f;%.5f]; clamping\n",
-          coord / 65536.0,
-          a->minimum / 65536.0,
-          a->maximum / 65536.0 ));
-
-        if ( coord > a->maximum)
-          coord = a->maximum;
-        else
-          coord = a->minimum;
-      }
-
-      if ( coord < a->def )
-        normalized[i] = -FT_DivFix( coords[i] - a->def,
-                                    a->minimum - a->def );
-      else if ( coord > a->def )
-        normalized[i] = FT_DivFix( coords[i] - a->def,
-                                   a->maximum - a->def );
-      else
-        normalized[i] = 0;
-    }
-
-    FT_TRACE5(( "\n" ));
-
-    for ( ; i < mmvar->num_axis; i++ )
-      normalized[i] = 0;
-
-    if ( !blend->avar_checked )
+    if ( !face->blend->avar_checked )
       ft_var_load_avar( face );
 
-    if ( blend->avar_segment )
-    {
-      FT_TRACE5(( "normalized design coordinates"
-                  " before applying `avar' data:\n" ));
-
-      av = blend->avar_segment;
-      for ( i = 0; i < mmvar->num_axis; i++, av++ )
-      {
-        for ( j = 1; j < (FT_UInt)av->pairCount; j++ )
-        {
-          if ( normalized[i] < av->correspondence[j].fromCoord )
-          {
-            FT_TRACE5(( "  %.5f\n", normalized[i] / 65536.0 ));
-
-            normalized[i] =
-              FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,
-                         av->correspondence[j].toCoord -
-                           av->correspondence[j - 1].toCoord,
-                         av->correspondence[j].fromCoord -
-                           av->correspondence[j - 1].fromCoord ) +
-              av->correspondence[j - 1].toCoord;
-            break;
-          }
-        }
-      }
-    }
+    ft_var_to_normalized( face, num_coords, coords, normalized );
 
-    error = TT_Set_MM_Blend( face, mmvar->num_axis, normalized );
+    error = TT_Set_MM_Blend( face, num_axes, normalized );
 
   Exit:
     FT_FREE( normalized );
@@ -2402,12 +2506,6 @@
   {
     FT_Error  error = FT_Err_Ok;
 
-    GX_Blend      blend;
-    FT_MM_Var*    mmvar;
-    FT_Var_Axis*  a;
-
-    FT_UInt  i, j, nc;
-
 
     if ( !face->blend )
     {
@@ -2415,76 +2513,13 @@
         return error;
     }
 
-    blend = face->blend;
-
-    nc = num_coords;
-    if ( num_coords > blend->num_axis )
-    {
-      FT_TRACE2(( "TT_Get_Var_Design: only using first %d of %d coordinates\n",
-                  blend->num_axis, num_coords ));
-      nc = blend->num_axis;
-    }
-
-    if ( face->doblend )
-    {
-      for ( i = 0; i < nc; i++ )
-        coords[i] = blend->normalizedcoords[i];
-    }
-    else
-    {
-      for ( i = 0; i < nc; i++ )
-        coords[i] = 0;
-    }
-
-    for ( ; i < num_coords; i++ )
-      coords[i] = 0;
-
-    if ( !blend->avar_checked )
+    if ( !face->blend->avar_checked )
       ft_var_load_avar( face );
 
-    if ( blend->avar_segment )
-    {
-      GX_AVarSegment  av = blend->avar_segment;
-
-
-      FT_TRACE5(( "design coordinates"
-                  " after removing `avar' distortion:\n" ));
-
-      for ( i = 0; i < nc; i++, av++ )
-      {
-        for ( j = 1; j < (FT_UInt)av->pairCount; j++ )
-        {
-          if ( coords[i] < av->correspondence[j].toCoord )
-          {
-            coords[i] =
-              FT_MulDiv( coords[i] - av->correspondence[j - 1].toCoord,
-                         av->correspondence[j].fromCoord -
-                           av->correspondence[j - 1].fromCoord,
-                         av->correspondence[j].toCoord -
-                           av->correspondence[j - 1].toCoord ) +
-              av->correspondence[j - 1].fromCoord;
-
-            FT_TRACE5(( "  %.5f\n", coords[i] / 65536.0 ));
-            break;
-          }
-        }
-      }
-    }
-
-    mmvar = blend->mmvar;
-    a     = mmvar->axis;
-
-    for ( i = 0; i < nc; i++, a++ )
-    {
-      if ( coords[i] < 0 )
-        coords[i] = a->def + FT_MulFix( coords[i],
-                                        a->def - a->minimum );
-      else if ( coords[i] > 0 )
-        coords[i] = a->def + FT_MulFix( coords[i],
-                                        a->maximum - a->def );
-      else
-        coords[i] = a->def;
-    }
+    ft_var_to_design( face,
+                      num_coords,
+                      face->blend->normalizedcoords,
+                      coords );
 
     return FT_Err_Ok;
   }



reply via email to

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