Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 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 
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 */