• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /***************************************************************************/
2 /*                                                                         */
3 /*  afhints.h                                                              */
4 /*                                                                         */
5 /*    Auto-fitter hinting routines (specification).                        */
6 /*                                                                         */
7 /*  Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2010 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 #ifndef __AFHINTS_H__
20 #define __AFHINTS_H__
21 
22 #include "aftypes.h"
23 
24 #define xxAF_SORT_SEGMENTS
25 
26 FT_BEGIN_HEADER
27 
28  /*
29   *  The definition of outline glyph hints.  These are shared by all
30   *  script analysis routines (until now).
31   */
32 
33   typedef enum  AF_Dimension_
34   {
35     AF_DIMENSION_HORZ = 0,  /* x coordinates,                    */
36                             /* i.e., vertical segments & edges   */
37     AF_DIMENSION_VERT = 1,  /* y coordinates,                    */
38                             /* i.e., horizontal segments & edges */
39 
40     AF_DIMENSION_MAX  /* do not remove */
41 
42   } AF_Dimension;
43 
44 
45   /* hint directions -- the values are computed so that two vectors are */
46   /* in opposite directions iff `dir1 + dir2 == 0'                      */
47   typedef enum  AF_Direction_
48   {
49     AF_DIR_NONE  =  4,
50     AF_DIR_RIGHT =  1,
51     AF_DIR_LEFT  = -1,
52     AF_DIR_UP    =  2,
53     AF_DIR_DOWN  = -2
54 
55   } AF_Direction;
56 
57 
58   /* point hint flags */
59   typedef enum  AF_Flags_
60   {
61     AF_FLAG_NONE = 0,
62 
63     /* point type flags */
64     AF_FLAG_CONIC   = 1 << 0,
65     AF_FLAG_CUBIC   = 1 << 1,
66     AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC,
67 
68     /* point extremum flags */
69     AF_FLAG_EXTREMA_X = 1 << 2,
70     AF_FLAG_EXTREMA_Y = 1 << 3,
71 
72     /* point roundness flags */
73     AF_FLAG_ROUND_X = 1 << 4,
74     AF_FLAG_ROUND_Y = 1 << 5,
75 
76     /* point touch flags */
77     AF_FLAG_TOUCH_X = 1 << 6,
78     AF_FLAG_TOUCH_Y = 1 << 7,
79 
80     /* candidates for weak interpolation have this flag set */
81     AF_FLAG_WEAK_INTERPOLATION = 1 << 8,
82 
83     /* all inflection points in the outline have this flag set */
84     AF_FLAG_INFLECTION = 1 << 9
85 
86   } AF_Flags;
87 
88 
89   /* edge hint flags */
90   typedef enum  AF_Edge_Flags_
91   {
92     AF_EDGE_NORMAL = 0,
93     AF_EDGE_ROUND  = 1 << 0,
94     AF_EDGE_SERIF  = 1 << 1,
95     AF_EDGE_DONE   = 1 << 2
96 
97   } AF_Edge_Flags;
98 
99 
100   typedef struct AF_PointRec_*    AF_Point;
101   typedef struct AF_SegmentRec_*  AF_Segment;
102   typedef struct AF_EdgeRec_*     AF_Edge;
103 
104 
105   typedef struct  AF_PointRec_
106   {
107     FT_UShort  flags;    /* point flags used by hinter   */
108     FT_Char    in_dir;   /* direction of inwards vector  */
109     FT_Char    out_dir;  /* direction of outwards vector */
110 
111     FT_Pos     ox, oy;   /* original, scaled position                   */
112     FT_Short   fx, fy;   /* original, unscaled position (font units)    */
113     FT_Pos     x, y;     /* current position                            */
114     FT_Pos     u, v;     /* current (x,y) or (y,x) depending on context */
115 
116     AF_Point   next;     /* next point in contour     */
117     AF_Point   prev;     /* previous point in contour */
118 
119   } AF_PointRec;
120 
121 
122   typedef struct  AF_SegmentRec_
123   {
124     FT_Byte     flags;       /* edge/segment flags for this segment */
125     FT_Char     dir;         /* segment direction                   */
126     FT_Short    pos;         /* position of segment                 */
127     FT_Short    min_coord;   /* minimum coordinate of segment       */
128     FT_Short    max_coord;   /* maximum coordinate of segment       */
129     FT_Short    height;      /* the hinted segment height           */
130 
131     AF_Edge     edge;        /* the segment's parent edge           */
132     AF_Segment  edge_next;   /* link to next segment in parent edge */
133 
134     AF_Segment  link;        /* (stem) link segment        */
135     AF_Segment  serif;       /* primary segment for serifs */
136     FT_Pos      num_linked;  /* number of linked segments  */
137     FT_Pos      score;       /* used during stem matching  */
138     FT_Pos      len;         /* used during stem matching  */
139 
140     AF_Point    first;       /* first point in edge segment             */
141     AF_Point    last;        /* last point in edge segment              */
142     AF_Point*   contour;     /* ptr to first point of segment's contour */
143 
144   } AF_SegmentRec;
145 
146 
147   typedef struct  AF_EdgeRec_
148   {
149     FT_Short    fpos;       /* original, unscaled position (font units) */
150     FT_Pos      opos;       /* original, scaled position                */
151     FT_Pos      pos;        /* current position                         */
152 
153     FT_Byte     flags;      /* edge flags                                   */
154     FT_Char     dir;        /* edge direction                               */
155     FT_Fixed    scale;      /* used to speed up interpolation between edges */
156     AF_Width    blue_edge;  /* non-NULL if this is a blue edge              */
157 
158     AF_Edge     link;
159     AF_Edge     serif;
160     FT_Short    num_linked;
161 
162     FT_Int      score;
163 
164     AF_Segment  first;
165     AF_Segment  last;
166 
167   } AF_EdgeRec;
168 
169 
170   typedef struct  AF_AxisHintsRec_
171   {
172     FT_Int        num_segments;
173     FT_Int        max_segments;
174     AF_Segment    segments;
175 #ifdef AF_SORT_SEGMENTS
176     FT_Int        mid_segments;
177 #endif
178 
179     FT_Int        num_edges;
180     FT_Int        max_edges;
181     AF_Edge       edges;
182 
183     AF_Direction  major_dir;
184 
185   } AF_AxisHintsRec, *AF_AxisHints;
186 
187 
188   typedef struct  AF_GlyphHintsRec_
189   {
190     FT_Memory         memory;
191 
192     FT_Fixed          x_scale;
193     FT_Pos            x_delta;
194 
195     FT_Fixed          y_scale;
196     FT_Pos            y_delta;
197 
198     FT_Pos            edge_distance_threshold;
199 
200     FT_Int            max_points;
201     FT_Int            num_points;
202     AF_Point          points;
203 
204     FT_Int            max_contours;
205     FT_Int            num_contours;
206     AF_Point*         contours;
207 
208     AF_AxisHintsRec   axis[AF_DIMENSION_MAX];
209 
210     FT_UInt32         scaler_flags;  /* copy of scaler flags     */
211     FT_UInt32         other_flags;   /* free for script-specific */
212                                      /* implementations          */
213     AF_ScriptMetrics  metrics;
214 
215     FT_Pos            xmin_delta;    /* used for warping */
216     FT_Pos            xmax_delta;
217 
218   } AF_GlyphHintsRec;
219 
220 
221 #define AF_HINTS_TEST_SCALER( h, f )  ( (h)->scaler_flags & (f) )
222 #define AF_HINTS_TEST_OTHER( h, f )   ( (h)->other_flags  & (f) )
223 
224 
225 #ifdef AF_DEBUG
226 
227 #define AF_HINTS_DO_HORIZONTAL( h )                                     \
228           ( !_af_debug_disable_horz_hints                            && \
229             !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) )
230 
231 #define AF_HINTS_DO_VERTICAL( h )                                     \
232           ( !_af_debug_disable_vert_hints                          && \
233             !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) )
234 
235 #define AF_HINTS_DO_ADVANCE( h )                                \
236           !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )
237 
238 #define AF_HINTS_DO_BLUES( h )  ( !_af_debug_disable_blue_hints )
239 
240 #else /* !AF_DEBUG */
241 
242 #define AF_HINTS_DO_HORIZONTAL( h )                                \
243           !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL )
244 
245 #define AF_HINTS_DO_VERTICAL( h )                                \
246           !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL )
247 
248 #define AF_HINTS_DO_ADVANCE( h )                                \
249           !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )
250 
251 #define AF_HINTS_DO_BLUES( h )  1
252 
253 #endif /* !AF_DEBUG */
254 
255 
256   FT_LOCAL( AF_Direction )
257   af_direction_compute( FT_Pos  dx,
258                         FT_Pos  dy );
259 
260 
261   FT_LOCAL( FT_Error )
262   af_axis_hints_new_segment( AF_AxisHints  axis,
263                              FT_Memory     memory,
264                              AF_Segment   *asegment );
265 
266   FT_LOCAL( FT_Error)
267   af_axis_hints_new_edge( AF_AxisHints  axis,
268                           FT_Int        fpos,
269                           AF_Direction  dir,
270                           FT_Memory     memory,
271                           AF_Edge      *edge );
272 
273   FT_LOCAL( void )
274   af_glyph_hints_init( AF_GlyphHints  hints,
275                        FT_Memory      memory );
276 
277 
278 
279   /*
280    *  recompute all AF_Point in a AF_GlyphHints from the definitions
281    *  in a source outline
282    */
283   FT_LOCAL( void )
284   af_glyph_hints_rescale( AF_GlyphHints     hints,
285                           AF_ScriptMetrics  metrics );
286 
287   FT_LOCAL( FT_Error )
288   af_glyph_hints_reload( AF_GlyphHints  hints,
289                          FT_Outline*    outline );
290 
291   FT_LOCAL( void )
292   af_glyph_hints_save( AF_GlyphHints  hints,
293                        FT_Outline*    outline );
294 
295   FT_LOCAL( void )
296   af_glyph_hints_align_edge_points( AF_GlyphHints  hints,
297                                     AF_Dimension   dim );
298 
299   FT_LOCAL( void )
300   af_glyph_hints_align_strong_points( AF_GlyphHints  hints,
301                                       AF_Dimension   dim );
302 
303   FT_LOCAL( void )
304   af_glyph_hints_align_weak_points( AF_GlyphHints  hints,
305                                     AF_Dimension   dim );
306 
307 #ifdef AF_USE_WARPER
308   FT_LOCAL( void )
309   af_glyph_hints_scale_dim( AF_GlyphHints  hints,
310                             AF_Dimension   dim,
311                             FT_Fixed       scale,
312                             FT_Pos         delta );
313 #endif
314 
315   FT_LOCAL( void )
316   af_glyph_hints_done( AF_GlyphHints  hints );
317 
318 /* */
319 
320 #define AF_SEGMENT_LEN( seg )          ( (seg)->max_coord - (seg)->min_coord )
321 
322 #define AF_SEGMENT_DIST( seg1, seg2 )  ( ( (seg1)->pos > (seg2)->pos )   \
323                                            ? (seg1)->pos - (seg2)->pos   \
324                                            : (seg2)->pos - (seg1)->pos )
325 
326 
327 FT_END_HEADER
328 
329 #endif /* __AFHINTS_H__ */
330 
331 
332 /* END */
333