update for HEAD-2003050101
[reactos.git] / lib / freetype / src / pshinter / pshalgo3.h
1 /***************************************************************************/
2 /*                                                                         */
3 /*  pshalgo3.h                                                             */
4 /*                                                                         */
5 /*    PostScript hinting algorithm 3 (specification).                      */
6 /*                                                                         */
7 /*  Copyright 2001, 2002 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 __PSHALGO3_H__
20 #define __PSHALGO3_H__
21
22
23 #include "pshrec.h"
24 #include "pshglob.h"
25 #include FT_TRIGONOMETRY_H
26
27
28 FT_BEGIN_HEADER
29
30
31   /* handle to Hint structure */
32   typedef struct PSH3_HintRec_*  PSH3_Hint;
33
34   /* hint bit-flags */
35   typedef enum
36   {
37     PSH3_HINT_GHOST  = PS_HINT_FLAG_GHOST,
38     PSH3_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
39     PSH3_HINT_ACTIVE = 4,
40     PSH3_HINT_FITTED = 8
41
42   } PSH3_Hint_Flags;
43
44
45 #define psh3_hint_is_active( x )  ( ( (x)->flags & PSH3_HINT_ACTIVE ) != 0 )
46 #define psh3_hint_is_ghost( x )   ( ( (x)->flags & PSH3_HINT_GHOST  ) != 0 )
47 #define psh3_hint_is_fitted( x )  ( ( (x)->flags & PSH3_HINT_FITTED ) != 0 )
48
49 #define psh3_hint_activate( x )    (x)->flags |=  PSH3_HINT_ACTIVE
50 #define psh3_hint_deactivate( x )  (x)->flags &= ~PSH3_HINT_ACTIVE
51 #define psh3_hint_set_fitted( x )  (x)->flags |=  PSH3_HINT_FITTED
52
53   /* hint structure */
54   typedef struct  PSH3_HintRec_
55   {
56     FT_Int     org_pos;
57     FT_Int     org_len;
58     FT_Pos     cur_pos;
59     FT_Pos     cur_len;
60     FT_UInt    flags;
61     PSH3_Hint  parent;
62     FT_Int     order;
63
64   } PSH3_HintRec;
65
66
67   /* this is an interpolation zone used for strong points;  */
68   /* weak points are interpolated according to their strong */
69   /* neighbours                                             */
70   typedef struct  PSH3_ZoneRec_
71   {
72     FT_Fixed  scale;
73     FT_Fixed  delta;
74     FT_Pos    min;
75     FT_Pos    max;
76
77   } PSH3_ZoneRec, *PSH3_Zone;
78
79
80   typedef struct  PSH3_Hint_TableRec_
81   {
82     FT_UInt        max_hints;
83     FT_UInt        num_hints;
84     PSH3_Hint      hints;
85     PSH3_Hint*     sort;
86     PSH3_Hint*     sort_global;
87     FT_UInt        num_zones;
88     PSH3_ZoneRec*  zones;
89     PSH3_Zone      zone;
90     PS_Mask_Table  hint_masks;
91     PS_Mask_Table  counter_masks;
92
93   } PSH3_Hint_TableRec, *PSH3_Hint_Table;
94
95
96   typedef struct PSH3_PointRec_*    PSH3_Point;
97   typedef struct PSH3_ContourRec_*  PSH3_Contour;
98
99   enum
100   {
101     PSH3_DIR_NONE  =  4,
102     PSH3_DIR_UP    = -1,
103     PSH3_DIR_DOWN  =  1,
104     PSH3_DIR_LEFT  = -2,
105     PSH3_DIR_RIGHT =  2
106   };
107
108 #define PSH3_DIR_HORIZONTAL  2
109 #define PSH3_DIR_VERTICAL    1
110
111 #define PSH3_DIR_COMPARE( d1, d2 )  ( (d1) == (d2) || (d1) == -(d2) )
112 #define PSH3_DIR_IS_HORIZONTAL( d )  PSH3_DIR_COMPARE( d, PSH3_DIR_HORIZONTAL )
113 #define PSH3_DIR_IS_VERTICAL( d )    PSH3_DIR_COMPARE( d, PSH3_DIR_VERTICAL )
114
115
116  /* the following bit-flags are computed once by the glyph */
117  /* analyzer, for both dimensions                          */
118   enum
119   {
120     PSH3_POINT_OFF         = 1,   /* point is off the curve          */
121     PSH3_POINT_SMOOTH      = 2,   /* point is smooth                 */
122     PSH3_POINT_INFLEX      = 4    /* point is inflection             */
123   };
124
125 #define psh3_point_is_smooth( p )  ( (p)->flags & PSH3_POINT_SMOOTH )
126 #define psh3_point_is_off( p )     ( (p)->flags & PSH3_POINT_OFF    )
127 #define psh3_point_is_inflex( p )  ( (p)->flags & PSH3_POINT_INFLEX )
128
129 #define psh3_point_set_smooth( p )  (p)->flags |= PSH3_POINT_SMOOTH
130 #define psh3_point_set_off( p )     (p)->flags |= PSH3_POINT_OFF
131 #define psh3_point_set_inflex( p )  (p)->flags |= PSH3_POINT_INFLEX
132
133   /* the following bit-flags are re-computed for each dimension */
134   enum
135   {
136     PSH3_POINT_STRONG   = 16,   /* point is strong                             */
137     PSH3_POINT_FITTED   = 32,   /* point is already fitted                     */
138     PSH3_POINT_EXTREMUM = 64,   /* point is local extremum                     */
139     PSH3_POINT_POSITIVE = 128,  /* extremum has positive contour flow          */
140     PSH3_POINT_NEGATIVE = 256,  /* extremum has negative contour flow          */
141     PSH3_POINT_EDGE_MIN = 512,  /* point is aligned to left/bottom stem edge   */
142     PSH3_POINT_EDGE_MAX = 1024  /* point is aligned to top/right stem edge     */
143   };
144
145 #define psh3_point_is_strong( p )    ( (p)->flags2 & PSH3_POINT_STRONG )
146 #define psh3_point_is_fitted( p )    ( (p)->flags2 & PSH3_POINT_FITTED )
147 #define psh3_point_is_extremum( p )  ( (p)->flags2 & PSH3_POINT_EXTREMUM )
148 #define psh3_point_is_positive( p )  ( (p)->flags2 & PSH3_POINT_POSITIVE )
149 #define psh3_point_is_negative( p )  ( (p)->flags2 & PSH3_POINT_NEGATIVE )
150 #define psh3_point_is_edge_min( p )  ( (p)->flags2 & PSH3_POINT_EDGE_MIN )
151 #define psh3_point_is_edge_max( p )  ( (p)->flags2 & PSH3_POINT_EDGE_MAX )
152
153 #define psh3_point_set_strong( p )    (p)->flags2 |= PSH3_POINT_STRONG
154 #define psh3_point_set_fitted( p )    (p)->flags2 |= PSH3_POINT_FITTED
155 #define psh3_point_set_extremum( p )  (p)->flags2 |= PSH3_POINT_EXTREMUM
156 #define psh3_point_set_positive( p )  (p)->flags2 |= PSH3_POINT_POSITIVE
157 #define psh3_point_set_negative( p )  (p)->flags2 |= PSH3_POINT_NEGATIVE
158 #define psh3_point_set_edge_min( p )  (p)->flags2 |= PSH3_POINT_EDGE_MIN
159 #define psh3_point_set_edge_max( p )  (p)->flags2 |= PSH3_POINT_EDGE_MAX
160
161
162   typedef struct  PSH3_PointRec_
163   {
164     PSH3_Point    prev;
165     PSH3_Point    next;
166     PSH3_Contour  contour;
167     FT_UInt       flags;
168     FT_UInt       flags2;
169     FT_Char       dir_in;
170     FT_Char       dir_out;
171     FT_Angle      angle_in;
172     FT_Angle      angle_out;
173     PSH3_Hint     hint;
174     FT_Pos        org_u;
175     FT_Pos        org_v;
176     FT_Pos        cur_u;
177 #ifdef DEBUG_HINTER
178     FT_Pos        org_x;
179     FT_Pos        cur_x;
180     FT_Pos        org_y;
181     FT_Pos        cur_y;
182     FT_UInt       flags_x;
183     FT_UInt       flags_y;
184 #endif
185
186   } PSH3_PointRec;
187
188
189 #define PSH3_POINT_EQUAL_ORG( a, b )  ( (a)->org_u == (b)->org_u && \
190                                         (a)->org_v == (b)->org_v )
191
192 #define PSH3_POINT_ANGLE( a, b )  FT_Atan2( (b)->org_u - (a)->org_u,  \
193                                             (b)->org_v - (a)->org_v )
194
195   typedef struct  PSH3_ContourRec_
196   {
197     PSH3_Point  start;
198     FT_UInt     count;
199
200   } PSH3_ContourRec;
201
202
203   typedef struct  PSH3_GlyphRec_
204   {
205     FT_UInt             num_points;
206     FT_UInt             num_contours;
207
208     PSH3_Point          points;
209     PSH3_Contour        contours;
210
211     FT_Memory           memory;
212     FT_Outline*         outline;
213     PSH_Globals         globals;
214     PSH3_Hint_TableRec  hint_tables[2];
215
216     FT_Bool             vertical;
217     FT_Int              major_dir;
218     FT_Int              minor_dir;
219
220     FT_Bool             do_horz_hints;
221     FT_Bool             do_vert_hints;
222     FT_Bool             do_horz_snapping;
223     FT_Bool             do_vert_snapping;
224     FT_Bool             do_stem_adjust;
225
226   } PSH3_GlyphRec, *PSH3_Glyph;
227
228
229 #ifdef DEBUG_HINTER
230   extern PSH3_Hint_Table  ps3_debug_hint_table;
231
232   typedef void
233   (*PSH3_HintFunc)( PSH3_Hint  hint,
234                     FT_Bool    vertical );
235
236   extern PSH3_HintFunc    ps3_debug_hint_func;
237
238   extern PSH3_Glyph       ps3_debug_glyph;
239 #endif
240
241
242   extern FT_Error
243   ps3_hints_apply( PS_Hints        ps_hints,
244                    FT_Outline*     outline,
245                    PSH_Globals     globals,
246                    FT_Render_Mode  hint_mode );
247
248
249 FT_END_HEADER
250
251
252 #endif /* __PSHALGO3_H__ */
253
254
255 /* END */