freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] master 7e23568 3/3: [type1, cid] Add hinting engine switch.


From: Hew Yih Shiuan Ewald
Subject: [freetype2] master 7e23568 3/3: [type1, cid] Add hinting engine switch.
Date: Thu, 12 Oct 2017 06:34:14 -0400 (EDT)

branch: master
commit 7e23568b163bc3ab2b4fe735fd538c35246fca05
Author: Ewald Hew <address@hidden>
Commit: Ewald Hew <address@hidden>

    [type1, cid] Add hinting engine switch.
    
    Implement property service in `type1' and `cid' drivers to allow
    switching between FreeType or Adobe hinting engine when both are
    available.
    
    * src/cid/cidriver.c (cid_property_{set,get}, cid_services),
    src/type1/t1driver.c (t1_property_{set,get}, t1_services): Add
    Properties service.
    
    * src/cid/cidobjs.c (cid_driver_init), src/type1/t1objs.c
    (T1_Driver_Init): Add default property values.
---
 ChangeLog            |  15 ++++
 src/cid/cidobjs.c    |   6 +-
 src/cid/cidriver.c   | 234 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/type1/t1driver.c | 234 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/type1/t1objs.c   |   4 +
 5 files changed, 492 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 3a35eed..2f8d322 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 2017-10-12  Ewald Hew  <address@hidden>
 
+       [type1, cid] Add hinting engine switch.
+
+       Implement property service in `type1' and `cid' drivers to allow
+       switching between FreeType or Adobe hinting engine when both are
+       available.
+
+       * src/cid/cidriver.c (cid_property_{set,get}, cid_services),
+       src/type1/t1driver.c (t1_property_{set,get}, t1_services): Add
+       Properties service.
+
+       * src/cid/cidobjs.c (cid_driver_init), src/type1/t1objs.c
+       (T1_Driver_Init): Add default property values.
+
+2017-10-12  Ewald Hew  <address@hidden>
+
        Add T1_CONFIG_OPTION_OLD_ENGINE configuration option.
 
        This controls whether the old Type 1 engine gets compiled into FreeType.
diff --git a/src/cid/cidobjs.c b/src/cid/cidobjs.c
index 52c6438..4f4cf46 100644
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -471,8 +471,12 @@
     FT_UInt32  seed;
 
 
-    /* set default property values, cf. `ftcffdrv.h' */
+    /* set default property values, cf. `ftt1drv.h' */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    driver->hinting_engine = FT_T1_HINTING_FREETYPE;
+#else
     driver->hinting_engine = FT_T1_HINTING_ADOBE;
+#endif
 
     driver->no_stem_darkening = TRUE;
 
diff --git a/src/cid/cidriver.c b/src/cid/cidriver.c
index c7d42f9..2ee2707 100644
--- a/src/cid/cidriver.c
+++ b/src/cid/cidriver.c
@@ -27,6 +27,8 @@
 #include FT_SERVICE_FONT_FORMAT_H
 #include FT_SERVICE_POSTSCRIPT_INFO_H
 #include FT_SERVICE_CID_H
+#include FT_SERVICE_PROPERTIES_H
+#include FT_TYPE1_DRIVER_H
 
 
   /*************************************************************************/
