• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
404