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.
This commit is contained in:
Ewald Hew 2017-12-25 12:34:37 +08:00
parent 08cd62deed
commit a956e36c8d
9 changed files with 301 additions and 666 deletions

View File

@ -0,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 */

View File

@ -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>

View File

@ -26,6 +26,7 @@ SubDir FT2_TOP $(FT2_SRC_DIR) base ;
ftobjs
ftoutln
ftpic
ftpsprop
ftrfork
ftsnames
ftstream

View File

@ -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"

249
src/base/ftpsprop.c Normal file
View File

@ -0,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 );
}

View File

@ -45,6 +45,7 @@ BASE_SRC := $(BASE_DIR)/basepic.c \
$(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 \

View File

@ -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

View File

@ -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 */
/*

View File

@ -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 */
/*