PageRenderTime 49ms CodeModel.GetById 10ms app.highlight 31ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/freetype2/src/autofit/aftypes.h

http://github.com/zpao/v8monkey
C Header | 403 lines | 187 code | 93 blank | 123 comment | 12 complexity | 3568e69752b08f6dda71130127a85296 MD5 | raw file
  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
 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 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
 65extern int    _af_debug;
 66extern int    _af_debug_disable_horz_hints;
 67extern int    _af_debug_disable_vert_hints;
 68extern int    _af_debug_disable_blue_hints;
 69extern 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
398FT_END_HEADER
399
400#endif /* __AFTYPES_H__ */
401
402
403/* END */