"Fossies" - the Fresh Open Source Software Archive 
Member "SDL2_ttf-2.20.2/external/freetype/src/autofit/afmodule.c" (25 May 2022, 14033 Bytes) of package /linux/misc/SDL2_ttf-2.20.2.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "afmodule.c" see the
Fossies "Dox" file reference documentation.
1 /****************************************************************************
2 *
3 * afmodule.c
4 *
5 * Auto-fitter module implementation (body).
6 *
7 * Copyright (C) 2003-2022 by
8 * David Turner, Robert Wilhelm, and Werner Lemberg.
9 *
10 * This file is part of the FreeType project, and may only be used,
11 * modified, and distributed under the terms of the FreeType project
12 * license, LICENSE.TXT. By continuing to use, modify, or distribute
13 * this file you indicate that you have read the license and
14 * understand and accept it fully.
15 *
16 */
17
18
19 #include "afglobal.h"
20 #include "afmodule.h"
21 #include "afloader.h"
22 #include "aferrors.h"
23
24 #ifdef FT_DEBUG_AUTOFIT
25
26 #ifndef FT_MAKE_OPTION_SINGLE_OBJECT
27
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 extern void
32 af_glyph_hints_dump_segments( AF_GlyphHints hints,
33 FT_Bool to_stdout );
34 extern void
35 af_glyph_hints_dump_points( AF_GlyphHints hints,
36 FT_Bool to_stdout );
37 extern void
38 af_glyph_hints_dump_edges( AF_GlyphHints hints,
39 FT_Bool to_stdout );
40 #ifdef __cplusplus
41 }
42 #endif
43
44 #endif
45
46 int _af_debug_disable_horz_hints;
47 int _af_debug_disable_vert_hints;
48 int _af_debug_disable_blue_hints;
49
50 /* we use a global object instead of a local one for debugging */
51 static AF_GlyphHintsRec _af_debug_hints_rec[1];
52
53 void* _af_debug_hints = _af_debug_hints_rec;
54 #endif
55
56 #include <freetype/internal/ftobjs.h>
57 #include <freetype/internal/ftdebug.h>
58 #include <freetype/ftdriver.h>
59 #include <freetype/internal/services/svprop.h>
60
61
62 /**************************************************************************
63 *
64 * The macro FT_COMPONENT is used in trace mode. It is an implicit
65 * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log
66 * messages during execution.
67 */
68 #undef FT_COMPONENT
69 #define FT_COMPONENT afmodule
70
71
72 static FT_Error
73 af_property_get_face_globals( FT_Face face,
74 AF_FaceGlobals* aglobals,
75 AF_Module module )
76 {
77 FT_Error error = FT_Err_Ok;
78 AF_FaceGlobals globals;
79
80
81 if ( !face )
82 return FT_THROW( Invalid_Face_Handle );
83
84 globals = (AF_FaceGlobals)face->autohint.data;
85 if ( !globals )
86 {
87 /* trigger computation of the global style data */
88 /* in case it hasn't been done yet */
89 error = af_face_globals_new( face, &globals, module );
90 if ( !error )
91 {
92 face->autohint.data =
93 (FT_Pointer)globals;
94 face->autohint.finalizer =
95 (FT_Generic_Finalizer)af_face_globals_free;
96 }
97 }
98
99 if ( !error )
100 *aglobals = globals;
101
102 return error;
103 }
104
105
106 static FT_Error
107 af_property_set( FT_Module ft_module,
108 const char* property_name,
109 const void* value,
110 FT_Bool value_is_string )
111 {
112 FT_Error error = FT_Err_Ok;
113 AF_Module module = (AF_Module)ft_module;
114
115 #ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
116 FT_UNUSED( value_is_string );
117 #endif
118
119
120 if ( !ft_strcmp( property_name, "fallback-script" ) )
121 {
122 FT_UInt* fallback_script;
123 FT_UInt ss;
124
125
126 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
127 if ( value_is_string )
128 return FT_THROW( Invalid_Argument );
129 #endif
130
131 fallback_script = (FT_UInt*)value;
132
133 /* We translate the fallback script to a fallback style that uses */
134 /* `fallback-script' as its script and `AF_COVERAGE_NONE' as its */
135 /* coverage value. */
136 for ( ss = 0; af_style_classes[ss]; ss++ )
137 {
138 AF_StyleClass style_class = af_style_classes[ss];
139
140
141 if ( (FT_UInt)style_class->script == *fallback_script &&
142 style_class->coverage == AF_COVERAGE_DEFAULT )
143 {
144 module->fallback_style = ss;
145 break;
146 }
147 }
148
149 if ( !af_style_classes[ss] )
150 {
151 FT_TRACE2(( "af_property_set: Invalid value %d for property `%s'\n",
152 *fallback_script, property_name ));
153 return FT_THROW( Invalid_Argument );
154 }
155
156 return error;
157 }
158 else if ( !ft_strcmp( property_name, "default-script" ) )
159 {
160 FT_UInt* default_script;
161
162
163 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
164 if ( value_is_string )
165 return FT_THROW( Invalid_Argument );
166 #endif
167
168 default_script = (FT_UInt*)value;
169
170 module->default_script = *default_script;
171
172 return error;
173 }
174 else if ( !ft_strcmp( property_name, "increase-x-height" ) )
175 {
176 FT_Prop_IncreaseXHeight* prop;
177 AF_FaceGlobals globals;
178
179
180 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
181 if ( value_is_string )
182 return FT_THROW( Invalid_Argument );
183 #endif
184
185 prop = (FT_Prop_IncreaseXHeight*)value;
186
187 error = af_property_get_face_globals( prop->face, &globals, module );
188 if ( !error )
189 globals->increase_x_height = prop->limit;
190
191 return error;
192 }
193 else if ( !ft_strcmp( property_name, "darkening-parameters" ) )
194 {
195 FT_Int* darken_params;
196 FT_Int x1, y1, x2, y2, x3, y3, x4, y4;
197
198 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
199 FT_Int dp[8];
200
201
202 if ( value_is_string )
203 {
204 const char* s = (const char*)value;
205 char* ep;
206 int i;
207
208
209 /* eight comma-separated numbers */
210 for ( i = 0; i < 7; i++ )
211 {
212 dp[i] = (FT_Int)ft_strtol( s, &ep, 10 );
213 if ( *ep != ',' || s == ep )
214 return FT_THROW( Invalid_Argument );
215
216 s = ep + 1;
217 }
218
219 dp[7] = (FT_Int)ft_strtol( s, &ep, 10 );
220 if ( !( *ep == '\0' || *ep == ' ' ) || s == ep )
221 return FT_THROW( Invalid_Argument );
222
223 darken_params = dp;
224 }
225 else
226 #endif
227 darken_params = (FT_Int*)value;
228
229 x1 = darken_params[0];
230 y1 = darken_params[1];
231 x2 = darken_params[2];
232 y2 = darken_params[3];
233 x3 = darken_params[4];
234 y3 = darken_params[5];
235 x4 = darken_params[6];
236 y4 = darken_params[7];
237
238 if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 ||
239 y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 ||
240 x1 > x2 || x2 > x3 || x3 > x4 ||
241 y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
242 return FT_THROW( Invalid_Argument );
243
244 module->darken_params[0] = x1;
245 module->darken_params[1] = y1;
246 module->darken_params[2] = x2;
247 module->darken_params[3] = y2;
248 module->darken_params[4] = x3;
249 module->darken_params[5] = y3;
250 module->darken_params[6] = x4;
251 module->darken_params[7] = y4;
252
253 return error;
254 }
255 else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
256 {
257 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
258 if ( value_is_string )
259 {
260 const char* s = (const char*)value;
261 long nsd = ft_strtol( s, NULL, 10 );
262
263
264 if ( !nsd )
265 module->no_stem_darkening = FALSE;
266 else
267 module->no_stem_darkening = TRUE;
268 }
269 else
270 #endif
271 {
272 FT_Bool* no_stem_darkening = (FT_Bool*)value;
273
274
275 module->no_stem_darkening = *no_stem_darkening;
276 }
277
278 return error;
279 }
280
281 FT_TRACE2(( "af_property_set: missing property `%s'\n",
282 property_name ));
283 return FT_THROW( Missing_Property );
284 }
285
286
287 static FT_Error
288 af_property_get( FT_Module ft_module,
289 const char* property_name,
290 void* value )
291 {
292 FT_Error error = FT_Err_Ok;
293 AF_Module module = (AF_Module)ft_module;
294 FT_UInt fallback_style = module->fallback_style;
295 FT_UInt default_script = module->default_script;
296
297
298 if ( !ft_strcmp( property_name, "glyph-to-script-map" ) )
299 {
300 FT_Prop_GlyphToScriptMap* prop = (FT_Prop_GlyphToScriptMap*)value;
301 AF_FaceGlobals globals;
302
303
304 error = af_property_get_face_globals( prop->face, &globals, module );
305 if ( !error )
306 prop->map = globals->glyph_styles;
307
308 return error;
309 }
310 else if ( !ft_strcmp( property_name, "fallback-script" ) )
311 {
312 FT_UInt* val = (FT_UInt*)value;
313
314 AF_StyleClass style_class = af_style_classes[fallback_style];
315
316
317 *val = style_class->script;
318
319 return error;
320 }
321 else if ( !ft_strcmp( property_name, "default-script" ) )
322 {
323 FT_UInt* val = (FT_UInt*)value;
324
325
326 *val = default_script;
327
328 return error;
329 }
330 else if ( !ft_strcmp( property_name, "increase-x-height" ) )
331 {
332 FT_Prop_IncreaseXHeight* prop = (FT_Prop_IncreaseXHeight*)value;
333 AF_FaceGlobals globals;
334
335
336 error = af_property_get_face_globals( prop->face, &globals, module );
337 if ( !error )
338 prop->limit = globals->increase_x_height;
339
340 return error;
341 }
342 else if ( !ft_strcmp( property_name, "darkening-parameters" ) )
343 {
344 FT_Int* darken_params = module->darken_params;
345 FT_Int* val = (FT_Int*)value;
346
347
348 val[0] = darken_params[0];
349 val[1] = darken_params[1];
350 val[2] = darken_params[2];
351 val[3] = darken_params[3];
352 val[4] = darken_params[4];
353 val[5] = darken_params[5];
354 val[6] = darken_params[6];
355 val[7] = darken_params[7];
356
357 return error;
358 }
359 else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
360 {
361 FT_Bool no_stem_darkening = module->no_stem_darkening;
362 FT_Bool* val = (FT_Bool*)value;
363
364
365 *val = no_stem_darkening;
366
367 return error;
368 }
369
370 FT_TRACE2(( "af_property_get: missing property `%s'\n",
371 property_name ));
372 return FT_THROW( Missing_Property );
373 }
374
375
376 FT_DEFINE_SERVICE_PROPERTIESREC(
377 af_service_properties,
378
379 (FT_Properties_SetFunc)af_property_set, /* set_property */
380 (FT_Properties_GetFunc)af_property_get ) /* get_property */
381
382
383 FT_DEFINE_SERVICEDESCREC1(
384 af_services,
385
386 FT_SERVICE_ID_PROPERTIES, &af_service_properties )
387
388
389 FT_CALLBACK_DEF( FT_Module_Interface )
390 af_get_interface( FT_Module module,
391 const char* module_interface )
392 {
393 FT_UNUSED( module );
394
395 return ft_service_list_lookup( af_services, module_interface );
396 }
397
398
399 FT_CALLBACK_DEF( FT_Error )
400 af_autofitter_init( FT_Module ft_module ) /* AF_Module */
401 {
402 AF_Module module = (AF_Module)ft_module;
403
404
405 module->fallback_style = AF_STYLE_FALLBACK;
406 module->default_script = AF_SCRIPT_DEFAULT;
407 module->no_stem_darkening = TRUE;
408
409 module->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1;
410 module->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1;
411 module->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2;
412 module->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2;
413 module->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3;
414 module->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3;
415 module->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
416 module->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
417
418 return FT_Err_Ok;
419 }
420
421
422 FT_CALLBACK_DEF( void )
423 af_autofitter_done( FT_Module ft_module ) /* AF_Module */
424 {
425 FT_UNUSED( ft_module );
426
427 #ifdef FT_DEBUG_AUTOFIT
428 if ( _af_debug_hints_rec->memory )
429 af_glyph_hints_done( _af_debug_hints_rec );
430 #endif
431 }
432
433
434 FT_CALLBACK_DEF( FT_Error )
435 af_autofitter_load_glyph( AF_Module module,
436 FT_GlyphSlot slot,
437 FT_Size size,
438 FT_UInt glyph_index,
439 FT_Int32 load_flags )
440 {
441 FT_Error error = FT_Err_Ok;
442 FT_Memory memory = module->root.library->memory;
443
444 #ifdef FT_DEBUG_AUTOFIT
445
446 /* in debug mode, we use a global object that survives this routine */
447
448 AF_GlyphHints hints = _af_debug_hints_rec;
449 AF_LoaderRec loader[1];
450
451 FT_UNUSED( size );
452
453
454 if ( hints->memory )
455 af_glyph_hints_done( hints );
456
457 af_glyph_hints_init( hints, memory );
458 af_loader_init( loader, hints );
459
460 error = af_loader_load_glyph( loader, module, slot->face,
461 glyph_index, load_flags );
462
463 #ifdef FT_DEBUG_LEVEL_TRACE
464 if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] )
465 {
466 #endif
467 af_glyph_hints_dump_points( hints, 0 );
468 af_glyph_hints_dump_segments( hints, 0 );
469 af_glyph_hints_dump_edges( hints, 0 );
470 #ifdef FT_DEBUG_LEVEL_TRACE
471 }
472 #endif
473
474 af_loader_done( loader );
475
476 return error;
477
478 #else /* !FT_DEBUG_AUTOFIT */
479
480 AF_GlyphHintsRec hints[1];
481 AF_LoaderRec loader[1];
482
483 FT_UNUSED( size );
484
485
486 af_glyph_hints_init( hints, memory );
487 af_loader_init( loader, hints );
488
489 error = af_loader_load_glyph( loader, module, slot->face,
490 glyph_index, load_flags );
491
492 af_loader_done( loader );
493 af_glyph_hints_done( hints );
494
495 return error;
496
497 #endif /* !FT_DEBUG_AUTOFIT */
498 }
499
500
501 FT_DEFINE_AUTOHINTER_INTERFACE(
502 af_autofitter_interface,
503
504 NULL, /* reset_face */
505 NULL, /* get_global_hints */
506 NULL, /* done_global_hints */
507 (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph /* load_glyph */
508 )
509
510 FT_DEFINE_MODULE(
511 autofit_module_class,
512
513 FT_MODULE_HINTER,
514 sizeof ( AF_ModuleRec ),
515
516 "autofitter",
517 0x10000L, /* version 1.0 of the autofitter */
518 0x20000L, /* requires FreeType 2.0 or above */
519
520 (const void*)&af_autofitter_interface,
521
522 (FT_Module_Constructor)af_autofitter_init, /* module_init */
523 (FT_Module_Destructor) af_autofitter_done, /* module_done */
524 (FT_Module_Requester) af_get_interface /* get_interface */
525 )
526
527
528 /* END */