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
46FT_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
60extern int    _af_debug_disable_horz_hints;
61extern int    _af_debug_disable_vert_hints;
62extern int    _af_debug_disable_blue_hints;
63extern 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
373FT_END_HEADER
374
375#endif /* __AFTYPES_H__ */
376
377
378/* END */
379