1 /***************************************************************************/
5 /* Get and set properties of PostScript drivers (body). */
6 /* See `ftdriver.h' for available properties. */
8 /* Copyright 2017-2018 by */
9 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
11 /* This file is part of the FreeType project, and may only be used, */
12 /* modified, and distributed under the terms of the FreeType project */
13 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
14 /* this file you indicate that you have read the license and */
15 /* understand and accept it fully. */
17 /***************************************************************************/
22 #include FT_INTERNAL_DEBUG_H
23 #include FT_INTERNAL_POSTSCRIPT_AUX_H
24 #include FT_INTERNAL_OBJECTS_H
25 #include FT_INTERNAL_POSTSCRIPT_PROPS_H
28 /*************************************************************************/
30 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
31 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
32 /* messages during execution. */
35 #define FT_COMPONENT trace_psprops
38 FT_BASE_CALLBACK_DEF( FT_Error
)
39 ps_property_set( FT_Module module
, /* PS_Driver */
40 const char* property_name
,
42 FT_Bool value_is_string
)
44 FT_Error error
= FT_Err_Ok
;
45 PS_Driver driver
= (PS_Driver
)module
;
47 #ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
48 FT_UNUSED( value_is_string
);
52 if ( !ft_strcmp( property_name
, "darkening-parameters" ) )
54 FT_Int
* darken_params
;
55 FT_Int x1
, y1
, x2
, y2
, x3
, y3
, x4
, y4
;
57 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
61 if ( value_is_string
)
63 const char* s
= (const char*)value
;
68 /* eight comma-separated numbers */
69 for ( i
= 0; i
< 7; i
++ )
71 dp
[i
] = (FT_Int
)ft_strtol( s
, &ep
, 10 );
72 if ( *ep
!= ',' || s
== ep
)
73 return FT_THROW( Invalid_Argument
);
78 dp
[7] = (FT_Int
)ft_strtol( s
, &ep
, 10 );
79 if ( !( *ep
== '\0' || *ep
== ' ' ) || s
== ep
)
80 return FT_THROW( Invalid_Argument
);
86 darken_params
= (FT_Int
*)value
;
88 x1
= darken_params
[0];
89 y1
= darken_params
[1];
90 x2
= darken_params
[2];
91 y2
= darken_params
[3];
92 x3
= darken_params
[4];
93 y3
= darken_params
[5];
94 x4
= darken_params
[6];
95 y4
= darken_params
[7];
97 if ( x1
< 0 || x2
< 0 || x3
< 0 || x4
< 0 ||
98 y1
< 0 || y2
< 0 || y3
< 0 || y4
< 0 ||
99 x1
> x2
|| x2
> x3
|| x3
> x4
||
100 y1
> 500 || y2
> 500 || y3
> 500 || y4
> 500 )
101 return FT_THROW( Invalid_Argument
);
103 driver
->darken_params
[0] = x1
;
104 driver
->darken_params
[1] = y1
;
105 driver
->darken_params
[2] = x2
;
106 driver
->darken_params
[3] = y2
;
107 driver
->darken_params
[4] = x3
;
108 driver
->darken_params
[5] = y3
;
109 driver
->darken_params
[6] = x4
;
110 driver
->darken_params
[7] = y4
;
115 else if ( !ft_strcmp( property_name
, "hinting-engine" ) )
117 #if defined( CFF_CONFIG_OPTION_OLD_ENGINE ) || \
118 defined( T1_CONFIG_OPTION_OLD_ENGINE )
119 const char* module_name
= module
->clazz
->module_name
;
123 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
124 if ( value_is_string
)
126 const char* s
= (const char*)value
;
129 if ( !ft_strcmp( s
, "adobe" ) )
130 driver
->hinting_engine
= FT_HINTING_ADOBE
;
132 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
133 else if ( !ft_strcmp( module_name
, "cff" ) &&
134 !ft_strcmp( s
, "freetype" ) )
135 driver
->hinting_engine
= FT_HINTING_FREETYPE
;
138 #ifdef T1_CONFIG_OPTION_OLD_ENGINE
139 else if ( ( !ft_strcmp( module_name
, "type1" ) ||
140 !ft_strcmp( module_name
, "t1cid" ) ) &&
141 !ft_strcmp( s
, "freetype" ) )
142 driver
->hinting_engine
= FT_HINTING_FREETYPE
;
146 return FT_THROW( Invalid_Argument
);
149 #endif /* FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */
151 FT_UInt
* hinting_engine
= (FT_UInt
*)value
;
154 if ( *hinting_engine
== FT_HINTING_ADOBE
155 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
156 || ( *hinting_engine
== FT_HINTING_FREETYPE
&&
157 !ft_strcmp( module_name
, "cff" ) )
159 #ifdef T1_CONFIG_OPTION_OLD_ENGINE
160 || ( *hinting_engine
== FT_HINTING_FREETYPE
&&
161 ( !ft_strcmp( module_name
, "type1" ) ||
162 !ft_strcmp( module_name
, "t1cid" ) ) )
165 driver
->hinting_engine
= *hinting_engine
;
167 error
= FT_ERR( Unimplemented_Feature
);
173 else if ( !ft_strcmp( property_name
, "no-stem-darkening" ) )
175 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
176 if ( value_is_string
)
178 const char* s
= (const char*)value
;
179 long nsd
= ft_strtol( s
, NULL
, 10 );
183 driver
->no_stem_darkening
= FALSE
;
185 driver
->no_stem_darkening
= TRUE
;
190 FT_Bool
* no_stem_darkening
= (FT_Bool
*)value
;
193 driver
->no_stem_darkening
= *no_stem_darkening
;
199 else if ( !ft_strcmp( property_name
, "random-seed" ) )
201 FT_Int32 random_seed
;
204 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
205 if ( value_is_string
)
207 const char* s
= (const char*)value
;
210 random_seed
= (FT_Int32
)ft_strtol( s
, NULL
, 10 );
214 random_seed
= *(FT_Int32
*)value
;
216 if ( random_seed
< 0 )
219 driver
->random_seed
= random_seed
;
224 FT_TRACE0(( "ps_property_set: missing property `%s'\n",
226 return FT_THROW( Missing_Property
);
230 FT_BASE_CALLBACK_DEF( FT_Error
)
231 ps_property_get( FT_Module module
, /* PS_Driver */
232 const char* property_name
,
235 FT_Error error
= FT_Err_Ok
;
236 PS_Driver driver
= (PS_Driver
)module
;
239 if ( !ft_strcmp( property_name
, "darkening-parameters" ) )
241 FT_Int
* darken_params
= driver
->darken_params
;
242 FT_Int
* val
= (FT_Int
*)value
;
245 val
[0] = darken_params
[0];
246 val
[1] = darken_params
[1];
247 val
[2] = darken_params
[2];
248 val
[3] = darken_params
[3];
249 val
[4] = darken_params
[4];
250 val
[5] = darken_params
[5];
251 val
[6] = darken_params
[6];
252 val
[7] = darken_params
[7];
257 else if ( !ft_strcmp( property_name
, "hinting-engine" ) )
259 FT_UInt hinting_engine
= driver
->hinting_engine
;
260 FT_UInt
* val
= (FT_UInt
*)value
;
263 *val
= hinting_engine
;
268 else if ( !ft_strcmp( property_name
, "no-stem-darkening" ) )
270 FT_Bool no_stem_darkening
= driver
->no_stem_darkening
;
271 FT_Bool
* val
= (FT_Bool
*)value
;
274 *val
= no_stem_darkening
;
279 FT_TRACE0(( "ps_property_get: missing property `%s'\n",
281 return FT_THROW( Missing_Property
);