@@ -168,6 +170,237 @@
 
 
   /*
+   *  PROPERTY SERVICE
+   *
+   */
+  static FT_Error
+  cid_property_set( FT_Module    module,         /* PS_Driver */
+                    const char*  property_name,
+                    const void*  value,
+                    FT_Bool      value_is_string )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    PS_Driver  driver = (PS_Driver)module;
+
+#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+    FT_UNUSED( value_is_string );
+#endif
+
+
+    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params;
+      FT_Int   x1, y1, x2, y2, x3, y3, x4, y4;
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      FT_Int   dp[8];
+
+
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+        char*        ep;
+        int          i;
+
+
+        /* eight comma-separated numbers */
+        for ( i = 0; i < 7; i++ )
+        {
+          dp[i] = (FT_Int)ft_strtol( s, &ep, 10 );
+          if ( *ep != ',' || s == ep )
+            return FT_THROW( Invalid_Argument );
+
+          s = ep + 1;
+        }
+
+        dp[7] = (FT_Int)ft_strtol( s, &ep, 10 );
+        if ( !( *ep == '\0' || *ep == ' ' ) || s == ep )
+          return FT_THROW( Invalid_Argument );
+
+        darken_params = dp;
+      }
+      else
+#endif
+        darken_params = (FT_Int*)value;
+
+      x1 = darken_params[0];
+      y1 = darken_params[1];
+      x2 = darken_params[2];
+      y2 = darken_params[3];
+      x3 = darken_params[4];
+      y3 = darken_params[5];
+      x4 = darken_params[6];
+      y4 = darken_params[7];
+
+      if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
+           y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
+           x1 > x2  || x2 > x3  || x3 > x4              ||
+           y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
+        return FT_THROW( Invalid_Argument );
+
+      driver->darken_params[0] = x1;
+      driver->darken_params[1] = y1;
+      driver->darken_params[2] = x2;
+      driver->darken_params[3] = y2;
+      driver->darken_params[4] = x3;
+      driver->darken_params[5] = y3;
+      driver->darken_params[6] = x4;
+      driver->darken_params[7] = y4;
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+
+
+        if ( !ft_strcmp( s, "adobe" ) )
+          driver->hinting_engine = FT_T1_HINTING_ADOBE;
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+        else if ( !ft_strcmp( s, "freetype" ) )
+          driver->hinting_engine = FT_T1_HINTING_FREETYPE;
+#endif
+        else
+          return FT_THROW( Invalid_Argument );
+      }
+      else
+#endif
+      {
+        FT_UInt*  hinting_engine = (FT_UInt*)value;
+
+
+        if ( *hinting_engine == FT_T1_HINTING_ADOBE
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+             || *hinting_engine == FT_T1_HINTING_FREETYPE
+#endif
+           )
+          driver->hinting_engine = *hinting_engine;
+        else
+          error = FT_ERR( Unimplemented_Feature );
+
+        return error;
+      }
+    }
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s   = (const char*)value;
+        long         nsd = ft_strtol( s, NULL, 10 );
+
+
+        if ( !nsd )
+          driver->no_stem_darkening = FALSE;
+        else
+          driver->no_stem_darkening = TRUE;
+      }
+      else
+#endif
+      {
+        FT_Bool*  no_stem_darkening = (FT_Bool*)value;
+
+
+        driver->no_stem_darkening = *no_stem_darkening;
+      }
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "random-seed" ) )
+    {
+      FT_Int32  random_seed;
+
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+
+
+        random_seed = (FT_Int32)ft_strtol( s, NULL, 10 );
+      }
+      else
+#endif
+        random_seed = *(FT_Int32*)value;
+
+      if ( random_seed < 0 )
+        random_seed = 0;
+
+      driver->random_seed = random_seed;
+
+      return error;
+    }
+
+    FT_TRACE0(( "cid_property_set: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  static FT_Error
+  cid_property_get( FT_Module    module,         /* PS_Driver */
+                    const char*  property_name,
+                    const void*  value )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    PS_Driver  driver = (PS_Driver)module;
+
+
+    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params = driver->darken_params;
+      FT_Int*  val           = (FT_Int*)value;
+
+
+      val[0] = darken_params[0];
+      val[1] = darken_params[1];
+      val[2] = darken_params[2];
+      val[3] = darken_params[3];
+      val[4] = darken_params[4];
+      val[5] = darken_params[5];
+      val[6] = darken_params[6];
+      val[7] = darken_params[7];
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+      FT_UInt   hinting_engine    = driver->hinting_engine;
+      FT_UInt*  val               = (FT_UInt*)value;
+
+
+      *val = hinting_engine;
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+      FT_Bool   no_stem_darkening = driver->no_stem_darkening;
+      FT_Bool*  val               = (FT_Bool*)value;
+
+
+      *val = no_stem_darkening;
+
+      return error;
+    }
+
+    FT_TRACE0(( "cid_property_get: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    cid_service_properties,
+
+    (FT_Properties_SetFunc)cid_property_set,      /* set_property */
+    (FT_Properties_GetFunc)cid_property_get )     /* get_property */
+
+
+  /*
    *  SERVICE LIST
    *
    */
@@ -178,6 +411,7 @@
     { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name },
     { FT_SERVICE_ID_POSTSCRIPT_INFO,      &cid_service_ps_info },
     { FT_SERVICE_ID_CID,                  &cid_service_cid_info },
+    { FT_SERVICE_ID_PROPERTIES,           &cid_service_properties },
     { NULL, NULL }
   };
 
diff --git a/src/type1/t1driver.c b/src/type1/t1driver.c
index 06cb26e..c955932 100644
--- a/src/type1/t1driver.c
+++ b/src/type1/t1driver.c
@@ -30,6 +30,7 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_HASH_H
+#include FT_TYPE1_DRIVER_H
 
 #include FT_SERVICE_MULTIPLE_MASTERS_H
 #include FT_SERVICE_GLYPH_DICT_H
@@ -37,6 +38,7 @@
 #include FT_SERVICE_POSTSCRIPT_NAME_H
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include FT_SERVICE_POSTSCRIPT_INFO_H
+#include FT_SERVICE_PROPERTIES_H
 #include FT_SERVICE_KERNING_H
 
 
@@ -615,6 +617,237 @@
 
 
   /*
+   *  PROPERTY SERVICE
+   *
+   */
+  static FT_Error
+  t1_property_set( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   const void*  value,
+                   FT_Bool      value_is_string )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    PS_Driver  driver = (PS_Driver)module;
+
+#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+    FT_UNUSED( value_is_string );
+#endif
+
+
+    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params;
+      FT_Int   x1, y1, x2, y2, x3, y3, x4, y4;
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      FT_Int   dp[8];
+
+
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+        char*        ep;
+        int          i;
+
+
+        /* eight comma-separated numbers */
+        for ( i = 0; i < 7; i++ )
+        {
+          dp[i] = (FT_Int)ft_strtol( s, &ep, 10 );
+          if ( *ep != ',' || s == ep )
+            return FT_THROW( Invalid_Argument );
+
+          s = ep + 1;
+        }
+
+        dp[7] = (FT_Int)ft_strtol( s, &ep, 10 );
+        if ( !( *ep == '\0' || *ep == ' ' ) || s == ep )
+          return FT_THROW( Invalid_Argument );
+
+        darken_params = dp;
+      }
+      else
+#endif
+        darken_params = (FT_Int*)value;
+
+      x1 = darken_params[0];
+      y1 = darken_params[1];
+      x2 = darken_params[2];
+      y2 = darken_params[3];
+      x3 = darken_params[4];
+      y3 = darken_params[5];
+      x4 = darken_params[6];
+      y4 = darken_params[7];
+
+      if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
+           y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
+           x1 > x2  || x2 > x3  || x3 > x4              ||
+           y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
+        return FT_THROW( Invalid_Argument );
+
+      driver->darken_params[0] = x1;
+      driver->darken_params[1] = y1;
+      driver->darken_params[2] = x2;
+      driver->darken_params[3] = y2;
+      driver->darken_params[4] = x3;
+      driver->darken_params[5] = y3;
+      driver->darken_params[6] = x4;
+      driver->darken_params[7] = y4;
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+
+
+        if ( !ft_strcmp( s, "adobe" ) )
+          driver->hinting_engine = FT_T1_HINTING_ADOBE;
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+        else if ( !ft_strcmp( s, "freetype" ) )
+          driver->hinting_engine = FT_T1_HINTING_FREETYPE;
+#endif
+        else
+          return FT_THROW( Invalid_Argument );
+      }
+      else
+#endif
+      {
+        FT_UInt*  hinting_engine = (FT_UInt*)value;
+
+
+        if ( *hinting_engine == FT_T1_HINTING_ADOBE
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+             || *hinting_engine == FT_T1_HINTING_FREETYPE
+#endif
+           )
+          driver->hinting_engine = *hinting_engine;
+        else
+          error = FT_ERR( Unimplemented_Feature );
+
+        return error;
+      }
+    }
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s   = (const char*)value;
+        long         nsd = ft_strtol( s, NULL, 10 );
+
+
+        if ( !nsd )
+          driver->no_stem_darkening = FALSE;
+        else
+          driver->no_stem_darkening = TRUE;
+      }
+      else
+#endif
+      {
+        FT_Bool*  no_stem_darkening = (FT_Bool*)value;
+
+
+        driver->no_stem_darkening = *no_stem_darkening;
+      }
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "random-seed" ) )
+    {
+      FT_Int32  random_seed;
+
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+
+
+        random_seed = (FT_Int32)ft_strtol( s, NULL, 10 );
+      }
+      else
+#endif
+        random_seed = *(FT_Int32*)value;
+
+      if ( random_seed < 0 )
+        random_seed = 0;
+
+      driver->random_seed = random_seed;
+
+      return error;
+    }
+
+    FT_TRACE0(( "t1_property_set: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  static FT_Error
+  t1_property_get( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   const void*  value )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    PS_Driver  driver = (PS_Driver)module;
+
+
+    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params = driver->darken_params;
+      FT_Int*  val           = (FT_Int*)value;
+
+
+      val[0] = darken_params[0];
+      val[1] = darken_params[1];
+      val[2] = darken_params[2];
+      val[3] = darken_params[3];
+      val[4] = darken_params[4];
+      val[5] = darken_params[5];
+      val[6] = darken_params[6];
+      val[7] = darken_params[7];
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+      FT_UInt   hinting_engine    = driver->hinting_engine;
+      FT_UInt*  val               = (FT_UInt*)value;
+
+
+      *val = hinting_engine;
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+      FT_Bool   no_stem_darkening = driver->no_stem_darkening;
+      FT_Bool*  val               = (FT_Bool*)value;
+
+
+      *val = no_stem_darkening;
+
+      return error;
+    }
+
+    FT_TRACE0(( "t1_property_get: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    t1_service_properties,
+
+    (FT_Properties_SetFunc)t1_property_set,      /* set_property */
+    (FT_Properties_GetFunc)t1_property_get )     /* get_property */
+
+
+  /*
    *  SERVICE LIST
    *
    */
@@ -625,6 +858,7 @@
     { FT_SERVICE_ID_GLYPH_DICT,           &t1_service_glyph_dict },
     { FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_TYPE_1 },
     { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t1_service_ps_info },
+    { FT_SERVICE_ID_PROPERTIES,           &t1_service_properties },
 
 #ifndef T1_CONFIG_OPTION_NO_AFM
     { FT_SERVICE_ID_KERNING,              &t1_service_kerning },
diff --git a/src/type1/t1objs.c b/src/type1/t1objs.c
index 8cdbb93..c6bae00 100644
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -587,7 +587,11 @@
 
 
     /* set default property values, cf. `ftt1drv.h' */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    driver->hinting_engine = FT_T1_HINTING_FREETYPE;
+#else
     driver->hinting_engine = FT_T1_HINTING_ADOBE;
+#endif
 
     driver->no_stem_darkening = TRUE;
 



reply via email to

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