ReactOS 0.4.16-dev-2358-g0df3463
aftypes.h
Go to the documentation of this file.
1/****************************************************************************
2 *
3 * aftypes.h
4 *
5 * Auto-fitter types (specification only).
6 *
7 * Copyright (C) 2003-2020 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>
40
41#include "afblue.h"
42
43#ifdef FT_DEBUG_AUTOFIT
44#include FT_CONFIG_STANDARD_LIBRARY_H
45#endif
46
47
49
50 /*************************************************************************/
51 /*************************************************************************/
52 /***** *****/
53 /***** D E B U G G I N G *****/
54 /***** *****/
55 /*************************************************************************/
56 /*************************************************************************/
57
58#ifdef FT_DEBUG_AUTOFIT
59
60extern int _af_debug_disable_horz_hints;
61extern int _af_debug_disable_vert_hints;
62extern int _af_debug_disable_blue_hints;
63extern 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
83
84
85 FT_LOCAL( void )
87 FT_Pos* table );
88
89 FT_LOCAL( void )
91 AF_Width widths,
92 FT_Pos threshold );
93
94
95 /*************************************************************************/
96 /*************************************************************************/
97 /***** *****/
98 /***** A N G L E T Y P E S *****/
99 /***** *****/
100 /*************************************************************************/
101 /*************************************************************************/
102
103 /*
104 * The auto-fitter doesn't need a very high angular accuracy;
105 * this allows us to speed up some computations considerably with a
106 * light Cordic algorithm (see afangles.c).
107 */
108
110
111
112#define AF_ANGLE_PI 256
113#define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 )
114#define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 )
115#define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 )
116
117
118#if 0
119 /*
120 * compute the angle of a given 2-D vector
121 */
123 af_angle_atan( FT_Pos dx,
124 FT_Pos dy );
125
126
127 /*
128 * compute `angle2 - angle1'; the result is always within
129 * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
130 */
132 af_angle_diff( AF_Angle angle1,
133 AF_Angle angle2 );
134#endif /* 0 */
135
136
137#define AF_ANGLE_DIFF( result, angle1, angle2 ) \
138 FT_BEGIN_STMNT \
139 AF_Angle _delta = (angle2) - (angle1); \
140 \
141 \
142 while ( _delta <= -AF_ANGLE_PI ) \
143 _delta += AF_ANGLE_2PI; \
144 \
145 while ( _delta > AF_ANGLE_PI ) \
146 _delta -= AF_ANGLE_2PI; \
147 \
148 result = _delta; \
149 FT_END_STMNT
150
151
152 /*
153 * opaque handle to glyph-specific hints -- see `afhints.h' for more
154 * details
155 */
157
158
159 /*************************************************************************/
160 /*************************************************************************/
161 /***** *****/
162 /***** S C A L E R S *****/
163 /***** *****/
164 /*************************************************************************/
165 /*************************************************************************/
166
167 /*
168 * A scaler models the target pixel device that will receive the
169 * auto-hinted glyph image.
170 */
171
172#define AF_SCALER_FLAG_NO_HORIZONTAL 1U /* disable horizontal hinting */
173#define AF_SCALER_FLAG_NO_VERTICAL 2U /* disable vertical hinting */
174#define AF_SCALER_FLAG_NO_ADVANCE 4U /* disable advance hinting */
175#define AF_SCALER_FLAG_NO_WARPER 8U /* disable warper */
176
177
178 typedef struct AF_ScalerRec_
179 {
180 FT_Face face; /* source font face */
181 FT_Fixed x_scale; /* from font units to 1/64th device pixels */
182 FT_Fixed y_scale; /* from font units to 1/64th device pixels */
183 FT_Pos x_delta; /* in 1/64th device pixels */
184 FT_Pos y_delta; /* in 1/64th device pixels */
185 FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */
186 FT_UInt32 flags; /* additional control flags, see above */
187
189
190
191#define AF_SCALER_EQUAL_SCALES( a, b ) \
192 ( (a)->x_scale == (b)->x_scale && \
193 (a)->y_scale == (b)->y_scale && \
194 (a)->x_delta == (b)->x_delta && \
195 (a)->y_delta == (b)->y_delta )
196
197
199
200 /*
201 * This function parses an FT_Face to compute global metrics for
202 * a specific style.
203 */
204 typedef FT_Error
206 FT_Face face );
207
208 typedef void
211
212 typedef void
214
215 typedef void
217 FT_Pos* stdHW,
218 FT_Pos* stdVW );
219
220
221 typedef FT_Error
224
225 typedef FT_Error
230
231
232 /*************************************************************************/
233 /*************************************************************************/
234 /***** *****/
235 /***** W R I T I N G S Y S T E M S *****/
236 /***** *****/
237 /*************************************************************************/
238 /*************************************************************************/
239
240 /*
241 * For the auto-hinter, a writing system consists of multiple scripts that
242 * can be handled similarly *in a typographical way*; the relationship is
243 * not based on history. For example, both the Greek and the unrelated
244 * Armenian scripts share the same features like ascender, descender,
245 * x-height, etc. Essentially, a writing system is covered by a
246 * submodule of the auto-fitter; it contains
247 *
248 * - a specific global analyzer that computes global metrics specific to
249 * the script (based on script-specific characters to identify ascender
250 * height, x-height, etc.),
251 *
252 * - a specific glyph analyzer that computes segments and edges for each
253 * glyph covered by the script,
254 *
255 * - a specific grid-fitting algorithm that distorts the scaled glyph
256 * outline according to the results of the glyph analyzer.
257 */
258
259#define AFWRTSYS_H_ /* don't load header files */
260#undef WRITING_SYSTEM
261#define WRITING_SYSTEM( ws, WS ) \
262 AF_WRITING_SYSTEM_ ## WS,
263
264 /* The list of known writing systems. */
265 typedef enum AF_WritingSystem_
266 {
267
268#include "afwrtsys.h"
269
270 AF_WRITING_SYSTEM_MAX /* do not remove */
271
273
274#undef AFWRTSYS_H_
275
276
278 {
280
286
289
291
293
294
295 /*************************************************************************/
296 /*************************************************************************/
297 /***** *****/
298 /***** S C R I P T S *****/
299 /***** *****/
300 /*************************************************************************/
301 /*************************************************************************/
302
303 /*
304 * Each script is associated with two sets of Unicode ranges to test
305 * whether the font face supports the script, and which non-base
306 * characters the script contains.
307 *
308 * We use four-letter script tags from the OpenType specification,
309 * extended by `NONE', which indicates `no script'.
310 */
311
312#undef SCRIPT
313#define SCRIPT( s, S, d, h, H, ss ) \
314 AF_SCRIPT_ ## S,
315
316 /* The list of known scripts. */
317 typedef enum AF_Script_
318 {
319
320#include "afscript.h"
321
322 AF_SCRIPT_MAX /* do not remove */
323
325
326
328 {
329 FT_UInt32 first;
330 FT_UInt32 last;
331
333
334#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
335
337
338
339 typedef struct AF_ScriptClassRec_
340 {
342
343 /* last element in the ranges must be { 0, 0 } */
346
348
349 const char* standard_charstring; /* for default width and height */
350
352
354
355
356 /*************************************************************************/
357 /*************************************************************************/
358 /***** *****/
359 /***** C O V E R A G E S *****/
360 /***** *****/
361 /*************************************************************************/
362 /*************************************************************************/
363
364 /*
365 * Usually, a font contains more glyphs than can be addressed by its
366 * character map.
367 *
368 * In the PostScript font world, encoding vectors specific to a given
369 * task are used to select such glyphs, and these glyphs can be often
370 * recognized by having a suffix in its glyph names. For example, a
371 * superscript glyph `A' might be called `A.sup'. Unfortunately, this
372 * naming scheme is not standardized and thus unusable for us.
373 *
374 * In the OpenType world, a better solution was invented, namely
375 * `features', which cleanly separate a character's input encoding from
376 * the corresponding glyph's appearance, and which don't use glyph names
377 * at all. For our purposes, and slightly generalized, an OpenType
378 * feature is a name of a mapping that maps character codes to
379 * non-standard glyph indices (features get used for other things also).
380 * For example, the `sups' feature provides superscript glyphs, thus
381 * mapping character codes like `A' or `B' to superscript glyph
382 * representation forms. How this mapping happens is completely
383 * uninteresting to us.
384 *
385 * For the auto-hinter, a `coverage' represents all glyphs of an OpenType
386 * feature collected in a set (as listed below) that can be hinted
387 * together. To continue the above example, superscript glyphs must not
388 * be hinted together with normal glyphs because the blue zones
389 * completely differ.
390 *
391 * Note that FreeType itself doesn't compute coverages; it only provides
392 * the glyphs addressable by the default Unicode character map. Instead,
393 * we use the HarfBuzz library (if available), which has many functions
394 * exactly for this purpose.
395 *
396 * AF_COVERAGE_DEFAULT is special: It should cover everything that isn't
397 * listed separately (including the glyphs addressable by the character
398 * map). In case HarfBuzz isn't available, it exactly covers the glyphs
399 * addressable by the character map.
400 *
401 */
402
403#undef COVERAGE
404#define COVERAGE( name, NAME, description, \
405 tag1, tag2, tag3, tag4 ) \
406 AF_COVERAGE_ ## NAME,
407
408
409 typedef enum AF_Coverage_
410 {
411#include "afcover.h"
412
414
416
417
418 /*************************************************************************/
419 /*************************************************************************/
420 /***** *****/
421 /***** S T Y L E S *****/
422 /***** *****/
423 /*************************************************************************/
424 /*************************************************************************/
425
426 /*
427 * The topmost structure for modelling the auto-hinter glyph input data
428 * is a `style class', grouping everything together.
429 */
430
431#undef STYLE
432#define STYLE( s, S, d, ws, sc, ss, c ) \
433 AF_STYLE_ ## S,
434
435 /* The list of known styles. */
436 typedef enum AF_Style_
437 {
438
439#include "afstyles.h"
440
441 AF_STYLE_MAX /* do not remove */
442
444
445
446 typedef struct AF_StyleClassRec_
447 {
449
454
456
458
459
460 /*************************************************************************/
461 /*************************************************************************/
462 /***** *****/
463 /***** S T Y L E M E T R I C S *****/
464 /***** *****/
465 /*************************************************************************/
466 /*************************************************************************/
467
469
470 /* This is the main structure that combines everything. Autofit modules */
471 /* specific to writing systems derive their structures from it, for */
472 /* example `AF_LatinMetrics'. */
473
474 typedef struct AF_StyleMetricsRec_
475 {
479
480 AF_FaceGlobals globals; /* to access properties */
481
483
484
485#define AF_HINTING_BOTTOM_TO_TOP 0
486#define AF_HINTING_TOP_TO_BOTTOM 1
487
488
489 /* Declare and define vtables for classes */
490#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \
491 FT_CALLBACK_TABLE const AF_WritingSystemClassRec \
492 writing_system_class;
493
494#define AF_DEFINE_WRITING_SYSTEM_CLASS( \
495 writing_system_class, \
496 system, \
497 m_size, \
498 m_init, \
499 m_scale, \
500 m_done, \
501 m_stdw, \
502 h_init, \
503 h_apply ) \
504 FT_CALLBACK_TABLE_DEF \
505 const AF_WritingSystemClassRec writing_system_class = \
506 { \
507 system, \
508 \
509 m_size, \
510 \
511 m_init, \
512 m_scale, \
513 m_done, \
514 m_stdw, \
515 \
516 h_init, \
517 h_apply \
518 };
519
520
521#define AF_DECLARE_SCRIPT_CLASS( script_class ) \
522 FT_CALLBACK_TABLE const AF_ScriptClassRec \
523 script_class;
524
525#define AF_DEFINE_SCRIPT_CLASS( \
526 script_class, \
527 script, \
528 ranges, \
529 nonbase_ranges, \
530 top_to_bottom, \
531 std_charstring ) \
532 FT_CALLBACK_TABLE_DEF \
533 const AF_ScriptClassRec script_class = \
534 { \
535 script, \
536 ranges, \
537 nonbase_ranges, \
538 top_to_bottom, \
539 std_charstring, \
540 };
541
542
543#define AF_DECLARE_STYLE_CLASS( style_class ) \
544 FT_CALLBACK_TABLE const AF_StyleClassRec \
545 style_class;
546
547#define AF_DEFINE_STYLE_CLASS( \
548 style_class, \
549 style, \
550 writing_system, \
551 script, \
552 blue_stringset, \
553 coverage ) \
554 FT_CALLBACK_TABLE_DEF \
555 const AF_StyleClassRec style_class = \
556 { \
557 style, \
558 writing_system, \
559 script, \
560 blue_stringset, \
561 coverage \
562 };
563
564/* */
565
566
568
569#endif /* AFTYPES_H_ */
570
571
572/* END */
enum AF_Blue_Stringset_ AF_Blue_Stringset
struct AF_StyleMetricsRec_ * AF_StyleMetrics
Definition: aftypes.h:198
const AF_ScriptClassRec * AF_ScriptClass
Definition: aftypes.h:353
const AF_StyleClassRec * AF_StyleClass
Definition: aftypes.h:457
AF_Coverage_
Definition: aftypes.h:410
@ AF_COVERAGE_DEFAULT
Definition: aftypes.h:413
struct AF_FaceGlobalsRec_ * AF_FaceGlobals
Definition: aftypes.h:468
FT_Int AF_Angle
Definition: aftypes.h:109
AF_WritingSystem_
Definition: aftypes.h:266
@ AF_WRITING_SYSTEM_MAX
Definition: aftypes.h:270
FT_Error(* AF_WritingSystem_InitMetricsFunc)(AF_StyleMetrics metrics, FT_Face face)
Definition: aftypes.h:205
void(* AF_WritingSystem_ScaleMetricsFunc)(AF_StyleMetrics metrics, AF_Scaler scaler)
Definition: aftypes.h:209
struct AF_StyleMetricsRec_ AF_StyleMetricsRec
enum AF_Script_ AF_Script
struct AF_ScriptClassRec_ AF_ScriptClassRec
af_sort_pos(FT_UInt count, FT_Pos *table)
Definition: afangles.c:187
struct AF_WritingSystemClassRec_ AF_WritingSystemClassRec
FT_BEGIN_HEADER struct AF_WidthRec_ AF_WidthRec
AF_Script_
Definition: aftypes.h:318
@ AF_SCRIPT_MAX
Definition: aftypes.h:322
struct AF_StyleClassRec_ AF_StyleClassRec
FT_BEGIN_HEADER struct AF_WidthRec_ * AF_Width
void(* AF_WritingSystem_DoneMetricsFunc)(AF_StyleMetrics metrics)
Definition: aftypes.h:213
const AF_WritingSystemClassRec * AF_WritingSystemClass
Definition: aftypes.h:292
const AF_Script_UniRangeRec * AF_Script_UniRange
Definition: aftypes.h:336
AF_Style_
Definition: aftypes.h:437
@ AF_STYLE_MAX
Definition: aftypes.h:441
FT_Error(* AF_WritingSystem_InitHintsFunc)(AF_GlyphHints hints, AF_StyleMetrics metrics)
Definition: aftypes.h:222
enum AF_Style_ AF_Style
struct AF_ScalerRec_ * AF_Scaler
FT_Error(* AF_WritingSystem_ApplyHintsFunc)(FT_UInt glyph_index, AF_GlyphHints hints, FT_Outline *outline, AF_StyleMetrics metrics)
Definition: aftypes.h:226
struct AF_GlyphHintsRec_ * AF_GlyphHints
Definition: aftypes.h:156
struct AF_ScalerRec_ AF_ScalerRec
enum AF_WritingSystem_ AF_WritingSystem
enum AF_Coverage_ AF_Coverage
struct AF_Script_UniRangeRec_ AF_Script_UniRangeRec
af_sort_and_quantize_widths(FT_UInt *count, AF_Width widths, FT_Pos threshold)
Definition: afangles.c:210
void(* AF_WritingSystem_GetStdWidthsFunc)(AF_StyleMetrics metrics, FT_Pos *stdHW, FT_Pos *stdVW)
Definition: aftypes.h:216
#define FT_LOCAL(x)
WORD face[3]
Definition: mesh.c:4747
enum FT_Render_Mode_ FT_Render_Mode
#define FT_END_HEADER
Definition: ftheader.h:57
#define FT_BEGIN_HEADER
Definition: ftheader.h:37
FT_BEGIN_HEADER typedef signed long FT_Pos
Definition: ftimage.h:57
FT_BEGIN_HEADER typedef unsigned char FT_Bool
Definition: fttypes.h:108
signed long FT_Fixed
Definition: fttypes.h:287
int FT_Error
Definition: fttypes.h:299
unsigned int FT_UInt
Definition: fttypes.h:231
size_t FT_Offset
Definition: fttypes.h:323
signed int FT_Int
Definition: fttypes.h:220
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizei GLenum const GLvoid GLuint GLsizei GLfloat * metrics
Definition: glext.h:11745
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
namespace GUID const ADDRINFOEXW * hints
Definition: sock.c:80
FT_UInt32 flags
Definition: aftypes.h:186
FT_Render_Mode render_mode
Definition: aftypes.h:185
FT_Pos y_delta
Definition: aftypes.h:184
FT_Face face
Definition: aftypes.h:180
FT_Pos x_delta
Definition: aftypes.h:183
FT_Fixed y_scale
Definition: aftypes.h:182
FT_Fixed x_scale
Definition: aftypes.h:181
const char * standard_charstring
Definition: aftypes.h:349
FT_Bool top_to_bottom_hinting
Definition: aftypes.h:347
AF_Script_UniRange script_uni_nonbase_ranges
Definition: aftypes.h:345
AF_Script script
Definition: aftypes.h:341
AF_Script_UniRange script_uni_ranges
Definition: aftypes.h:344
AF_WritingSystem writing_system
Definition: aftypes.h:450
AF_Style style
Definition: aftypes.h:448
AF_Script script
Definition: aftypes.h:451
AF_Blue_Stringset blue_stringset
Definition: aftypes.h:452
AF_Coverage coverage
Definition: aftypes.h:453
AF_ScalerRec scaler
Definition: aftypes.h:477
FT_Bool digits_have_same_width
Definition: aftypes.h:478
AF_StyleClass style_class
Definition: aftypes.h:476
AF_FaceGlobals globals
Definition: aftypes.h:480
FT_Pos cur
Definition: aftypes.h:79
FT_Pos fit
Definition: aftypes.h:80
FT_Pos org
Definition: aftypes.h:78
AF_WritingSystem_InitHintsFunc style_hints_init
Definition: aftypes.h:287
AF_WritingSystem writing_system
Definition: aftypes.h:279
AF_WritingSystem_DoneMetricsFunc style_metrics_done
Definition: aftypes.h:284
AF_WritingSystem_GetStdWidthsFunc style_metrics_getstdw
Definition: aftypes.h:285
AF_WritingSystem_ScaleMetricsFunc style_metrics_scale
Definition: aftypes.h:283
AF_WritingSystem_ApplyHintsFunc style_hints_apply
Definition: aftypes.h:288
FT_Offset style_metrics_size
Definition: aftypes.h:281
AF_WritingSystem_InitMetricsFunc style_metrics_init
Definition: aftypes.h:282
Definition: mesh.c:5330