[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.
This commit is contained in:
parent
dff40d03df
commit
7e23568b16
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
|||
2017-10-12 Ewald Hew <ewaldhew@gmail.com>
|
||||
|
||||
[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 <ewaldhew@gmail.com>
|
||||
|
||||
Add T1_CONFIG_OPTION_OLD_ENGINE configuration option.
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
|
@ -167,6 +169,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 }
|
||||
};
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
@ -614,6 +616,237 @@
|
|||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* 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 },
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue