1 | /**************************************************************************** |
2 | * |
3 | * ftpsprop.c |
4 | * |
5 | * Get and set properties of PostScript drivers (body). |
6 | * See `ftdriver.h' for available properties. |
7 | * |
8 | * Copyright (C) 2017-2019 by |
9 | * David Turner, Robert Wilhelm, and Werner Lemberg. |
10 | * |
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. |
16 | * |
17 | */ |
18 | |
19 | |
20 | #include <ft2build.h> |
21 | #include FT_DRIVER_H |
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 |
26 | |
27 | |
28 | /************************************************************************** |
29 | * |
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. |
33 | */ |
34 | #undef FT_COMPONENT |
35 | #define FT_COMPONENT psprops |
36 | |
37 | |
38 | FT_BASE_CALLBACK_DEF( FT_Error ) |
39 | ps_property_set( FT_Module module, /* PS_Driver */ |
40 | const char* property_name, |
41 | const void* value, |
42 | FT_Bool value_is_string ) |
43 | { |
44 | FT_Error error = FT_Err_Ok; |
45 | PS_Driver driver = (PS_Driver)module; |
46 | |
47 | #ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES |
48 | FT_UNUSED( value_is_string ); |
49 | #endif |
50 | |
51 | |
52 | if ( !ft_strcmp( property_name, "darkening-parameters" ) ) |
53 | { |
54 | FT_Int* darken_params; |
55 | FT_Int x1, y1, x2, y2, x3, y3, x4, y4; |
56 | |
57 | #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES |
58 | FT_Int dp[8]; |
59 | |
60 | |
61 | if ( value_is_string ) |
62 | { |
63 | const char* s = (const char*)value; |
64 | char* ep; |
65 | int i; |
66 | |
67 | |
68 | /* eight comma-separated numbers */ |
69 | for ( i = 0; i < 7; i++ ) |
70 | { |
71 | dp[i] = (FT_Int)ft_strtol( s, &ep, 10 ); |
72 | if ( *ep != ',' || s == ep ) |
73 | return FT_THROW( Invalid_Argument ); |
74 | |
75 | s = ep + 1; |
76 | } |
77 | |
78 | dp[7] = (FT_Int)ft_strtol( s, &ep, 10 ); |
79 | if ( !( *ep == '\0' || *ep == ' ' ) || s == ep ) |
80 | return FT_THROW( Invalid_Argument ); |
81 | |
82 | darken_params = dp; |
83 | } |
84 | else |
85 | #endif |
86 | darken_params = (FT_Int*)value; |
87 | |
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]; |
96 | |
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 ); |
102 | |
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; |
111 | |
112 | return error; |
113 | } |
114 | |
115 | else if ( !ft_strcmp( property_name, "hinting-engine" ) ) |
116 | { |
117 | #if defined( CFF_CONFIG_OPTION_OLD_ENGINE ) || \ |
118 | defined( T1_CONFIG_OPTION_OLD_ENGINE ) |
119 | const char* module_name = module->clazz->module_name; |
120 | #endif |
121 | |
122 | |
123 | #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES |
124 | if ( value_is_string ) |
125 | { |
126 | const char* s = (const char*)value; |
127 | |
128 | |
129 | if ( !ft_strcmp( s, "adobe" ) ) |
130 | driver->hinting_engine = FT_HINTING_ADOBE; |
131 | |
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; |
136 | #endif |
137 | |
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; |
143 | #endif |
144 | |
145 | else |
146 | return FT_THROW( Invalid_Argument ); |
147 | } |
148 | else |
149 | #endif /* FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */ |
150 | { |
151 | FT_UInt* hinting_engine = (FT_UInt*)value; |
152 | |
153 | |
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" ) ) |
158 | #endif |
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" ) ) ) |
163 | #endif |
164 | ) |
165 | driver->hinting_engine = *hinting_engine; |
166 | else |
167 | error = FT_ERR( Unimplemented_Feature ); |
168 | |
169 | return error; |
170 | } |
171 | } |
172 | |
173 | else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) |
174 | { |
175 | #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES |
176 | if ( value_is_string ) |
177 | { |
178 | const char* s = (const char*)value; |
179 | long nsd = ft_strtol( s, NULL, 10 ); |
180 | |
181 | |
182 | if ( !nsd ) |
183 | driver->no_stem_darkening = FALSE; |
184 | else |
185 | driver->no_stem_darkening = TRUE; |
186 | } |
187 | else |
188 | #endif |
189 | { |
190 | FT_Bool* no_stem_darkening = (FT_Bool*)value; |
191 | |
192 | |
193 | driver->no_stem_darkening = *no_stem_darkening; |
194 | } |
195 | |
196 | return error; |
197 | } |
198 | |
199 | else if ( !ft_strcmp( property_name, "random-seed" ) ) |
200 | { |
201 | FT_Int32 random_seed; |
202 | |
203 | |
204 | #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES |
205 | if ( value_is_string ) |
206 | { |
207 | const char* s = (const char*)value; |
208 | |
209 | |
210 | random_seed = (FT_Int32)ft_strtol( s, NULL, 10 ); |
211 | } |
212 | else |
213 | #endif |
214 | random_seed = *(FT_Int32*)value; |
215 | |
216 | if ( random_seed < 0 ) |
217 | random_seed = 0; |
218 | |
219 | driver->random_seed = random_seed; |
220 | |
221 | return error; |
222 | } |
223 | |
224 | FT_TRACE0(( "ps_property_set: missing property `%s'\n" , |
225 | property_name )); |
226 | return FT_THROW( Missing_Property ); |
227 | } |
228 | |
229 | |
230 | FT_BASE_CALLBACK_DEF( FT_Error ) |
231 | ps_property_get( FT_Module module, /* PS_Driver */ |
232 | const char* property_name, |
233 | void* value ) |
234 | { |
235 | FT_Error error = FT_Err_Ok; |
236 | PS_Driver driver = (PS_Driver)module; |
237 | |
238 | |
239 | if ( !ft_strcmp( property_name, "darkening-parameters" ) ) |
240 | { |
241 | FT_Int* darken_params = driver->darken_params; |
242 | FT_Int* val = (FT_Int*)value; |
243 | |
244 | |
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]; |
253 | |
254 | return error; |
255 | } |
256 | |
257 | else if ( !ft_strcmp( property_name, "hinting-engine" ) ) |
258 | { |
259 | FT_UInt hinting_engine = driver->hinting_engine; |
260 | FT_UInt* val = (FT_UInt*)value; |
261 | |
262 | |
263 | *val = hinting_engine; |
264 | |
265 | return error; |
266 | } |
267 | |
268 | else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) |
269 | { |
270 | FT_Bool no_stem_darkening = driver->no_stem_darkening; |
271 | FT_Bool* val = (FT_Bool*)value; |
272 | |
273 | |
274 | *val = no_stem_darkening; |
275 | |
276 | return error; |
277 | } |
278 | |
279 | FT_TRACE0(( "ps_property_get: missing property `%s'\n" , |
280 | property_name )); |
281 | return FT_THROW( Missing_Property ); |
282 | } |
283 | |
284 | |
285 | /* END */ |
286 | |