[CMAKE]
[reactos.git] / lib / 3rdparty / freetype / src / autofit / aftypes.h
1 /***************************************************************************/
2 /* */
3 /* aftypes.h */
4 /* */
5 /* Auto-fitter types (specification only). */
6 /* */
7 /* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 * scripts in order to apply language-specific rules.
24 *
25 * The code has also been compartmentized into several entities that
26 * 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 *************************************************************************/
33
34
35 #ifndef __AFTYPES_H__
36 #define __AFTYPES_H__
37
38 #include <ft2build.h>
39
40 #include FT_FREETYPE_H
41 #include FT_OUTLINE_H
42 #include FT_INTERNAL_OBJECTS_H
43 #include FT_INTERNAL_DEBUG_H
44
45
46 FT_BEGIN_HEADER
47
48 /*************************************************************************/
49 /*************************************************************************/
50 /***** *****/
51 /***** D E B U G G I N G *****/
52 /***** *****/
53 /*************************************************************************/
54 /*************************************************************************/
55
56 #define xxAF_USE_WARPER /* only define to use warp hinting */
57 #define xxAF_DEBUG
58
59 #ifdef AF_DEBUG
60
61 #include FT_CONFIG_STANDARD_LIBRARY_H
62
63 #define AF_LOG( x ) do { if ( _af_debug ) printf x; } while ( 0 )
64
65 extern int _af_debug;
66 extern int _af_debug_disable_horz_hints;
67 extern int _af_debug_disable_vert_hints;
68 extern int _af_debug_disable_blue_hints;
69 extern void* _af_debug_hints;
70
71 #else /* !AF_DEBUG */
72
73 #define AF_LOG( x ) do { } while ( 0 ) /* nothing */
74
75 #endif /* !AF_DEBUG */
76
77
78 /*************************************************************************/
79 /*************************************************************************/
80 /***** *****/
81 /***** U T I L I T Y S T U F F *****/
82 /***** *****/
83 /*************************************************************************/
84 /*************************************************************************/
85
86 typedef struct AF_WidthRec_
87 {
88 FT_Pos org; /* original position/width in font units */
89 FT_Pos cur; /* current/scaled position/width in device sub-pixels */
90 FT_Pos fit; /* current/fitted position/width in device sub-pixels */
91
92 } AF_WidthRec, *AF_Width;
93
94
95 FT_LOCAL( void )
96 af_sort_pos( FT_UInt count,
97 FT_Pos* table );
98
99 FT_LOCAL( void )
100 af_sort_widths( FT_UInt count,
101 AF_Width widths );
102
103
104 /*************************************************************************/
105 /*************************************************************************/
106 /***** *****/
107 /***** A N G L E T Y P E S *****/
108 /***** *****/
109 /*************************************************************************/
110 /*************************************************************************/
111
112 /*
113 * The auto-fitter doesn't need a very high angular accuracy;
114 * this allows us to speed up some computations considerably with a
115 * light Cordic algorithm (see afangles.c).
116 */
117
118 typedef FT_Int AF_Angle;
119
120
121 #define AF_ANGLE_PI 256
122 #define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 )
123 #define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 )
124 #define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 )
125
126
127 #if 0
128 /*
129 * compute the angle of a given 2-D vector
130 */
131 FT_LOCAL( AF_Angle )
132 af_angle_atan( FT_Pos dx,
133 FT_Pos dy );
134
135
136 /*
137 * compute `angle2 - angle1'; the result is always within
138 * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
139 */
140 FT_LOCAL( AF_Angle )
141 af_angle_diff( AF_Angle angle1,
142 AF_Angle angle2 );
143 #endif /* 0 */
144
145
146 #define AF_ANGLE_DIFF( result, angle1, angle2 ) \
147 FT_BEGIN_STMNT \
148 AF_Angle _delta = (angle2) - (angle1); \
149 \
150 \
151 _delta %= AF_ANGLE_2PI; \
152 if ( _delta < 0 ) \
153 _delta += AF_ANGLE_2PI; \
154 \
155 if ( _delta > AF_ANGLE_PI ) \
156 _delta -= AF_ANGLE_2PI; \
157 \
158 result = _delta; \
159 FT_END_STMNT
160
161
162 /*************************************************************************/
163 /*************************************************************************/
164 /***** *****/
165 /***** O U T L I N E S *****/
166 /***** *****/
167 /*************************************************************************/
168 /*************************************************************************/
169
170 /* opaque handle to glyph-specific hints -- see `afhints.h' for more
171 * details
172 */
173 typedef struct AF_GlyphHintsRec_* AF_GlyphHints;
174
175 /* This structure is used to model an input glyph outline to
176 * the auto-hinter. The latter will set the `hints' field
177 * depending on the glyph's script.
178 */
179 typedef struct AF_OutlineRec_
180 {
181 FT_Face face;
182 FT_Outline outline;
183 FT_UInt outline_resolution;
184
185 FT_Int advance;
186 FT_UInt metrics_resolution;
187
188 AF_GlyphHints hints;
189
190 } AF_OutlineRec;
191
192
193 /*************************************************************************/
194 /*************************************************************************/
195 /***** *****/
196 /***** S C A L E R S *****/
197 /***** *****/
198 /*************************************************************************/
199 /*************************************************************************/
200
201 /*
202 * A scaler models the target pixel device that will receive the
203 * auto-hinted glyph image.
204 */
205
206 typedef enum AF_ScalerFlags_
207 {
208 AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */
209 AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */
210 AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */
211
212 } AF_ScalerFlags;
213
214
215 typedef struct AF_ScalerRec_
216 {
217 FT_Face face; /* source font face */
218 FT_Fixed x_scale; /* from font units to 1/64th device pixels */
219 FT_Fixed y_scale; /* from font units to 1/64th device pixels */
220 FT_Pos x_delta; /* in 1/64th device pixels */
221 FT_Pos y_delta; /* in 1/64th device pixels */
222 FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */
223 FT_UInt32 flags; /* additional control flags, see above */
224
225 } AF_ScalerRec, *AF_Scaler;
226
227
228 #define AF_SCALER_EQUAL_SCALES( a, b ) \
229 ( (a)->x_scale == (b)->x_scale && \
230 (a)->y_scale == (b)->y_scale && \
231 (a)->x_delta == (b)->x_delta && \
232 (a)->y_delta == (b)->y_delta )
233
234
235 /*************************************************************************/
236 /*************************************************************************/
237 /***** *****/
238 /***** S C R I P T S *****/
239 /***** *****/
240 /*************************************************************************/
241 /*************************************************************************/
242
243 /*
244 * The list of know scripts. Each different script corresponds to the
245 * following information:
246 *
247 * - A set of Unicode ranges to test whether the face supports the
248 * script.
249 *
250 * - A specific global analyzer that will compute global metrics
251 * specific to the script.
252 *
253 * - A specific glyph analyzer that will compute segments and
254 * edges for each glyph covered by the script.
255 *
256 * - A specific grid-fitting algorithm that will distort the
257 * scaled glyph outline according to the results of the glyph
258 * analyzer.
259 *
260 * Note that a given analyzer and/or grid-fitting algorithm can be
261 * used by more than one script.
262 */
263
264 typedef enum AF_Script_
265 {
266 AF_SCRIPT_NONE = 0,
267 AF_SCRIPT_LATIN = 1,
268 AF_SCRIPT_CJK = 2,
269 AF_SCRIPT_INDIC = 3,
270 #ifdef FT_OPTION_AUTOFIT2
271 AF_SCRIPT_LATIN2,
272 #endif
273
274 /* add new scripts here. Don't forget to update the list in */
275 /* `afglobal.c'. */
276
277 AF_SCRIPT_MAX /* do not remove */
278
279 } AF_Script;
280
281
282 typedef struct AF_ScriptClassRec_ const* AF_ScriptClass;
283
284 typedef struct AF_ScriptMetricsRec_
285 {
286 AF_ScriptClass clazz;
287 AF_ScalerRec scaler;
288 FT_Bool digits_have_same_width;
289
290 } AF_ScriptMetricsRec, *AF_ScriptMetrics;
291
292
293 /* This function parses an FT_Face to compute global metrics for
294 * a specific script.
295 */
296 typedef FT_Error
297 (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics,
298 FT_Face face );
299
300 typedef void
301 (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics,
302 AF_Scaler scaler );
303
304 typedef void
305 (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics );
306
307
308 typedef FT_Error
309 (*AF_Script_InitHintsFunc)( AF_GlyphHints hints,
310 AF_ScriptMetrics metrics );
311
312 typedef void
313 (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints,
314 FT_Outline* outline,
315 AF_ScriptMetrics metrics );
316
317
318 typedef struct AF_Script_UniRangeRec_
319 {
320 FT_UInt32 first;
321 FT_UInt32 last;
322
323 } AF_Script_UniRangeRec;
324
325 #define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
326
327 typedef const AF_Script_UniRangeRec *AF_Script_UniRange;
328
329
330 typedef struct AF_ScriptClassRec_
331 {
332 AF_Script script;
333 AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */
334
335 FT_Offset script_metrics_size;
336 AF_Script_InitMetricsFunc script_metrics_init;
337 AF_Script_ScaleMetricsFunc script_metrics_scale;
338 AF_Script_DoneMetricsFunc script_metrics_done;
339
340 AF_Script_InitHintsFunc script_hints_init;
341 AF_Script_ApplyHintsFunc script_hints_apply;
342
343 } AF_ScriptClassRec;
344
345 /* Declare and define vtables for classes */
346 #ifndef FT_CONFIG_OPTION_PIC
347
348 #define AF_DECLARE_SCRIPT_CLASS(script_class) \
349 FT_CALLBACK_TABLE const AF_ScriptClassRec \
350 script_class;
351
352 #define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \
353 m_init, m_scale, m_done, h_init, h_apply) \
354 FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec \
355 script_class = \
356 { \
357 script_, \
358 ranges, \
359 \
360 m_size, \
361 \
362 m_init, \
363 m_scale, \
364 m_done, \
365 \
366 h_init, \
367 h_apply \
368 };
369
370 #else
371
372 #define AF_DECLARE_SCRIPT_CLASS(script_class) \
373 FT_LOCAL(void) \
374 FT_Init_Class_##script_class(AF_ScriptClassRec* ac);
375
376 #define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \
377 m_init, m_scale, m_done, h_init, h_apply) \
378 FT_LOCAL_DEF(void) \
379 FT_Init_Class_##script_class(AF_ScriptClassRec* ac) \
380 { \
381 ac->script = script_; \
382 ac->script_uni_ranges = ranges; \
383 \
384 ac->script_metrics_size = m_size; \
385 \
386 ac->script_metrics_init = m_init; \
387 ac->script_metrics_scale = m_scale; \
388 ac->script_metrics_done = m_done; \
389 \
390 ac->script_hints_init = h_init; \
391 ac->script_hints_apply = h_apply; \
392 }
393 #endif
394
395
396 /* */
397
398 FT_END_HEADER
399
400 #endif /* __AFTYPES_H__ */
401
402
403 /* END */