• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /***************************************************************************/
2 /*                                                                         */
3 /*  aftypes.h                                                              */
4 /*                                                                         */
5 /*    Auto-fitter types (specification only).                              */
6 /*                                                                         */
7 /*  Copyright 2003-2009, 2011-2012 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 #ifdef FT_DEBUG_AUTOFIT
57 
58 #include FT_CONFIG_STANDARD_LIBRARY_H
59 
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;
64 
65 #endif /* FT_DEBUG_AUTOFIT */
66 
67 
68   /*************************************************************************/
69   /*************************************************************************/
70   /*****                                                               *****/
71   /*****                 U T I L I T Y   S T U F F                     *****/
72   /*****                                                               *****/
73   /*************************************************************************/
74   /*************************************************************************/
75 
76   typedef struct  AF_WidthRec_
77   {
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 )
86   af_sort_pos( FT_UInt  count,
87                FT_Pos*  table );
88 
89   FT_LOCAL( void )
90   af_sort_and_quantize_widths( FT_UInt*  count,
91                                AF_Width  widths,
92                                FT_Pos    threshold );
93 
94 
95   /*************************************************************************/
96   /*************************************************************************/
97   /*****                                                               *****/
98   /*****                   A N G L E   T Y P E S                       *****/
99   /*****                                                               *****/
100   /*************************************************************************/
101   /*************************************************************************/
102 
103   /*
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).
107    */
108 
109   typedef FT_Int  AF_Angle;
110 
111 
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 )
116 
117 
118 #if 0
119   /*
120    *  compute the angle of a given 2-D vector
121    */
122   FT_LOCAL( AF_Angle )
123   af_angle_atan( FT_Pos  dx,
124                  FT_Pos  dy );
125 
126 
127   /*
128    *  compute `angle2 - angle1'; the result is always within
129    *  the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
130    */
131   FT_LOCAL( AF_Angle )
132   af_angle_diff( AF_Angle  angle1,
133                  AF_Angle  angle2 );
134 #endif /* 0 */
135 
136 
137 #define AF_ANGLE_DIFF( result, angle1, angle2 ) \
138   FT_BEGIN_STMNT                                \
139     AF_Angle  _delta = (angle2) - (angle1);     \
140                                                 \
141                                                 \
142     _delta %= AF_ANGLE_2PI;                     \
143     if ( _delta < 0 )                           \
144       _delta += AF_ANGLE_2PI;                   \
145                                                 \
146     if ( _delta > AF_ANGLE_PI )                 \
147       _delta -= AF_ANGLE_2PI;                   \
148                                                 \
149     result = _delta;                            \
150   FT_END_STMNT
151 
152 
153   /*  opaque handle to glyph-specific hints -- see `afhints.h' for more
154    *  details
155    */
156   typedef struct AF_GlyphHintsRec_*  AF_GlyphHints;
157 
158 
159   /*************************************************************************/
160   /*************************************************************************/
161   /*****                                                               *****/
162   /*****                       S C A L E R S                           *****/
163   /*****                                                               *****/
164   /*************************************************************************/
165   /*************************************************************************/
166 
167   /*
168    *  A scaler models the target pixel device that will receive the
169    *  auto-hinted glyph image.
170    */
171 
172   typedef enum  AF_ScalerFlags_
173   {
174     AF_SCALER_FLAG_NO_HORIZONTAL = 1,  /* disable horizontal hinting */
175     AF_SCALER_FLAG_NO_VERTICAL   = 2,  /* disable vertical hinting   */
176     AF_SCALER_FLAG_NO_ADVANCE    = 4   /* disable advance hinting    */
177 
178   } AF_ScalerFlags;
179 
180 
181   typedef struct  AF_ScalerRec_
182   {
183     FT_Face         face;        /* source font face                        */
184     FT_Fixed        x_scale;     /* from font units to 1/64th device pixels */
185     FT_Fixed        y_scale;     /* from font units to 1/64th device pixels */
186     FT_Pos          x_delta;     /* in 1/64th device pixels                 */
187     FT_Pos          y_delta;     /* in 1/64th device pixels                 */
188     FT_Render_Mode  render_mode; /* monochrome, anti-aliased, LCD, etc.     */
189     FT_UInt32       flags;       /* additional control flags, see above     */
190 
191   } AF_ScalerRec, *AF_Scaler;
192 
193 
194 #define AF_SCALER_EQUAL_SCALES( a, b )      \
195           ( (a)->x_scale == (b)->x_scale && \
196             (a)->y_scale == (b)->y_scale && \
197             (a)->x_delta == (b)->x_delta && \
198             (a)->y_delta == (b)->y_delta )
199 
200 
201   /*************************************************************************/
202   /*************************************************************************/
203   /*****                                                               *****/
204   /*****                       S C R I P T S                           *****/
205   /*****                                                               *****/
206   /*************************************************************************/
207   /*************************************************************************/
208 
209   /*
210    *  The list of known scripts.  Each different script corresponds to the
211    *  following information:
212    *
213    *   - A set of Unicode ranges to test whether the face supports the
214    *     script.
215    *
216    *   - A specific global analyzer that will compute global metrics
217    *     specific to the script.
218    *
219    *   - A specific glyph analyzer that will compute segments and
220    *     edges for each glyph covered by the script.
221    *
222    *   - A specific grid-fitting algorithm that will distort the
223    *     scaled glyph outline according to the results of the glyph
224    *     analyzer.
225    *
226    *  Note that a given analyzer and/or grid-fitting algorithm can be
227    *  used by more than one script.
228    */
229 
230   typedef enum  AF_Script_
231   {
232     AF_SCRIPT_DUMMY = 0,
233     AF_SCRIPT_LATIN = 1,
234     AF_SCRIPT_CJK   = 2,
235     AF_SCRIPT_INDIC = 3,
236 #ifdef FT_OPTION_AUTOFIT2
237     AF_SCRIPT_LATIN2 = 4,
238 #endif
239 
240     /* add new scripts here.  Don't forget to update the list in */
241     /* `afglobal.c'.                                             */
242 
243     AF_SCRIPT_MAX   /* do not remove */
244 
245   } AF_Script;
246 
247 
248   typedef struct AF_ScriptClassRec_ const*  AF_ScriptClass;
249   typedef struct AF_FaceGlobalsRec_*        AF_FaceGlobals;
250 
251   typedef struct  AF_ScriptMetricsRec_
252   {
253     AF_ScriptClass  clazz;
254     AF_ScalerRec    scaler;
255     FT_Bool         digits_have_same_width;
256 
257     AF_FaceGlobals  globals;    /* to access properties */
258 
259   } AF_ScriptMetricsRec, *AF_ScriptMetrics;
260 
261 
262   /*  This function parses an FT_Face to compute global metrics for
263    *  a specific script.
264    */
265   typedef FT_Error
266   (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics  metrics,
267                                 FT_Face           face );
268 
269   typedef void
270   (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics  metrics,
271                                  AF_Scaler         scaler );
272 
273   typedef void
274   (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics  metrics );
275 
276 
277   typedef FT_Error
278   (*AF_Script_InitHintsFunc)( AF_GlyphHints     hints,
279                               AF_ScriptMetrics  metrics );
280 
281   typedef void
282   (*AF_Script_ApplyHintsFunc)( AF_GlyphHints     hints,
283                                FT_Outline*       outline,
284                                AF_ScriptMetrics  metrics );
285 
286 
287   typedef struct  AF_Script_UniRangeRec_
288   {
289     FT_UInt32  first;
290     FT_UInt32  last;
291 
292   } AF_Script_UniRangeRec;
293 
294 #define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
295 
296   typedef const AF_Script_UniRangeRec  *AF_Script_UniRange;
297 
298 
299   typedef struct  AF_ScriptClassRec_
300   {
301     AF_Script           script;
302     AF_Script_UniRange  script_uni_ranges; /* last must be { 0, 0 }        */
303     FT_UInt32           standard_char;     /* for default width and height */
304 
305     FT_Offset                   script_metrics_size;
306     AF_Script_InitMetricsFunc   script_metrics_init;
307     AF_Script_ScaleMetricsFunc  script_metrics_scale;
308     AF_Script_DoneMetricsFunc   script_metrics_done;
309 
310     AF_Script_InitHintsFunc     script_hints_init;
311     AF_Script_ApplyHintsFunc    script_hints_apply;
312 
313   } AF_ScriptClassRec;
314 
315 
316   /* Declare and define vtables for classes */
317 #ifndef FT_CONFIG_OPTION_PIC
318 
319 #define AF_DECLARE_SCRIPT_CLASS( script_class ) \
320   FT_CALLBACK_TABLE const AF_ScriptClassRec     \
321   script_class;
322 
323 #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char,   \
324                                 m_size,                                    \
325                                 m_init, m_scale, m_done, h_init, h_apply ) \
326   FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec  script_class =            \
327   {                                                                        \
328     script_,                                                               \
329     ranges,                                                                \
330     def_char,                                                              \
331                                                                            \
332     m_size,                                                                \
333                                                                            \
334     m_init,                                                                \
335     m_scale,                                                               \
336     m_done,                                                                \
337                                                                            \
338     h_init,                                                                \
339     h_apply                                                                \
340   };
341 
342 #else /* FT_CONFIG_OPTION_PIC */
343 
344 #define AF_DECLARE_SCRIPT_CLASS( script_class )             \
345   FT_LOCAL( void )                                          \
346   FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac );
347 
348 #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char,   \
349                                 m_size,                                    \
350                                 m_init, m_scale, m_done, h_init, h_apply ) \
351   FT_LOCAL_DEF( void )                                                     \
352   FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac )                 \
353   {                                                                        \
354     ac->script               = script_;                                    \
355     ac->script_uni_ranges    = ranges;                                     \
356     ac->default_char         = def_char;                                   \
357                                                                            \
358     ac->script_metrics_size  = m_size;                                     \
359                                                                            \
360     ac->script_metrics_init  = m_init;                                     \
361     ac->script_metrics_scale = m_scale;                                    \
362     ac->script_metrics_done  = m_done;                                     \
363                                                                            \
364     ac->script_hints_init    = h_init;                                     \
365     ac->script_hints_apply   = h_apply;                                    \
366   }
367 
368 #endif /* FT_CONFIG_OPTION_PIC */
369 
370 
371 /* */
372 
373 FT_END_HEADER
374 
375 #endif /* __AFTYPES_H__ */
376 
377 
378 /* END */
379