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