xref: /inferno-os/libfreetype/pshalgo2.h (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  pshalgo2.h                                                             */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    PostScript hinting algorithm 2 (specification).                      */
6*37da2899SCharles.Forsyth /*                                                                         */
7*37da2899SCharles.Forsyth /*  Copyright 2001 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 __PSHALGO2_H__
20*37da2899SCharles.Forsyth #define __PSHALGO2_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   typedef struct PSH2_HintRec_*  PSH2_Hint;
32*37da2899SCharles.Forsyth 
33*37da2899SCharles.Forsyth   typedef enum
34*37da2899SCharles.Forsyth   {
35*37da2899SCharles.Forsyth     PSH2_HINT_GHOST  = PS_HINT_FLAG_GHOST,
36*37da2899SCharles.Forsyth     PSH2_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
37*37da2899SCharles.Forsyth     PSH2_HINT_ACTIVE = 4,
38*37da2899SCharles.Forsyth     PSH2_HINT_FITTED = 8
39*37da2899SCharles.Forsyth 
40*37da2899SCharles.Forsyth   } PSH2_Hint_Flags;
41*37da2899SCharles.Forsyth 
42*37da2899SCharles.Forsyth 
43*37da2899SCharles.Forsyth #define psh2_hint_is_active( x )  ( ( (x)->flags & PSH2_HINT_ACTIVE ) != 0 )
44*37da2899SCharles.Forsyth #define psh2_hint_is_ghost( x )   ( ( (x)->flags & PSH2_HINT_GHOST  ) != 0 )
45*37da2899SCharles.Forsyth #define psh2_hint_is_fitted( x )  ( ( (x)->flags & PSH2_HINT_FITTED ) != 0 )
46*37da2899SCharles.Forsyth 
47*37da2899SCharles.Forsyth #define psh2_hint_activate( x )    (x)->flags |=  PSH2_HINT_ACTIVE
48*37da2899SCharles.Forsyth #define psh2_hint_deactivate( x )  (x)->flags &= ~PSH2_HINT_ACTIVE
49*37da2899SCharles.Forsyth #define psh2_hint_set_fitted( x )  (x)->flags |=  PSH2_HINT_FITTED
50*37da2899SCharles.Forsyth 
51*37da2899SCharles.Forsyth 
52*37da2899SCharles.Forsyth   typedef struct  PSH2_HintRec_
53*37da2899SCharles.Forsyth   {
54*37da2899SCharles.Forsyth     FT_Int     org_pos;
55*37da2899SCharles.Forsyth     FT_Int     org_len;
56*37da2899SCharles.Forsyth     FT_Pos     cur_pos;
57*37da2899SCharles.Forsyth     FT_Pos     cur_len;
58*37da2899SCharles.Forsyth     FT_UInt    flags;
59*37da2899SCharles.Forsyth     PSH2_Hint  parent;
60*37da2899SCharles.Forsyth     FT_Int     order;
61*37da2899SCharles.Forsyth 
62*37da2899SCharles.Forsyth   } PSH2_HintRec;
63*37da2899SCharles.Forsyth 
64*37da2899SCharles.Forsyth 
65*37da2899SCharles.Forsyth   /* this is an interpolation zone used for strong points;  */
66*37da2899SCharles.Forsyth   /* weak points are interpolated according to their strong */
67*37da2899SCharles.Forsyth   /* neighbours                                             */
68*37da2899SCharles.Forsyth   typedef struct  PSH2_ZoneRec_
69*37da2899SCharles.Forsyth   {
70*37da2899SCharles.Forsyth     FT_Fixed  scale;
71*37da2899SCharles.Forsyth     FT_Fixed  delta;
72*37da2899SCharles.Forsyth     FT_Pos    min;
73*37da2899SCharles.Forsyth     FT_Pos    max;
74*37da2899SCharles.Forsyth 
75*37da2899SCharles.Forsyth   } PSH2_ZoneRec, *PSH2_Zone;
76*37da2899SCharles.Forsyth 
77*37da2899SCharles.Forsyth 
78*37da2899SCharles.Forsyth   typedef struct  PSH2_Hint_TableRec_
79*37da2899SCharles.Forsyth   {
80*37da2899SCharles.Forsyth     FT_UInt        max_hints;
81*37da2899SCharles.Forsyth     FT_UInt        num_hints;
82*37da2899SCharles.Forsyth     PSH2_Hint      hints;
83*37da2899SCharles.Forsyth     PSH2_Hint*     sort;
84*37da2899SCharles.Forsyth     PSH2_Hint*     sort_global;
85*37da2899SCharles.Forsyth     FT_UInt        num_zones;
86*37da2899SCharles.Forsyth     PSH2_Zone      zones;
87*37da2899SCharles.Forsyth     PSH2_Zone      zone;
88*37da2899SCharles.Forsyth     PS_Mask_Table  hint_masks;
89*37da2899SCharles.Forsyth     PS_Mask_Table  counter_masks;
90*37da2899SCharles.Forsyth 
91*37da2899SCharles.Forsyth   } PSH2_Hint_TableRec, *PSH2_Hint_Table;
92*37da2899SCharles.Forsyth 
93*37da2899SCharles.Forsyth 
94*37da2899SCharles.Forsyth   typedef struct PSH2_PointRec_*    PSH2_Point;
95*37da2899SCharles.Forsyth   typedef struct PSH2_ContourRec_*  PSH2_Contour;
96*37da2899SCharles.Forsyth 
97*37da2899SCharles.Forsyth   enum
98*37da2899SCharles.Forsyth   {
99*37da2899SCharles.Forsyth     PSH2_DIR_NONE  =  4,
100*37da2899SCharles.Forsyth     PSH2_DIR_UP    =  1,
101*37da2899SCharles.Forsyth     PSH2_DIR_DOWN  = -1,
102*37da2899SCharles.Forsyth     PSH2_DIR_LEFT  = -2,
103*37da2899SCharles.Forsyth     PSH2_DIR_RIGHT =  2
104*37da2899SCharles.Forsyth   };
105*37da2899SCharles.Forsyth 
106*37da2899SCharles.Forsyth   enum
107*37da2899SCharles.Forsyth   {
108*37da2899SCharles.Forsyth     PSH2_POINT_OFF    = 1,   /* point is off the curve  */
109*37da2899SCharles.Forsyth     PSH2_POINT_STRONG = 2,   /* point is strong         */
110*37da2899SCharles.Forsyth     PSH2_POINT_SMOOTH = 4,   /* point is smooth         */
111*37da2899SCharles.Forsyth     PSH2_POINT_FITTED = 8    /* point is already fitted */
112*37da2899SCharles.Forsyth   };
113*37da2899SCharles.Forsyth 
114*37da2899SCharles.Forsyth 
115*37da2899SCharles.Forsyth   typedef struct  PSH2_PointRec_
116*37da2899SCharles.Forsyth   {
117*37da2899SCharles.Forsyth     PSH2_Point    prev;
118*37da2899SCharles.Forsyth     PSH2_Point    next;
119*37da2899SCharles.Forsyth     PSH2_Contour  contour;
120*37da2899SCharles.Forsyth     FT_UInt       flags;
121*37da2899SCharles.Forsyth     FT_Char       dir_in;
122*37da2899SCharles.Forsyth     FT_Char       dir_out;
123*37da2899SCharles.Forsyth     FT_Angle      angle_in;
124*37da2899SCharles.Forsyth     FT_Angle      angle_out;
125*37da2899SCharles.Forsyth     PSH2_Hint     hint;
126*37da2899SCharles.Forsyth     FT_Pos        org_u;
127*37da2899SCharles.Forsyth     FT_Pos        cur_u;
128*37da2899SCharles.Forsyth #ifdef DEBUG_HINTER
129*37da2899SCharles.Forsyth     FT_Pos        org_x;
130*37da2899SCharles.Forsyth     FT_Pos        cur_x;
131*37da2899SCharles.Forsyth     FT_Pos        org_y;
132*37da2899SCharles.Forsyth     FT_Pos        cur_y;
133*37da2899SCharles.Forsyth     FT_UInt       flags_x;
134*37da2899SCharles.Forsyth     FT_UInt       flags_y;
135*37da2899SCharles.Forsyth #endif
136*37da2899SCharles.Forsyth 
137*37da2899SCharles.Forsyth   } PSH2_PointRec;
138*37da2899SCharles.Forsyth 
139*37da2899SCharles.Forsyth 
140*37da2899SCharles.Forsyth #define psh2_point_is_strong( p )   ( (p)->flags & PSH2_POINT_STRONG )
141*37da2899SCharles.Forsyth #define psh2_point_is_fitted( p )   ( (p)->flags & PSH2_POINT_FITTED )
142*37da2899SCharles.Forsyth #define psh2_point_is_smooth( p )   ( (p)->flags & PSH2_POINT_SMOOTH )
143*37da2899SCharles.Forsyth 
144*37da2899SCharles.Forsyth #define psh2_point_set_strong( p )  (p)->flags |= PSH2_POINT_STRONG
145*37da2899SCharles.Forsyth #define psh2_point_set_fitted( p )  (p)->flags |= PSH2_POINT_FITTED
146*37da2899SCharles.Forsyth #define psh2_point_set_smooth( p )  (p)->flags |= PSH2_POINT_SMOOTH
147*37da2899SCharles.Forsyth 
148*37da2899SCharles.Forsyth 
149*37da2899SCharles.Forsyth   typedef struct  PSH2_ContourRec_
150*37da2899SCharles.Forsyth   {
151*37da2899SCharles.Forsyth     PSH2_Point  start;
152*37da2899SCharles.Forsyth     FT_UInt     count;
153*37da2899SCharles.Forsyth 
154*37da2899SCharles.Forsyth   } PSH2_ContourRec;
155*37da2899SCharles.Forsyth 
156*37da2899SCharles.Forsyth 
157*37da2899SCharles.Forsyth   typedef struct  PSH2_GlyphRec_
158*37da2899SCharles.Forsyth   {
159*37da2899SCharles.Forsyth     FT_UInt             num_points;
160*37da2899SCharles.Forsyth     FT_UInt             num_contours;
161*37da2899SCharles.Forsyth 
162*37da2899SCharles.Forsyth     PSH2_Point          points;
163*37da2899SCharles.Forsyth     PSH2_Contour        contours;
164*37da2899SCharles.Forsyth 
165*37da2899SCharles.Forsyth     FT_Memory           memory;
166*37da2899SCharles.Forsyth     FT_Outline*         outline;
167*37da2899SCharles.Forsyth     PSH_Globals         globals;
168*37da2899SCharles.Forsyth     PSH2_Hint_TableRec  hint_tables[2];
169*37da2899SCharles.Forsyth 
170*37da2899SCharles.Forsyth     FT_Bool             vertical;
171*37da2899SCharles.Forsyth     FT_Int              major_dir;
172*37da2899SCharles.Forsyth     FT_Int              minor_dir;
173*37da2899SCharles.Forsyth 
174*37da2899SCharles.Forsyth   } PSH2_GlyphRec, *PSH2_Glyph;
175*37da2899SCharles.Forsyth 
176*37da2899SCharles.Forsyth 
177*37da2899SCharles.Forsyth #ifdef DEBUG_HINTER
178*37da2899SCharles.Forsyth   extern PSH2_Hint_Table  ps2_debug_hint_table;
179*37da2899SCharles.Forsyth 
180*37da2899SCharles.Forsyth   typedef void
181*37da2899SCharles.Forsyth   (*PSH2_HintFunc)( PSH2_Hint  hint,
182*37da2899SCharles.Forsyth                     FT_Bool    vertical );
183*37da2899SCharles.Forsyth 
184*37da2899SCharles.Forsyth   extern PSH2_HintFunc    ps2_debug_hint_func;
185*37da2899SCharles.Forsyth 
186*37da2899SCharles.Forsyth   extern PSH2_Glyph       ps2_debug_glyph;
187*37da2899SCharles.Forsyth #endif
188*37da2899SCharles.Forsyth 
189*37da2899SCharles.Forsyth 
190*37da2899SCharles.Forsyth   extern FT_Error
191*37da2899SCharles.Forsyth   ps2_hints_apply( PS_Hints        ps_hints,
192*37da2899SCharles.Forsyth                    FT_Outline*     outline,
193*37da2899SCharles.Forsyth                    PSH_Globals     globals,
194*37da2899SCharles.Forsyth                    FT_Render_Mode  hint_mode );
195*37da2899SCharles.Forsyth 
196*37da2899SCharles.Forsyth 
197*37da2899SCharles.Forsyth FT_END_HEADER
198*37da2899SCharles.Forsyth 
199*37da2899SCharles.Forsyth 
200*37da2899SCharles.Forsyth #endif /* __PSHALGO2_H__ */
201*37da2899SCharles.Forsyth 
202*37da2899SCharles.Forsyth 
203*37da2899SCharles.Forsyth /* END */
204