"Fossies" - the Fresh Open Source Software Archive 
Member "SDL2_ttf-2.20.2/external/freetype/src/autofit/aftypes.h" (25 May 2022, 18638 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 "aftypes.h" see the
Fossies "Dox" file reference documentation.
1 /****************************************************************************
2 *
3 * aftypes.h
4 *
5 * Auto-fitter types (specification only).
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 /*************************************************************************
20 *
21 * The auto-fitter is a complete rewrite of the old auto-hinter.
22 * Its main feature is the ability to differentiate between different
23 * writing systems and scripts in order to apply specific rules.
24 *
25 * The code has also been compartmentalized into several entities that
26 * should make algorithmic experimentation easier than with the old
27 * code.
28 *
29 *************************************************************************/
30
31
32 #ifndef AFTYPES_H_
33 #define AFTYPES_H_
34
35
36 #include <freetype/freetype.h>
37 #include <freetype/ftoutln.h>
38 #include <freetype/internal/ftobjs.h>
39 #include <freetype/internal/ftdebug.h>
40
41 #include "afblue.h"
42
43 #ifdef FT_DEBUG_AUTOFIT
44 #include FT_CONFIG_STANDARD_LIBRARY_H
45 #endif
46
47
48 FT_BEGIN_HEADER
49
50 /*************************************************************************/
51 /*************************************************************************/
52 /***** *****/
53 /***** D E B U G G I N G *****/
54 /***** *****/
55 /*************************************************************************/
56 /*************************************************************************/
57
58 #ifdef FT_DEBUG_AUTOFIT
59
60 extern int _af_debug_disable_horz_hints;
61 extern int _af_debug_disable_vert_hints;
62 extern int _af_debug_disable_blue_hints;
63 extern void* _af_debug_hints;
64
65 #endif /* FT_DEBUG_AUTOFIT */
66
67
68 /*************************************************************************/
69 /*************************************************************************/
70 /***** *****/
71 /***** U T I L I T Y S T U F F *****/
72 /***** *****/
73 /*************************************************************************/
74 /*************************************************************************/
75
76 typedef struct AF_WidthRec_
77 {
78 FT_Pos org; /* original position/width in font units */
79 FT_Pos cur; /* current/scaled position/width in device subpixels */
80 FT_Pos fit; /* current/fitted position/width in device subpixels */
81
82 } AF_WidthRec, *AF_Width;
83
84
85 FT_LOCAL( void )
86 af_sort_pos( FT_UInt count,
87 FT_Pos* table );
88
89 FT_LOCAL( void )
90 af_sort_and_quantize_widths( FT_UInt* count,
91 AF_Width widths,
92 FT_Pos threshold );
93
94
95 /*
96 * opaque handle to glyph-specific hints -- see `afhints.h' for more
97 * details
98 */
99 typedef struct AF_GlyphHintsRec_* AF_GlyphHints;
100
101
102 /*************************************************************************/
103 /*************************************************************************/
104 /***** *****/
105 /***** S C A L E R S *****/
106 /***** *****/
107 /*************************************************************************/
108 /*************************************************************************/
109
110 /*
111 * A scaler models the target pixel device that will receive the
112 * auto-hinted glyph image.
113 */
114
115 #define AF_SCALER_FLAG_NO_HORIZONTAL 1U /* disable horizontal hinting */
116 #define AF_SCALER_FLAG_NO_VERTICAL 2U /* disable vertical hinting */
117 #define AF_SCALER_FLAG_NO_ADVANCE 4U /* disable advance hinting */
118
119
120 typedef struct AF_ScalerRec_
121 {
122 FT_Face face; /* source font face */
123 FT_Fixed x_scale; /* from font units to 1/64th device pixels */
124 FT_Fixed y_scale; /* from font units to 1/64th device pixels */
125 FT_Pos x_delta; /* in 1/64th device pixels */
126 FT_Pos y_delta; /* in 1/64th device pixels */
127 FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */
128 FT_UInt32 flags; /* additional control flags, see above */
129
130 } AF_ScalerRec, *AF_Scaler;
131
132
133 #define AF_SCALER_EQUAL_SCALES( a, b ) \
134 ( (a)->x_scale == (b)->x_scale && \
135 (a)->y_scale == (b)->y_scale && \
136 (a)->x_delta == (b)->x_delta && \
137 (a)->y_delta == (b)->y_delta )
138
139
140 typedef struct AF_StyleMetricsRec_* AF_StyleMetrics;
141
142 /*
143 * This function parses an FT_Face to compute global metrics for
144 * a specific style.
145 */
146 typedef FT_Error
147 (*AF_WritingSystem_InitMetricsFunc)( AF_StyleMetrics metrics,
148 FT_Face face );
149
150 typedef void
151 (*AF_WritingSystem_ScaleMetricsFunc)( AF_StyleMetrics metrics,
152 AF_Scaler scaler );
153
154 typedef void
155 (*AF_WritingSystem_DoneMetricsFunc)( AF_StyleMetrics metrics );
156
157 typedef void
158 (*AF_WritingSystem_GetStdWidthsFunc)( AF_StyleMetrics metrics,
159 FT_Pos* stdHW,
160 FT_Pos* stdVW );
161
162
163 typedef FT_Error
164 (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints hints,
165 AF_StyleMetrics metrics );
166
167 typedef FT_Error
168 (*AF_WritingSystem_ApplyHintsFunc)( FT_UInt glyph_index,
169 AF_GlyphHints hints,
170 FT_Outline* outline,
171 AF_StyleMetrics metrics );
172
173
174 /*************************************************************************/
175 /*************************************************************************/
176 /***** *****/
177 /***** W R I T I N G S Y S T E M S *****/
178 /***** *****/
179 /*************************************************************************/
180 /*************************************************************************/
181
182 /*
183 * For the auto-hinter, a writing system consists of multiple scripts that
184 * can be handled similarly *in a typographical way*; the relationship is
185 * not based on history. For example, both the Greek and the unrelated
186 * Armenian scripts share the same features like ascender, descender,
187 * x-height, etc. Essentially, a writing system is covered by a
188 * submodule of the auto-fitter; it contains
189 *
190 * - a specific global analyzer that computes global metrics specific to
191 * the script (based on script-specific characters to identify ascender
192 * height, x-height, etc.),
193 *
194 * - a specific glyph analyzer that computes segments and edges for each
195 * glyph covered by the script,
196 *
197 * - a specific grid-fitting algorithm that distorts the scaled glyph
198 * outline according to the results of the glyph analyzer.
199 */
200
201 #undef WRITING_SYSTEM
202 #define WRITING_SYSTEM( ws, WS ) \
203 AF_WRITING_SYSTEM_ ## WS,
204
205 /* The list of known writing systems. */
206 typedef enum AF_WritingSystem_
207 {
208
209 #include "afws-iter.h"
210
211 AF_WRITING_SYSTEM_MAX /* do not remove */
212
213 } AF_WritingSystem;
214
215
216 typedef struct AF_WritingSystemClassRec_
217 {
218 AF_WritingSystem writing_system;
219
220 FT_Offset style_metrics_size;
221 AF_WritingSystem_InitMetricsFunc style_metrics_init;
222 AF_WritingSystem_ScaleMetricsFunc style_metrics_scale;
223 AF_WritingSystem_DoneMetricsFunc style_metrics_done;
224 AF_WritingSystem_GetStdWidthsFunc style_metrics_getstdw;
225
226 AF_WritingSystem_InitHintsFunc style_hints_init;
227 AF_WritingSystem_ApplyHintsFunc style_hints_apply;
228
229 } AF_WritingSystemClassRec;
230
231 typedef const AF_WritingSystemClassRec* AF_WritingSystemClass;
232
233
234 /*************************************************************************/
235 /*************************************************************************/
236 /***** *****/
237 /***** S C R I P T S *****/
238 /***** *****/
239 /*************************************************************************/
240 /*************************************************************************/
241
242 /*
243 * Each script is associated with two sets of Unicode ranges to test
244 * whether the font face supports the script, and which non-base
245 * characters the script contains.
246 *
247 * We use four-letter script tags from the OpenType specification,
248 * extended by `NONE', which indicates `no script'.
249 */
250
251 #undef SCRIPT
252 #define SCRIPT( s, S, d, h, H, ss ) \
253 AF_SCRIPT_ ## S,
254
255 /* The list of known scripts. */
256 typedef enum AF_Script_
257 {
258
259 #include "afscript.h"
260
261 AF_SCRIPT_MAX /* do not remove */
262
263 } AF_Script;
264
265
266 typedef struct AF_Script_UniRangeRec_
267 {
268 FT_UInt32 first;
269 FT_UInt32 last;
270
271 } AF_Script_UniRangeRec;
272
273 #define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
274
275 typedef const AF_Script_UniRangeRec* AF_Script_UniRange;
276
277
278 typedef struct AF_ScriptClassRec_
279 {
280 AF_Script script;
281
282 /* last element in the ranges must be { 0, 0 } */
283 AF_Script_UniRange script_uni_ranges;
284 AF_Script_UniRange script_uni_nonbase_ranges;
285
286 FT_Bool top_to_bottom_hinting;
287
288 const char* standard_charstring; /* for default width and height */
289
290 } AF_ScriptClassRec;
291
292 typedef const AF_ScriptClassRec* AF_ScriptClass;
293
294
295 /*************************************************************************/
296 /*************************************************************************/
297 /***** *****/
298 /***** C O V E R A G E S *****/
299 /***** *****/
300 /*************************************************************************/
301 /*************************************************************************/
302
303 /*
304 * Usually, a font contains more glyphs than can be addressed by its
305 * character map.
306 *
307 * In the PostScript font world, encoding vectors specific to a given
308 * task are used to select such glyphs, and these glyphs can be often
309 * recognized by having a suffix in its glyph names. For example, a
310 * superscript glyph `A' might be called `A.sup'. Unfortunately, this
311 * naming scheme is not standardized and thus unusable for us.
312 *
313 * In the OpenType world, a better solution was invented, namely
314 * `features', which cleanly separate a character's input encoding from
315 * the corresponding glyph's appearance, and which don't use glyph names
316 * at all. For our purposes, and slightly generalized, an OpenType
317 * feature is a name of a mapping that maps character codes to
318 * non-standard glyph indices (features get used for other things also).
319 * For example, the `sups' feature provides superscript glyphs, thus
320 * mapping character codes like `A' or `B' to superscript glyph
321 * representation forms. How this mapping happens is completely
322 * uninteresting to us.
323 *
324 * For the auto-hinter, a `coverage' represents all glyphs of an OpenType
325 * feature collected in a set (as listed below) that can be hinted
326 * together. To continue the above example, superscript glyphs must not
327 * be hinted together with normal glyphs because the blue zones
328 * completely differ.
329 *
330 * Note that FreeType itself doesn't compute coverages; it only provides
331 * the glyphs addressable by the default Unicode character map. Instead,
332 * we use the HarfBuzz library (if available), which has many functions
333 * exactly for this purpose.
334 *
335 * AF_COVERAGE_DEFAULT is special: It should cover everything that isn't
336 * listed separately (including the glyphs addressable by the character
337 * map). In case HarfBuzz isn't available, it exactly covers the glyphs
338 * addressable by the character map.
339 *
340 */
341
342 #undef COVERAGE
343 #define COVERAGE( name, NAME, description, \
344 tag1, tag2, tag3, tag4 ) \
345 AF_COVERAGE_ ## NAME,
346
347
348 typedef enum AF_Coverage_
349 {
350 #include "afcover.h"
351
352 AF_COVERAGE_DEFAULT
353
354 } AF_Coverage;
355
356
357 /*************************************************************************/
358 /*************************************************************************/
359 /***** *****/
360 /***** S T Y L E S *****/
361 /***** *****/
362 /*************************************************************************/
363 /*************************************************************************/
364
365 /*
366 * The topmost structure for modelling the auto-hinter glyph input data
367 * is a `style class', grouping everything together.
368 */
369
370 #undef STYLE
371 #define STYLE( s, S, d, ws, sc, ss, c ) \
372 AF_STYLE_ ## S,
373
374 /* The list of known styles. */
375 typedef enum AF_Style_
376 {
377
378 #include "afstyles.h"
379
380 AF_STYLE_MAX /* do not remove */
381
382 } AF_Style;
383
384
385 typedef struct AF_StyleClassRec_
386 {
387 AF_Style style;
388
389 AF_WritingSystem writing_system;
390 AF_Script script;
391 AF_Blue_Stringset blue_stringset;
392 AF_Coverage coverage;
393
394 } AF_StyleClassRec;
395
396 typedef const AF_StyleClassRec* AF_StyleClass;
397
398
399 /*************************************************************************/
400 /*************************************************************************/
401 /***** *****/
402 /***** S T Y L E M E T R I C S *****/
403 /***** *****/
404 /*************************************************************************/
405 /*************************************************************************/
406
407 typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals;
408
409 /* This is the main structure that combines everything. Autofit modules */
410 /* specific to writing systems derive their structures from it, for */
411 /* example `AF_LatinMetrics'. */
412
413 typedef struct AF_StyleMetricsRec_
414 {
415 AF_StyleClass style_class;
416 AF_ScalerRec scaler;
417 FT_Bool digits_have_same_width;
418
419 AF_FaceGlobals globals; /* to access properties */
420
421 } AF_StyleMetricsRec;
422
423
424 #define AF_HINTING_BOTTOM_TO_TOP 0
425 #define AF_HINTING_TOP_TO_BOTTOM 1
426
427
428 /* Declare and define vtables for classes */
429 #define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \
430 FT_CALLBACK_TABLE const AF_WritingSystemClassRec \
431 writing_system_class;
432
433 #define AF_DEFINE_WRITING_SYSTEM_CLASS( \
434 writing_system_class, \
435 system, \
436 m_size, \
437 m_init, \
438 m_scale, \
439 m_done, \
440 m_stdw, \
441 h_init, \
442 h_apply ) \
443 FT_CALLBACK_TABLE_DEF \
444 const AF_WritingSystemClassRec writing_system_class = \
445 { \
446 system, \
447 \
448 m_size, \
449 \
450 m_init, \
451 m_scale, \
452 m_done, \
453 m_stdw, \
454 \
455 h_init, \
456 h_apply \
457 };
458
459
460 #define AF_DECLARE_SCRIPT_CLASS( script_class ) \
461 FT_CALLBACK_TABLE const AF_ScriptClassRec \
462 script_class;
463
464 #define AF_DEFINE_SCRIPT_CLASS( \
465 script_class, \
466 script, \
467 ranges, \
468 nonbase_ranges, \
469 top_to_bottom, \
470 std_charstring ) \
471 FT_CALLBACK_TABLE_DEF \
472 const AF_ScriptClassRec script_class = \
473 { \
474 script, \
475 ranges, \
476 nonbase_ranges, \
477 top_to_bottom, \
478 std_charstring, \
479 };
480
481
482 #define AF_DECLARE_STYLE_CLASS( style_class ) \
483 FT_CALLBACK_TABLE const AF_StyleClassRec \
484 style_class;
485
486 #define AF_DEFINE_STYLE_CLASS( \
487 style_class, \
488 style, \
489 writing_system, \
490 script, \
491 blue_stringset, \
492 coverage ) \
493 FT_CALLBACK_TABLE_DEF \
494 const AF_StyleClassRec style_class = \
495 { \
496 style, \
497 writing_system, \
498 script, \
499 blue_stringset, \
500 coverage \
501 };
502
503 /* */
504
505
506 FT_END_HEADER
507
508 #endif /* AFTYPES_H_ */
509
510
511 /* END */