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