blob: 44997d1e228baa2190ef3cffd49351e6b210bb6a [file] [log] [blame]
Werner Lembergf13516c2005-03-03 17:09:08 +00001/***************************************************************************/
2/* */
3/* aftypes.h */
4/* */
5/* Auto-fitter types (specification only). */
6/* */
Werner Lemberg332da872011-01-23 12:42:23 +01007/* Copyright 2003-2009, 2011 by */
Werner Lembergf13516c2005-03-03 17:09:08 +00008/* 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
Werner Lembergd1d4bff2006-02-10 22:15:22 +000019 /*************************************************************************
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 * scripts in order to apply language-specific rules.
24 *
Werner Lemberg689dd662007-01-30 23:08:50 +000025 * The code has also been compartmentized into several entities that
Werner Lembergd1d4bff2006-02-10 22:15:22 +000026 * should make algorithmic experimentation easier than with the old
27 * code.
28 *
29 * Finally, we get rid of the Catharon license, since this code is
30 * released under the FreeType one.
31 *
32 *************************************************************************/
Werner Lembergf13516c2005-03-03 17:09:08 +000033
34
Werner Lemberg8bb07e62004-03-27 08:43:17 +000035#ifndef __AFTYPES_H__
36#define __AFTYPES_H__
37
38#include <ft2build.h>
Werner Lembergf13516c2005-03-03 17:09:08 +000039
Werner Lemberg8bb07e62004-03-27 08:43:17 +000040#include FT_FREETYPE_H
41#include FT_OUTLINE_H
42#include FT_INTERNAL_OBJECTS_H
43#include FT_INTERNAL_DEBUG_H
44
Werner Lembergf13516c2005-03-03 17:09:08 +000045
Werner Lemberg8bb07e62004-03-27 08:43:17 +000046FT_BEGIN_HEADER
47
Werner Lembergf13516c2005-03-03 17:09:08 +000048 /*************************************************************************/
49 /*************************************************************************/
50 /***** *****/
51 /***** D E B U G G I N G *****/
52 /***** *****/
53 /*************************************************************************/
54 /*************************************************************************/
Werner Lemberg8bb07e62004-03-27 08:43:17 +000055
Werner Lembergd503b1b2011-04-18 19:05:28 +020056#ifdef FT_DEBUG_AUTOFIT
Werner Lemberg8bb07e62004-03-27 08:43:17 +000057
Werner Lemberg24d72a12009-01-13 17:34:48 +000058#include FT_CONFIG_STANDARD_LIBRARY_H
59
Werner Lemberg111b5ae2006-11-03 09:40:12 +000060extern int _af_debug_disable_horz_hints;
61extern int _af_debug_disable_vert_hints;
62extern int _af_debug_disable_blue_hints;
David Turner40604742006-11-02 16:37:35 +000063extern void* _af_debug_hints;
Werner Lemberg8bb07e62004-03-27 08:43:17 +000064
Werner Lembergd503b1b2011-04-18 19:05:28 +020065#endif /* FT_DEBUG_AUTOFIT */
Werner Lemberg8bb07e62004-03-27 08:43:17 +000066
Werner Lemberg8bb07e62004-03-27 08:43:17 +000067
Werner Lembergf13516c2005-03-03 17:09:08 +000068 /*************************************************************************/
69 /*************************************************************************/
70 /***** *****/
71 /***** U T I L I T Y S T U F F *****/
72 /***** *****/
73 /*************************************************************************/
74 /*************************************************************************/
75
76 typedef struct AF_WidthRec_
Werner Lemberg8bb07e62004-03-27 08:43:17 +000077 {
78 FT_Pos org; /* original position/width in font units */
79 FT_Pos cur; /* current/scaled position/width in device sub-pixels */
80 FT_Pos fit; /* current/fitted position/width in device sub-pixels */
81
82 } AF_WidthRec, *AF_Width;
83
84
85 FT_LOCAL( void )
Werner Lembergf13516c2005-03-03 17:09:08 +000086 af_sort_pos( FT_UInt count,
87 FT_Pos* table );
Werner Lemberg8bb07e62004-03-27 08:43:17 +000088
89 FT_LOCAL( void )
90 af_sort_widths( FT_UInt count,
91 AF_Width widths );
92
93
Werner Lembergf13516c2005-03-03 17:09:08 +000094 /*************************************************************************/
95 /*************************************************************************/
96 /***** *****/
97 /***** A N G L E T Y P E S *****/
98 /***** *****/
99 /*************************************************************************/
100 /*************************************************************************/
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000101
Werner Lembergf13516c2005-03-03 17:09:08 +0000102 /*
103 * The auto-fitter doesn't need a very high angular accuracy;
104 * this allows us to speed up some computations considerably with a
105 * light Cordic algorithm (see afangles.c).
106 */
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000107
Werner Lembergf13516c2005-03-03 17:09:08 +0000108 typedef FT_Int AF_Angle;
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000109
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000110
Werner Lembergf13516c2005-03-03 17:09:08 +0000111#define AF_ANGLE_PI 256
112#define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 )
113#define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 )
114#define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 )
115
116
David Turner281679d2006-05-17 13:34:21 +0000117#if 0
Werner Lembergf13516c2005-03-03 17:09:08 +0000118 /*
119 * compute the angle of a given 2-D vector
120 */
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000121 FT_LOCAL( AF_Angle )
122 af_angle_atan( FT_Pos dx,
123 FT_Pos dy );
124
125
Werner Lembergf13516c2005-03-03 17:09:08 +0000126 /*
127 * compute `angle2 - angle1'; the result is always within
128 * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
129 */
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000130 FT_LOCAL( AF_Angle )
131 af_angle_diff( AF_Angle angle1,
132 AF_Angle angle2 );
Werner Lemberg4309edc2005-11-11 15:49:14 +0000133#endif /* 0 */
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000134
Werner Lemberg4309edc2005-11-11 15:49:14 +0000135
136#define AF_ANGLE_DIFF( result, angle1, angle2 ) \
137 FT_BEGIN_STMNT \
138 AF_Angle _delta = (angle2) - (angle1); \
139 \
140 \
141 _delta %= AF_ANGLE_2PI; \
142 if ( _delta < 0 ) \
143 _delta += AF_ANGLE_2PI; \
144 \
145 if ( _delta > AF_ANGLE_PI ) \
146 _delta -= AF_ANGLE_2PI; \
147 \
148 result = _delta; \
David Turner9fbd2ab2005-10-28 16:14:14 +0000149 FT_END_STMNT
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000150
Werner Lemberg4309edc2005-11-11 15:49:14 +0000151
Werner Lembergf13516c2005-03-03 17:09:08 +0000152 /* opaque handle to glyph-specific hints -- see `afhints.h' for more
153 * details
154 */
155 typedef struct AF_GlyphHintsRec_* AF_GlyphHints;
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000156
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000157
Werner Lembergf13516c2005-03-03 17:09:08 +0000158 /*************************************************************************/
159 /*************************************************************************/
160 /***** *****/
161 /***** S C A L E R S *****/
162 /***** *****/
163 /*************************************************************************/
164 /*************************************************************************/
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000165
Werner Lembergf13516c2005-03-03 17:09:08 +0000166 /*
167 * A scaler models the target pixel device that will receive the
168 * auto-hinted glyph image.
169 */
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000170
Werner Lemberg2b0b4222008-05-28 22:17:28 +0000171 typedef enum AF_ScalerFlags_
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000172 {
173 AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */
174 AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */
175 AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */
176
177 } AF_ScalerFlags;
178
179
Werner Lembergf13516c2005-03-03 17:09:08 +0000180 typedef struct AF_ScalerRec_
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000181 {
Werner Lembergf13516c2005-03-03 17:09:08 +0000182 FT_Face face; /* source font face */
183 FT_Fixed x_scale; /* from font units to 1/64th device pixels */
184 FT_Fixed y_scale; /* from font units to 1/64th device pixels */
185 FT_Pos x_delta; /* in 1/64th device pixels */
186 FT_Pos y_delta; /* in 1/64th device pixels */
187 FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */
188 FT_UInt32 flags; /* additional control flags, see above */
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000189
190 } AF_ScalerRec, *AF_Scaler;
191
192
Werner Lembergf13516c2005-03-03 17:09:08 +0000193#define AF_SCALER_EQUAL_SCALES( a, b ) \
194 ( (a)->x_scale == (b)->x_scale && \
195 (a)->y_scale == (b)->y_scale && \
196 (a)->x_delta == (b)->x_delta && \
197 (a)->y_delta == (b)->y_delta )
David Turnere664efa2004-06-04 17:41:59 +0000198
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000199
Werner Lembergf13516c2005-03-03 17:09:08 +0000200 /*************************************************************************/
201 /*************************************************************************/
202 /***** *****/
203 /***** S C R I P T S *****/
204 /***** *****/
205 /*************************************************************************/
206 /*************************************************************************/
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000207
Werner Lembergf13516c2005-03-03 17:09:08 +0000208 /*
Werner Lemberg332da872011-01-23 12:42:23 +0100209 * The list of known scripts. Each different script corresponds to the
Werner Lembergf13516c2005-03-03 17:09:08 +0000210 * following information:
211 *
212 * - A set of Unicode ranges to test whether the face supports the
213 * script.
214 *
215 * - A specific global analyzer that will compute global metrics
216 * specific to the script.
217 *
218 * - A specific glyph analyzer that will compute segments and
219 * edges for each glyph covered by the script.
220 *
221 * - A specific grid-fitting algorithm that will distort the
222 * scaled glyph outline according to the results of the glyph
223 * analyzer.
224 *
225 * Note that a given analyzer and/or grid-fitting algorithm can be
226 * used by more than one script.
227 */
228
Werner Lemberg2b0b4222008-05-28 22:17:28 +0000229 typedef enum AF_Script_
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000230 {
231 AF_SCRIPT_NONE = 0,
232 AF_SCRIPT_LATIN = 1,
Wu, Chia-I (吳佳一)4cdb45c2006-02-09 14:17:04 +0000233 AF_SCRIPT_CJK = 2,
Werner Lemberg7723dc32007-06-26 04:44:35 +0000234 AF_SCRIPT_INDIC = 3,
David Turnerb7920172007-06-11 05:37:35 +0000235#ifdef FT_OPTION_AUTOFIT2
236 AF_SCRIPT_LATIN2,
237#endif
Werner Lemberg7723dc32007-06-26 04:44:35 +0000238
Werner Lembergf13516c2005-03-03 17:09:08 +0000239 /* add new scripts here. Don't forget to update the list in */
240 /* `afglobal.c'. */
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000241
242 AF_SCRIPT_MAX /* do not remove */
243
244 } AF_Script;
245
246
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000247 typedef struct AF_ScriptClassRec_ const* AF_ScriptClass;
248
Werner Lembergf13516c2005-03-03 17:09:08 +0000249 typedef struct AF_ScriptMetricsRec_
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000250 {
Werner Lembergf13516c2005-03-03 17:09:08 +0000251 AF_ScriptClass clazz;
252 AF_ScalerRec scaler;
Werner Lemberg8b84c9d2009-04-27 19:40:35 +0200253 FT_Bool digits_have_same_width;
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000254
255 } AF_ScriptMetricsRec, *AF_ScriptMetrics;
256
257
Werner Lembergf13516c2005-03-03 17:09:08 +0000258 /* This function parses an FT_Face to compute global metrics for
259 * a specific script.
260 */
261 typedef FT_Error
262 (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics,
263 FT_Face face );
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000264
Werner Lembergf13516c2005-03-03 17:09:08 +0000265 typedef void
266 (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics,
267 AF_Scaler scaler );
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000268
Werner Lembergf13516c2005-03-03 17:09:08 +0000269 typedef void
270 (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics );
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000271
272
Werner Lembergf13516c2005-03-03 17:09:08 +0000273 typedef FT_Error
274 (*AF_Script_InitHintsFunc)( AF_GlyphHints hints,
275 AF_ScriptMetrics metrics );
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000276
Werner Lembergf13516c2005-03-03 17:09:08 +0000277 typedef void
278 (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints,
279 FT_Outline* outline,
280 AF_ScriptMetrics metrics );
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000281
282
Werner Lembergf13516c2005-03-03 17:09:08 +0000283 typedef struct AF_Script_UniRangeRec_
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000284 {
Werner Lembergf13516c2005-03-03 17:09:08 +0000285 FT_UInt32 first;
286 FT_UInt32 last;
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000287
288 } AF_Script_UniRangeRec;
289
suzuki toshiya38e480b2009-08-01 00:30:21 +0900290#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
291
Werner Lembergf13516c2005-03-03 17:09:08 +0000292 typedef const AF_Script_UniRangeRec *AF_Script_UniRange;
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000293
Werner Lembergf13516c2005-03-03 17:09:08 +0000294
295 typedef struct AF_ScriptClassRec_
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000296 {
297 AF_Script script;
Werner Lembergf13516c2005-03-03 17:09:08 +0000298 AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000299
suzuki toshiyab5668022009-08-01 00:32:07 +0900300 FT_Offset script_metrics_size;
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000301 AF_Script_InitMetricsFunc script_metrics_init;
302 AF_Script_ScaleMetricsFunc script_metrics_scale;
303 AF_Script_DoneMetricsFunc script_metrics_done;
304
305 AF_Script_InitHintsFunc script_hints_init;
306 AF_Script_ApplyHintsFunc script_hints_apply;
307
308 } AF_ScriptClassRec;
309
Werner Lemberg332da872011-01-23 12:42:23 +0100310
311 /* Declare and define vtables for classes */
Oran Agra59b4af82009-04-05 18:23:38 +0300312#ifndef FT_CONFIG_OPTION_PIC
313
Werner Lemberg332da872011-01-23 12:42:23 +0100314#define AF_DECLARE_SCRIPT_CLASS( script_class ) \
315 FT_CALLBACK_TABLE const AF_ScriptClassRec \
Oran Agra59b4af82009-04-05 18:23:38 +0300316 script_class;
317
Werner Lemberg332da872011-01-23 12:42:23 +0100318#define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, m_size, \
319 m_init, m_scale, m_done, h_init, h_apply ) \
320 FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec \
321 script_class = \
322 { \
323 script_, \
324 ranges, \
325 \
326 m_size, \
327 \
328 m_init, \
329 m_scale, \
330 m_done, \
331 \
332 h_init, \
333 h_apply \
Oran Agra59b4af82009-04-05 18:23:38 +0300334 };
335
Werner Lemberg332da872011-01-23 12:42:23 +0100336#else /* FT_CONFIG_OPTION_PIC */
Oran Agra59b4af82009-04-05 18:23:38 +0300337
Werner Lemberg332da872011-01-23 12:42:23 +0100338#define AF_DECLARE_SCRIPT_CLASS( script_class ) \
339 FT_LOCAL( void ) \
340 FT_Init_Class_##script_class( AF_ScriptClassRec* ac );
Oran Agra59b4af82009-04-05 18:23:38 +0300341
Werner Lemberg332da872011-01-23 12:42:23 +0100342#define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, m_size, \
343 m_init, m_scale, m_done, h_init, h_apply ) \
344 FT_LOCAL_DEF( void ) \
345 FT_Init_Class_##script_class( AF_ScriptClassRec* ac ) \
346 { \
347 ac->script = script_; \
348 ac->script_uni_ranges = ranges; \
349 \
350 ac->script_metrics_size = m_size; \
351 \
352 ac->script_metrics_init = m_init; \
353 ac->script_metrics_scale = m_scale; \
354 ac->script_metrics_done = m_done; \
355 \
356 ac->script_hints_init = h_init; \
357 ac->script_hints_apply = h_apply; \
Oran Agra59b4af82009-04-05 18:23:38 +0300358 }
Werner Lemberg332da872011-01-23 12:42:23 +0100359
360#endif /* FT_CONFIG_OPTION_PIC */
Oran Agra59b4af82009-04-05 18:23:38 +0300361
Werner Lemberg8bb07e62004-03-27 08:43:17 +0000362
363/* */
364
365FT_END_HEADER
366
367#endif /* __AFTYPES_H__ */
Werner Lembergf13516c2005-03-03 17:09:08 +0000368
369
370/* END */