1 /***************************************************************************/
5 /* Auto-fitter types (specification only). */
7 /* Copyright 2003-2018 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
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. */
16 /***************************************************************************/
19 /*************************************************************************
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.
25 * The code has also been compartmentalized into several entities that
26 * should make algorithmic experimentation easier than with the old
29 *************************************************************************/
37 #include FT_FREETYPE_H
39 #include FT_INTERNAL_OBJECTS_H
40 #include FT_INTERNAL_DEBUG_H
44 #ifdef FT_DEBUG_AUTOFIT
45 #include FT_CONFIG_STANDARD_LIBRARY_H
51 /*************************************************************************/
52 /*************************************************************************/
54 /***** D E B U G G I N G *****/
56 /*************************************************************************/
57 /*************************************************************************/
59 #ifdef FT_DEBUG_AUTOFIT
61 extern int _af_debug_disable_horz_hints;
62 extern int _af_debug_disable_vert_hints;
63 extern int _af_debug_disable_blue_hints;
64 extern void* _af_debug_hints;
66 #endif /* FT_DEBUG_AUTOFIT */
69 /*************************************************************************/
70 /*************************************************************************/
72 /***** U T I L I T Y S T U F F *****/
74 /*************************************************************************/
75 /*************************************************************************/
77 typedef struct AF_WidthRec_
79 FT_Pos org; /* original position/width in font units */
80 FT_Pos cur; /* current/scaled position/width in device sub-pixels */
81 FT_Pos fit; /* current/fitted position/width in device sub-pixels */
83 } AF_WidthRec, *AF_Width;
87 af_sort_pos( FT_UInt count,
91 af_sort_and_quantize_widths( FT_UInt* count,
96 /*************************************************************************/
97 /*************************************************************************/
99 /***** A N G L E T Y P E S *****/
101 /*************************************************************************/
102 /*************************************************************************/
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).
110 typedef FT_Int AF_Angle;
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 )
121 * compute the angle of a given 2-D vector
124 af_angle_atan( FT_Pos dx,
129 * compute `angle2 - angle1'; the result is always within
130 * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
133 af_angle_diff( AF_Angle angle1,
138 #define AF_ANGLE_DIFF( result, angle1, angle2 ) \
140 AF_Angle _delta = (angle2) - (angle1); \
143 while ( _delta <= -AF_ANGLE_PI ) \
144 _delta += AF_ANGLE_2PI; \
146 while ( _delta > AF_ANGLE_PI ) \
147 _delta -= AF_ANGLE_2PI; \
153 /* opaque handle to glyph-specific hints -- see `afhints.h' for more
156 typedef struct AF_GlyphHintsRec_* AF_GlyphHints;
159 /*************************************************************************/
160 /*************************************************************************/
162 /***** S C A L E R S *****/
164 /*************************************************************************/
165 /*************************************************************************/
168 * A scaler models the target pixel device that will receive the
169 * auto-hinted glyph image.
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 */
178 typedef struct AF_ScalerRec_
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 */
188 } AF_ScalerRec, *AF_Scaler;
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 )
198 typedef struct AF_StyleMetricsRec_* AF_StyleMetrics;
200 /* This function parses an FT_Face to compute global metrics for
204 (*AF_WritingSystem_InitMetricsFunc)( AF_StyleMetrics metrics,
208 (*AF_WritingSystem_ScaleMetricsFunc)( AF_StyleMetrics metrics,
212 (*AF_WritingSystem_DoneMetricsFunc)( AF_StyleMetrics metrics );
215 (*AF_WritingSystem_GetStdWidthsFunc)( AF_StyleMetrics metrics,
221 (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints hints,
222 AF_StyleMetrics metrics );
225 (*AF_WritingSystem_ApplyHintsFunc)( FT_UInt glyph_index,
228 AF_StyleMetrics metrics );
231 /*************************************************************************/
232 /*************************************************************************/
234 /***** W R I T I N G S Y S T E M S *****/
236 /*************************************************************************/
237 /*************************************************************************/
240 * For the auto-hinter, a writing system consists of multiple scripts that
241 * can be handled similarly *in a typographical way*; the relationship is
242 * not based on history. For example, both the Greek and the unrelated
243 * Armenian scripts share the same features like ascender, descender,
244 * x-height, etc. Essentially, a writing system is covered by a
245 * submodule of the auto-fitter; it contains
247 * - a specific global analyzer that computes global metrics specific to
248 * the script (based on script-specific characters to identify ascender
249 * height, x-height, etc.),
251 * - a specific glyph analyzer that computes segments and edges for each
252 * glyph covered by the script,
254 * - a specific grid-fitting algorithm that distorts the scaled glyph
255 * outline according to the results of the glyph analyzer.
258 #define AFWRTSYS_H_ /* don't load header files */
259 #undef WRITING_SYSTEM
260 #define WRITING_SYSTEM( ws, WS ) \
261 AF_WRITING_SYSTEM_ ## WS,
263 /* The list of known writing systems. */
264 typedef enum AF_WritingSystem_
267 #include "afwrtsys.h"
269 AF_WRITING_SYSTEM_MAX /* do not remove */
276 typedef struct AF_WritingSystemClassRec_
278 AF_WritingSystem writing_system;
280 FT_Offset style_metrics_size;
281 AF_WritingSystem_InitMetricsFunc style_metrics_init;
282 AF_WritingSystem_ScaleMetricsFunc style_metrics_scale;
283 AF_WritingSystem_DoneMetricsFunc style_metrics_done;
284 AF_WritingSystem_GetStdWidthsFunc style_metrics_getstdw;
286 AF_WritingSystem_InitHintsFunc style_hints_init;
287 AF_WritingSystem_ApplyHintsFunc style_hints_apply;
289 } AF_WritingSystemClassRec;
291 typedef const AF_WritingSystemClassRec* AF_WritingSystemClass;
294 /*************************************************************************/
295 /*************************************************************************/
297 /***** S C R I P T S *****/
299 /*************************************************************************/
300 /*************************************************************************/
303 * Each script is associated with two sets of Unicode ranges to test
304 * whether the font face supports the script, and which non-base
305 * characters the script contains.
307 * We use four-letter script tags from the OpenType specification,
308 * extended by `NONE', which indicates `no script'.
312 #define SCRIPT( s, S, d, h, H, ss ) \
315 /* The list of known scripts. */
316 typedef enum AF_Script_
319 #include "afscript.h"
321 AF_SCRIPT_MAX /* do not remove */
326 typedef struct AF_Script_UniRangeRec_
331 } AF_Script_UniRangeRec;
333 #define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
335 typedef const AF_Script_UniRangeRec* AF_Script_UniRange;
338 typedef struct AF_ScriptClassRec_
342 /* last element in the ranges must be { 0, 0 } */
343 AF_Script_UniRange script_uni_ranges;
344 AF_Script_UniRange script_uni_nonbase_ranges;
346 FT_Bool top_to_bottom_hinting;
348 const char* standard_charstring; /* for default width and height */
352 typedef const AF_ScriptClassRec* AF_ScriptClass;
355 /*************************************************************************/
356 /*************************************************************************/
358 /***** C O V E R A G E S *****/
360 /*************************************************************************/
361 /*************************************************************************/
364 * Usually, a font contains more glyphs than can be addressed by its
367 * In the PostScript font world, encoding vectors specific to a given
368 * task are used to select such glyphs, and these glyphs can be often
369 * recognized by having a suffix in its glyph names. For example, a
370 * superscript glyph `A' might be called `A.sup'. Unfortunately, this
371 * naming scheme is not standardized and thus unusable for us.
373 * In the OpenType world, a better solution was invented, namely
374 * `features', which cleanly separate a character's input encoding from
375 * the corresponding glyph's appearance, and which don't use glyph names
376 * at all. For our purposes, and slightly generalized, an OpenType
377 * feature is a name of a mapping that maps character codes to
378 * non-standard glyph indices (features get used for other things also).
379 * For example, the `sups' feature provides superscript glyphs, thus
380 * mapping character codes like `A' or `B' to superscript glyph
381 * representation forms. How this mapping happens is completely
382 * uninteresting to us.
384 * For the auto-hinter, a `coverage' represents all glyphs of an OpenType
385 * feature collected in a set (as listed below) that can be hinted
386 * together. To continue the above example, superscript glyphs must not
387 * be hinted together with normal glyphs because the blue zones
390 * Note that FreeType itself doesn't compute coverages; it only provides
391 * the glyphs addressable by the default Unicode character map. Instead,
392 * we use the HarfBuzz library (if available), which has many functions
393 * exactly for this purpose.
395 * AF_COVERAGE_DEFAULT is special: It should cover everything that isn't
396 * listed separately (including the glyphs addressable by the character
397 * map). In case HarfBuzz isn't available, it exactly covers the glyphs
398 * addressable by the character map.
403 #define COVERAGE( name, NAME, description, \
404 tag1, tag2, tag3, tag4 ) \
405 AF_COVERAGE_ ## NAME,
408 typedef enum AF_Coverage_
417 /*************************************************************************/
418 /*************************************************************************/
420 /***** S T Y L E S *****/
422 /*************************************************************************/
423 /*************************************************************************/
426 * The topmost structure for modelling the auto-hinter glyph input data
427 * is a `style class', grouping everything together.
431 #define STYLE( s, S, d, ws, sc, ss, c ) \
434 /* The list of known styles. */
435 typedef enum AF_Style_
438 #include "afstyles.h"
440 AF_STYLE_MAX /* do not remove */
445 typedef struct AF_StyleClassRec_
449 AF_WritingSystem writing_system;
451 AF_Blue_Stringset blue_stringset;
452 AF_Coverage coverage;
456 typedef const AF_StyleClassRec* AF_StyleClass;
459 /*************************************************************************/
460 /*************************************************************************/
462 /***** S T Y L E M E T R I C S *****/
464 /*************************************************************************/
465 /*************************************************************************/
467 typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals;
469 /* This is the main structure that combines everything. Autofit modules */
470 /* specific to writing systems derive their structures from it, for */
471 /* example `AF_LatinMetrics'. */
473 typedef struct AF_StyleMetricsRec_
475 AF_StyleClass style_class;
477 FT_Bool digits_have_same_width;
479 AF_FaceGlobals globals; /* to access properties */
481 } AF_StyleMetricsRec;
484 #define AF_HINTING_BOTTOM_TO_TOP 0
485 #define AF_HINTING_TOP_TO_BOTTOM 1
488 /* Declare and define vtables for classes */
489 #ifndef FT_CONFIG_OPTION_PIC
491 #define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \
492 FT_CALLBACK_TABLE const AF_WritingSystemClassRec \
493 writing_system_class;
495 #define AF_DEFINE_WRITING_SYSTEM_CLASS( \
496 writing_system_class, \
505 FT_CALLBACK_TABLE_DEF \
506 const AF_WritingSystemClassRec writing_system_class = \
522 #define AF_DECLARE_SCRIPT_CLASS( script_class ) \
523 FT_CALLBACK_TABLE const AF_ScriptClassRec \
526 #define AF_DEFINE_SCRIPT_CLASS( \
533 FT_CALLBACK_TABLE_DEF \
534 const AF_ScriptClassRec script_class = \
544 #define AF_DECLARE_STYLE_CLASS( style_class ) \
545 FT_CALLBACK_TABLE const AF_StyleClassRec \
548 #define AF_DEFINE_STYLE_CLASS( \
555 FT_CALLBACK_TABLE_DEF \
556 const AF_StyleClassRec style_class = \
565 #else /* FT_CONFIG_OPTION_PIC */
567 #define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \
569 FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec* ac );
571 #define AF_DEFINE_WRITING_SYSTEM_CLASS( \
572 writing_system_class, \
581 FT_LOCAL_DEF( void ) \
582 FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec* ac ) \
584 ac->writing_system = system; \
586 ac->style_metrics_size = m_size; \
588 ac->style_metrics_init = m_init; \
589 ac->style_metrics_scale = m_scale; \
590 ac->style_metrics_done = m_done; \
591 ac->style_metrics_getstdw = m_stdw; \
593 ac->style_hints_init = h_init; \
594 ac->style_hints_apply = h_apply; \
598 #define AF_DECLARE_SCRIPT_CLASS( script_class ) \
600 FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac );
602 #define AF_DEFINE_SCRIPT_CLASS( \
609 FT_LOCAL_DEF( void ) \
610 FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac ) \
612 ac->script = script_; \
613 ac->script_uni_ranges = ranges; \
614 ac->script_uni_nonbase_ranges = nonbase_ranges; \
615 ac->top_to_bottom_hinting = top_to_bottom; \
616 ac->standard_charstring = std_charstring; \
620 #define AF_DECLARE_STYLE_CLASS( style_class ) \
622 FT_Init_Class_ ## style_class( AF_StyleClassRec* ac );
624 #define AF_DEFINE_STYLE_CLASS( \
631 FT_LOCAL_DEF( void ) \
632 FT_Init_Class_ ## style_class( AF_StyleClassRec* ac ) \
634 ac->style = style_; \
635 ac->writing_system = writing_system_; \
636 ac->script = script_; \
637 ac->blue_stringset = blue_stringset_; \
638 ac->coverage = coverage_; \
641 #endif /* FT_CONFIG_OPTION_PIC */
648 #endif /* AFTYPES_H_ */