source: trunk/poppler/freetype2/src/autofit/aftypes.h @ 165

Last change on this file since 165 was 165, checked in by Eugene Romanenko, 15 years ago

update to latest freetype cvs, (closes #76)

File size: 12.3 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  aftypes.h                                                              */
4/*                                                                         */
5/*    Auto-fitter types (specification only).                              */
6/*                                                                         */
7/*  Copyright 2003, 2004, 2005, 2006 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 compartimentized 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#define xxAF_USE_WARPER  /* only define to use warp hinting */
57#define AF_DEBUG
58
59#ifdef AF_DEBUG
60
61#include <stdio.h>
62#define AF_LOG( x )  do { if ( _af_debug ) printf x; } while ( 0 )
63
64extern int    _af_debug;
65extern int    _af_debug_disable_horz_hints;
66extern int    _af_debug_disable_vert_hints;
67extern int    _af_debug_disable_blue_hints;
68extern void*  _af_debug_hints;
69
70#else /* !AF_DEBUG */
71
72#define AF_LOG( x )  do ; while ( 0 )        /* nothing */
73
74#endif /* !AF_DEBUG */
75
76
77  /*************************************************************************/
78  /*************************************************************************/
79  /*****                                                               *****/
80  /*****                 U T I L I T Y   S T U F F                     *****/
81  /*****                                                               *****/
82  /*************************************************************************/
83  /*************************************************************************/
84
85  typedef struct  AF_WidthRec_
86  {
87    FT_Pos  org;  /* original position/width in font units              */
88    FT_Pos  cur;  /* current/scaled position/width in device sub-pixels */
89    FT_Pos  fit;  /* current/fitted position/width in device sub-pixels */
90
91  } AF_WidthRec, *AF_Width;
92
93
94  FT_LOCAL( void )
95  af_sort_pos( FT_UInt  count,
96               FT_Pos*  table );
97
98  FT_LOCAL( void )
99  af_sort_widths( FT_UInt   count,
100                  AF_Width  widths );
101
102
103  /*************************************************************************/
104  /*************************************************************************/
105  /*****                                                               *****/
106  /*****                   A N G L E   T Y P E S                       *****/
107  /*****                                                               *****/
108  /*************************************************************************/
109  /*************************************************************************/
110
111  /*
112   *  The auto-fitter doesn't need a very high angular accuracy;
113   *  this allows us to speed up some computations considerably with a
114   *  light Cordic algorithm (see afangles.c).
115   */
116
117  typedef FT_Int  AF_Angle;
118
119
120#define AF_ANGLE_PI   256
121#define AF_ANGLE_2PI  ( AF_ANGLE_PI * 2 )
122#define AF_ANGLE_PI2  ( AF_ANGLE_PI / 2 )
123#define AF_ANGLE_PI4  ( AF_ANGLE_PI / 4 )
124
125
126#if 0
127  /*
128   *  compute the angle of a given 2-D vector
129   */
130  FT_LOCAL( AF_Angle )
131  af_angle_atan( FT_Pos  dx,
132                 FT_Pos  dy );
133
134
135  /*
136   *  compute `angle2 - angle1'; the result is always within
137   *  the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
138   */
139  FT_LOCAL( AF_Angle )
140  af_angle_diff( AF_Angle  angle1,
141                 AF_Angle  angle2 );
142#endif /* 0 */
143
144
145#define AF_ANGLE_DIFF( result, angle1, angle2 ) \
146  FT_BEGIN_STMNT                                \
147    AF_Angle  _delta = (angle2) - (angle1);     \
148                                                \
149                                                \
150    _delta %= AF_ANGLE_2PI;                     \
151    if ( _delta < 0 )                           \
152      _delta += AF_ANGLE_2PI;                   \
153                                                \
154    if ( _delta > AF_ANGLE_PI )                 \
155      _delta -= AF_ANGLE_2PI;                   \
156                                                \
157    result = _delta;                            \
158  FT_END_STMNT
159
160
161  /*************************************************************************/
162  /*************************************************************************/
163  /*****                                                               *****/
164  /*****                    O U T L I N E S                            *****/
165  /*****                                                               *****/
166  /*************************************************************************/
167  /*************************************************************************/
168
169  /*  opaque handle to glyph-specific hints -- see `afhints.h' for more
170   *  details
171   */
172  typedef struct AF_GlyphHintsRec_*  AF_GlyphHints;
173
174  /*  This structure is used to model an input glyph outline to
175   *  the auto-hinter.  The latter will set the `hints' field
176   *  depending on the glyph's script.
177   */
178  typedef struct  AF_OutlineRec_
179  {
180    FT_Face        face;
181    FT_Outline     outline;
182    FT_UInt        outline_resolution;
183
184    FT_Int         advance;
185    FT_UInt        metrics_resolution;
186
187    AF_GlyphHints  hints;
188
189  } AF_OutlineRec;
190
191
192  /*************************************************************************/
193  /*************************************************************************/
194  /*****                                                               *****/
195  /*****                       S C A L E R S                           *****/
196  /*****                                                               *****/
197  /*************************************************************************/
198  /*************************************************************************/
199
200  /*
201   *  A scaler models the target pixel device that will receive the
202   *  auto-hinted glyph image.
203   */
204
205  typedef enum
206  {
207    AF_SCALER_FLAG_NO_HORIZONTAL = 1,  /* disable horizontal hinting */
208    AF_SCALER_FLAG_NO_VERTICAL   = 2,  /* disable vertical hinting   */
209    AF_SCALER_FLAG_NO_ADVANCE    = 4   /* disable advance hinting    */
210
211  } AF_ScalerFlags;
212
213
214  typedef struct  AF_ScalerRec_
215  {
216    FT_Face         face;        /* source font face                        */
217    FT_Fixed        x_scale;     /* from font units to 1/64th device pixels */
218    FT_Fixed        y_scale;     /* from font units to 1/64th device pixels */
219    FT_Pos          x_delta;     /* in 1/64th device pixels                 */
220    FT_Pos          y_delta;     /* in 1/64th device pixels                 */
221    FT_Render_Mode  render_mode; /* monochrome, anti-aliased, LCD, etc.     */
222    FT_UInt32       flags;       /* additional control flags, see above     */
223
224  } AF_ScalerRec, *AF_Scaler;
225
226
227#define AF_SCALER_EQUAL_SCALES( a, b )      \
228          ( (a)->x_scale == (b)->x_scale && \
229            (a)->y_scale == (b)->y_scale && \
230            (a)->x_delta == (b)->x_delta && \
231            (a)->y_delta == (b)->y_delta )
232
233
234  /*************************************************************************/
235  /*************************************************************************/
236  /*****                                                               *****/
237  /*****                       S C R I P T S                           *****/
238  /*****                                                               *****/
239  /*************************************************************************/
240  /*************************************************************************/
241
242  /*
243   *  The list of know scripts.  Each different script corresponds to the
244   *  following information:
245   *
246   *   - A set of Unicode ranges to test whether the face supports the
247   *     script.
248   *
249   *   - A specific global analyzer that will compute global metrics
250   *     specific to the script.
251   *
252   *   - A specific glyph analyzer that will compute segments and
253   *     edges for each glyph covered by the script.
254   *
255   *   - A specific grid-fitting algorithm that will distort the
256   *     scaled glyph outline according to the results of the glyph
257   *     analyzer.
258   *
259   *  Note that a given analyzer and/or grid-fitting algorithm can be
260   *  used by more than one script.
261   */
262
263  typedef enum
264  {
265    AF_SCRIPT_NONE  = 0,
266    AF_SCRIPT_LATIN = 1,
267    AF_SCRIPT_CJK   = 2,
268    /* add new scripts here.  Don't forget to update the list in */
269    /* `afglobal.c'.                                             */
270
271    AF_SCRIPT_MAX   /* do not remove */
272
273  } AF_Script;
274
275
276  typedef struct AF_ScriptClassRec_ const*  AF_ScriptClass;
277
278  typedef struct  AF_ScriptMetricsRec_
279  {
280    AF_ScriptClass  clazz;
281    AF_ScalerRec    scaler;
282
283  } AF_ScriptMetricsRec, *AF_ScriptMetrics;
284
285
286  /*  This function parses an FT_Face to compute global metrics for
287   *  a specific script.
288   */
289  typedef FT_Error
290  (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics  metrics,
291                                FT_Face           face );
292
293  typedef void
294  (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics  metrics,
295                                 AF_Scaler         scaler );
296
297  typedef void
298  (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics  metrics );
299
300
301  typedef FT_Error
302  (*AF_Script_InitHintsFunc)( AF_GlyphHints     hints,
303                              AF_ScriptMetrics  metrics );
304
305  typedef void
306  (*AF_Script_ApplyHintsFunc)( AF_GlyphHints     hints,
307                               FT_Outline*       outline,
308                               AF_ScriptMetrics  metrics );
309
310
311  typedef struct  AF_Script_UniRangeRec_
312  {
313    FT_UInt32  first;
314    FT_UInt32  last;
315
316  } AF_Script_UniRangeRec;
317
318  typedef const AF_Script_UniRangeRec  *AF_Script_UniRange;
319
320
321  typedef struct  AF_ScriptClassRec_
322  {
323    AF_Script                   script;
324    AF_Script_UniRange          script_uni_ranges; /* last must be { 0, 0 } */
325
326    FT_UInt                     script_metrics_size;
327    AF_Script_InitMetricsFunc   script_metrics_init;
328    AF_Script_ScaleMetricsFunc  script_metrics_scale;
329    AF_Script_DoneMetricsFunc   script_metrics_done;
330
331    AF_Script_InitHintsFunc     script_hints_init;
332    AF_Script_ApplyHintsFunc    script_hints_apply;
333
334  } AF_ScriptClassRec;
335
336
337/* */
338
339FT_END_HEADER
340
341#endif /* __AFTYPES_H__ */
342
343
344/* END */
Note: See TracBrowser for help on using the repository browser.