shithub: freetype+ttf2subf

Download patch

ref: a956e36c8d17d0e10bdb5b71cae12d1c5695c559
parent: 08cd62deedefe217f2ea50e392923ce8b5bc7ac7
author: Ewald Hew <[email protected]>
date: Mon Dec 25 07:34:37 EST 2017

Move PostScript drivers' property handlers to `base'

This reduces the amount of duplicated code across PostScript drivers.

* src/cff/cffdrivr.c, src/cid/cidriver.c, src/type1/t1driver.c
({cff,cid,t1}_property_{get,set}): Moved to...
* include/freetype/internal/ftpsprop.h: ...this new file.
(ps_property_{get,set}): New functions to replace moved ones.
* src/base/ftpsprop.c: Implement above functions.

* include/freetype/internal/internal.h (FT_INTERNAL_POSTSCRIPT_PROPS_H):
New macro.
* src/cff/cffdrivr.c, src/cid/cidriver.c, src/type1/t1driver.c: Updated.

* src/base/Jamfile, src/base/rules.mk, src/base/ftbase.c: Updated.

git/fs: mount .git/fs: mount/attach disallowed
--- /dev/null
+++ b/include/freetype/internal/ftpsprop.h
@@ -1,0 +1,39 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpsprop.h                                                             */
+/*                                                                         */
+/*    Get and set properties of PostScript drivers (specification).        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef FTPSPROP_H_
+#define FTPSPROP_H_
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_Error
+  ps_property_set( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   const void*  value,
+                   FT_Bool      value_is_string );
+
+  FT_Error
+  ps_property_get( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   const void*  value );
+
+
+FT_END_HEADER
+
+
+#endif /* FTPSPROP_H_ */
+
+
+/* END */
--- a/include/freetype/internal/internal.h
+++ b/include/freetype/internal/internal.h
@@ -44,6 +44,7 @@
 
 #define FT_INTERNAL_POSTSCRIPT_AUX_H      <freetype/internal/psaux.h>
 #define FT_INTERNAL_POSTSCRIPT_HINTS_H    <freetype/internal/pshints.h>
+#define FT_INTERNAL_POSTSCRIPT_PROPS_H    <freetype/internal/ftpsprop.h>
 
 #define FT_INTERNAL_AUTOHINT_H            <freetype/internal/autohint.h>
 
--- a/src/base/Jamfile
+++ b/src/base/Jamfile
@@ -26,6 +26,7 @@
                ftobjs
                ftoutln
                ftpic
+               ftpsprop
                ftrfork
                ftsnames
                ftstream
--- a/src/base/ftbase.c
+++ b/src/base/ftbase.c
@@ -29,6 +29,7 @@
 #include "ftobjs.c"
 #include "ftoutln.c"
 #include "ftpic.c"
+#include "ftpsprop.c"
 #include "ftrfork.c"
 #include "ftsnames.c"
 #include "ftstream.c"
