1 /****************************************************************************
5 * Auto-fitter types (specification only).
7 * Copyright (C) 2003-2020 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.
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 *************************************************************************/
36 #include <freetype/freetype.h>
37 #include <freetype/ftoutln.h>
38 #include <freetype/internal/ftobjs.h>
39 #include <freetype/internal/ftdebug.h>
43 #ifdef FT_DEBUG_AUTOFIT
44 #include FT_CONFIG_STANDARD_LIBRARY_H
50 /*************************************************************************/
51 /*************************************************************************/
53 /***** D E B U G G I N G *****/
55 /*************************************************************************/
56 /*************************************************************************/
58 #ifdef FT_DEBUG_AUTOFIT
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;
65 #endif /* FT_DEBUG_AUTOFIT */
68 /*************************************************************************/
69 /*************************************************************************/
71 /***** U T I L I T Y S T U F F *****/
73 /*************************************************************************/
74 /*************************************************************************/
76 typedef struct AF_WidthRec_
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 */
82 } AF_WidthRec, *AF_Width;
86 af_sort_pos( FT_UInt count,
90 af_sort_and_quantize_widths( FT_UInt* count,
95 /*************************************************************************/
96 /*************************************************************************/
98 /***** A N G L E T Y P E S *****/
100 /*************************************************************************/
101 /*************************************************************************/
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).
109 typedef FT_Int AF_Angle;
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 )
120 * compute the angle of a given 2-D vector
123 af_angle_atan( FT_Pos dx,
128 * compute `angle2 - angle1'; the result is always within
129 * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
132 af_angle_diff( AF_Angle angle1,
137 #define AF_ANGLE_DIFF( result, angle1, angle2 ) \
139 AF_Angle _delta = (angle2) - (angle1); \
142 while ( _delta <= -AF_ANGLE_PI ) \
143 _delta += AF_ANGLE_2PI; \
145 while ( _delta > AF_ANGLE_PI ) \
146 _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;
201 * This function parses an FT_Face to compute global metrics for
205 (*AF_WritingSystem_InitMetricsFunc)( AF_StyleMetrics metrics,
209 (*AF_WritingSystem_ScaleMetricsFunc)( AF_StyleMetrics metrics,
213 (*AF_WritingSystem_DoneMetricsFunc)( AF_StyleMetrics metrics );
216 (*AF_WritingSystem_GetStdWidthsFunc)( AF_StyleMetrics metrics,
222 (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints hints,
223 AF_StyleMetrics metrics );
226 (*AF_WritingSystem_ApplyHintsFunc)( FT_UInt glyph_index,
229 AF_StyleMetrics metrics );
232 /*************************************************************************/
233 /*************************************************************************/
235 /***** W R I T I N G S Y S T E M S *****/
237 /*************************************************************************/
238 /*************************************************************************/
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
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.),
252 * - a specific glyph analyzer that computes segments and edges for each
253 * glyph covered by the script,
255 * - a specific grid-fitting algorithm that distorts the scaled glyph
256 * outline according to the results of the glyph analyzer.
259 #define AFWRTSYS_H_ /* don't load header files */
260 #undef WRITING_SYSTEM
261 #define WRITING_SYSTEM( ws, WS ) \
262 AF_WRITING_SYSTEM_ ## WS,
264 /* The list of known writing systems. */
265 typedef enum AF_WritingSystem_
268 #include "afwrtsys.h"
270 AF_WRITING_SYSTEM_MAX /* do not remove */
277 typedef struct AF_WritingSystemClassRec_
279 AF_WritingSystem writing_system;
281 FT_Offset style_metrics_size;
282 AF_WritingSystem_InitMetricsFunc style_metrics_init;
283 AF_WritingSystem_ScaleMetricsFunc style_metrics_scale;
284 AF_WritingSystem_DoneMetricsFunc style_metrics_done;
285 AF_WritingSystem_GetStdWidthsFunc style_metrics_getstdw;
287 AF_WritingSystem_InitHintsFunc style_hints_init;
288 AF_WritingSystem_ApplyHintsFunc style_hints_apply;
290 } AF_WritingSystemClassRec;
292 typedef const AF_WritingSystemClassRec* AF_WritingSystemClass;
295 /*************************************************************************/
296 /*************************************************************************/
298 /***** S C R I P T S *****/
300 /*************************************************************************/
301 /*************************************************************************/
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.
308 * We use four-letter script tags from the OpenType specification,
309 * extended by `NONE', which indicates `no script'.
313 #define SCRIPT( s, S, d, h, H, ss ) \
316 /* The list of known scripts. */
317 typedef enum AF_Script_
320 #include "afscript.h"
322 AF_SCRIPT_MAX /* do not remove */
327 typedef struct AF_Script_UniRangeRec_
332 } AF_Script_UniRangeRec;
334 #define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
336 typedef const AF_Script_UniRangeRec* AF_Script_UniRange;
339 typedef struct AF_ScriptClassRec_
343 /* last element in the ranges must be { 0, 0 } */
344 AF_Script_UniRange script_uni_ranges;
345 AF_Script_UniRange script_uni_nonbase_ranges;
347 FT_Bool top_to_bottom_hinting;
349 const char* standard_charstring; /* for default width and height */
353 typedef const AF_ScriptClassRec* AF_ScriptClass;
356 /*************************************************************************/
357 /*************************************************************************/
359 /***** C O V E R A G E S *****/
361 /*************************************************************************/
362 /*************************************************************************/
365 * Usually, a font contains more glyphs than can be addressed by its
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.
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.
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
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.
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.
404 #define COVERAGE( name, NAME, description, \
405 tag1, tag2, tag3, tag4 ) \
406 AF_COVERAGE_ ## NAME,
409 typedef enum AF_Coverage_
418 /*************************************************************************/
419 /*************************************************************************/
421 /***** S T Y L E S *****/
423 /*************************************************************************/
424 /*************************************************************************/
427 * The topmost structure for modelling the auto-hinter glyph input data
428 * is a `style class', grouping everything together.
432 #define STYLE( s, S, d, ws, sc, ss, c ) \
435 /* The list of known styles. */
436 typedef enum AF_Style_
439 #include "afstyles.h"
441 AF_STYLE_MAX /* do not remove */
446 typedef struct AF_StyleClassRec_
450 AF_WritingSystem writing_system;
452 AF_Blue_Stringset blue_stringset;
453 AF_Coverage coverage;
457 typedef const AF_StyleClassRec* AF_StyleClass;
460 /*************************************************************************/
461 /*************************************************************************/
463 /***** S T Y L E M E T R I C S *****/
465 /*************************************************************************/
466 /*************************************************************************/
468 typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals;
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'. */
474 typedef struct AF_StyleMetricsRec_
476 AF_StyleClass style_class;
478 FT_Bool digits_have_same_width;
480 AF_FaceGlobals globals; /* to access properties */
482 } AF_StyleMetricsRec;
485 #define AF_HINTING_BOTTOM_TO_TOP 0
486 #define AF_HINTING_TOP_TO_BOTTOM 1
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;
494 #define AF_DEFINE_WRITING_SYSTEM_CLASS( \
495 writing_system_class, \
504 FT_CALLBACK_TABLE_DEF \
505 const AF_WritingSystemClassRec writing_system_class = \
521 #define AF_DECLARE_SCRIPT_CLASS( script_class ) \
522 FT_CALLBACK_TABLE const AF_ScriptClassRec \
525 #define AF_DEFINE_SCRIPT_CLASS( \
532 FT_CALLBACK_TABLE_DEF \
533 const AF_ScriptClassRec script_class = \
543 #define AF_DECLARE_STYLE_CLASS( style_class ) \
544 FT_CALLBACK_TABLE const AF_StyleClassRec \
547 #define AF_DEFINE_STYLE_CLASS( \
554 FT_CALLBACK_TABLE_DEF \
555 const AF_StyleClassRec style_class = \
569 #endif /* AFTYPES_H_ */