--- /dev/null
+++ b/src/base/ftpsprop.c
@@ -1,0 +1,249 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpsprop.c                                                             */
+/*                                                                         */
+/*    Get and set properties of PostScript drivers (body).                 */
+/*    See `ftdriver.h' for available properties.                           */
+/*                                                                         */
+/*  Copyright                                                              */
+/***************************************************************************/
+
+
+
+  FT_Error
+  ps_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" ) )
+    {
+#if defined(CFF_CONFIG_OPTION_OLD_ENGINE) || defined(T1_CONFIG_OPTION_OLD_ENGINE)
+      const char*  module_name = module->clazz->module_name;
+#endif
+
+
+#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_HINTING_ADOBE;
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+        else if ( !ft_strcmp( module_name, "cff" ) &&
+                  !ft_strcmp( s, "freetype" ) )
+          driver->hinting_engine = FT_HINTING_FREETYPE;
+#endif
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+        else if ( ( !ft_strcmp( module_name, "type1" ) ||
+                    !ft_strcmp( module_name, "t1cid" ) ) &&
+                  !ft_strcmp( s, "freetype" ) )
+          driver->hinting_engine = FT_HINTING_FREETYPE;
+#endif
+        else
+          return FT_THROW( Invalid_Argument );
+      }
+      else
+#endif /* FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */
+      {
+        FT_UInt*  hinting_engine = (FT_UInt*)value;
+
+
+        if ( *hinting_engine == FT_HINTING_ADOBE
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+             || ( *hinting_engine == FT_HINTING_FREETYPE &&
+                  !ft_strcmp( module_name, "cff" ) )
+#endif
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+             || ( *hinting_engine == FT_HINTING_FREETYPE &&
+                  ( !ft_strcmp( module_name, "type1" ) ||
+                    !ft_strcmp( module_name, "t1cid" ) ) )
+#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(( "ps_property_set: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  FT_Error
+  ps_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(( "ps_property_get: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
--- a/src/base/rules.mk
+++ b/src/base/rules.mk
@@ -45,6 +45,7 @@
             $(BASE_DIR)/ftobjs.c   \
             $(BASE_DIR)/ftoutln.c  \
             $(BASE_DIR)/ftpic.c    \
+            $(BASE_DIR)/ftpsprop.c \
             $(BASE_DIR)/ftrfork.c  \
             $(BASE_DIR)/ftsnames.c \
             $(BASE_DIR)/ftstream.c \
--- a/src/cff/cffdrivr.c
+++ b/src/cff/cffdrivr.c
@@ -22,6 +22,7 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_SFNT_H
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_H
 #include FT_SERVICE_CID_H
 #include FT_SERVICE_POSTSCRIPT_INFO_H
 #include FT_SERVICE_POSTSCRIPT_NAME_H
@@ -820,231 +821,11 @@
    *  PROPERTY SERVICE
    *
    */
-  static FT_Error
-  cff_property_set( FT_Module    module,         /* CFF_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_HINTING_ADOBE;
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-        else if ( !ft_strcmp( s, "freetype" ) )
-          driver->hinting_engine = FT_HINTING_FREETYPE;
-#endif
-        else
-          return FT_THROW( Invalid_Argument );
-      }
-      else
-#endif
-      {
-        FT_UInt*  hinting_engine = (FT_UInt*)value;
-
-
-        if ( *hinting_engine == FT_HINTING_ADOBE
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-             || *hinting_engine == FT_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(( "cff_property_set: missing property `%s'\n",
-                property_name ));
-    return FT_THROW( Missing_Property );
-  }
-
-
-  static FT_Error
-  cff_property_get( FT_Module    module,         /* CFF_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(( "cff_property_get: missing property `%s'\n",
-                property_name ));
-    return FT_THROW( Missing_Property );
-  }
-
-
   FT_DEFINE_SERVICE_PROPERTIESREC(
     cff_service_properties,
 
-    (FT_Properties_SetFunc)cff_property_set,      /* set_property */
-    (FT_Properties_GetFunc)cff_property_get )     /* get_property */
+    (FT_Properties_SetFunc)ps_property_set,      /* set_property */
+    (FT_Properties_GetFunc)ps_property_get )     /* get_property */
 
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
--- a/src/cid/cidriver.c
+++ b/src/cid/cidriver.c
@@ -20,6 +20,7 @@
 #include "cidriver.h"
 #include "cidgload.h"
 #include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_H
 
 #include "ciderrs.h"
 
@@ -175,231 +176,11 @@
    *  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_HINTING_ADOBE;
-#ifdef T1_CONFIG_OPTION_OLD_ENGINE
-        else if ( !ft_strcmp( s, "freetype" ) )
-          driver->hinting_engine = FT_HINTING_FREETYPE;
-#endif
-        else
-          return FT_THROW( Invalid_Argument );
-      }
-      else
-#endif
-      {
-        FT_UInt*  hinting_engine = (FT_UInt*)value;
-
-
-        if ( *hinting_engine == FT_HINTING_ADOBE
-#ifdef T1_CONFIG_OPTION_OLD_ENGINE
-             || *hinting_engine == FT_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 */
+    (FT_Properties_SetFunc)ps_property_set,      /* set_property */
+    (FT_Properties_GetFunc)ps_property_get )     /* get_property */
 
 
   /*
--- 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_INTERNAL_POSTSCRIPT_PROPS_H
 #include FT_DRIVER_H
 
 #include FT_SERVICE_MULTIPLE_MASTERS_H
@@ -620,231 +621,11 @@
    *  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_HINTING_ADOBE;
-#ifdef T1_CONFIG_OPTION_OLD_ENGINE
-        else if ( !ft_strcmp( s, "freetype" ) )
-          driver->hinting_engine = FT_HINTING_FREETYPE;
-#endif
-        else
-          return FT_THROW( Invalid_Argument );
-      }
-      else
-#endif
-      {
-        FT_UInt*  hinting_engine = (FT_UInt*)value;
-
-
-        if ( *hinting_engine == FT_HINTING_ADOBE
-#ifdef T1_CONFIG_OPTION_OLD_ENGINE
-             || *hinting_engine == FT_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 */
+    (FT_Properties_SetFunc)ps_property_set,      /* set_property */
+    (FT_Properties_GetFunc)ps_property_get )     /* get_property */
 
 
   /*