5367a5d16485e5386099a55a55cda27d329849b0
[platform/upstream/freetype2.git] / src / pshinter / pshalgo.h
1 /****************************************************************************
2  *
3  * pshalgo.h
4  *
5  *   PostScript hinting algorithm (specification).
6  *
7  * Copyright (C) 2001-2020 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 PSHALGO_H_
20 #define PSHALGO_H_
21
22
23 #include "pshrec.h"
24 #include "pshglob.h"
25
26
27 FT_BEGIN_HEADER
28
29
30   /* handle to Hint structure */
31   typedef struct PSH_HintRec_*  PSH_Hint;
32
33
34   /* hint bit-flags */
35 #define PSH_HINT_GHOST   PS_HINT_FLAG_GHOST
36 #define PSH_HINT_BOTTOM  PS_HINT_FLAG_BOTTOM
37 #define PSH_HINT_ACTIVE  4U
38 #define PSH_HINT_FITTED  8U
39
40
41 #define psh_hint_is_active( x )  ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )
42 #define psh_hint_is_ghost( x )   ( ( (x)->flags & PSH_HINT_GHOST  ) != 0 )
43 #define psh_hint_is_fitted( x )  ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )
44
45 #define psh_hint_activate( x )    (x)->flags |=  PSH_HINT_ACTIVE
46 #define psh_hint_deactivate( x )  (x)->flags &= ~PSH_HINT_ACTIVE
47 #define psh_hint_set_fitted( x )  (x)->flags |=  PSH_HINT_FITTED
48
49
50   /* hint structure */
51   typedef struct  PSH_HintRec_
52   {
53     FT_Int    org_pos;
54     FT_Int    org_len;
55     FT_Pos    cur_pos;
56     FT_Pos    cur_len;
57     FT_UInt   flags;
58     PSH_Hint  parent;
59     FT_Int    order;
60
61   } PSH_HintRec;
62
63
64   /* this is an interpolation zone used for strong points;  */
65   /* weak points are interpolated according to their strong */
66   /* neighbours                                             */
67   typedef struct  PSH_ZoneRec_
68   {
69     FT_Fixed  scale;
70     FT_Fixed  delta;
71     FT_Pos    min;
72     FT_Pos    max;
73
74   } PSH_ZoneRec, *PSH_Zone;
75
76
77   typedef struct  PSH_Hint_TableRec_
78   {
79     FT_UInt        max_hints;
80     FT_UInt        num_hints;
81     PSH_Hint       hints;
82     PSH_Hint*      sort;
83     PSH_Hint*      sort_global;
84     FT_UInt        num_zones;
85     PSH_ZoneRec*   zones;
86     PSH_Zone       zone;
87     PS_Mask_Table  hint_masks;
88     PS_Mask_Table  counter_masks;
89
90   } PSH_Hint_TableRec, *PSH_Hint_Table;
91
92
93   typedef struct PSH_PointRec_*    PSH_Point;
94   typedef struct PSH_ContourRec_*  PSH_Contour;
95
96   enum
97   {
98     PSH_DIR_NONE  =  4,
99     PSH_DIR_UP    = -1,
100     PSH_DIR_DOWN  =  1,
101     PSH_DIR_LEFT  = -2,
102     PSH_DIR_RIGHT =  2
103   };
104
105 #define PSH_DIR_HORIZONTAL  2
106 #define PSH_DIR_VERTICAL    1
107
108 #define PSH_DIR_COMPARE( d1, d2 )   ( (d1) == (d2) || (d1) == -(d2) )
109 #define PSH_DIR_IS_HORIZONTAL( d )  PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )
110 #define PSH_DIR_IS_VERTICAL( d )    PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )
111
112
113   /* the following bit-flags are computed once by the glyph */
114   /* analyzer, for both dimensions                          */
115 #define PSH_POINT_OFF     1U      /* point is off the curve */
116 #define PSH_POINT_SMOOTH  2U      /* point is smooth        */
117 #define PSH_POINT_INFLEX  4U      /* point is inflection    */
118
119
120 #define psh_point_is_smooth( p )  ( (p)->flags & PSH_POINT_SMOOTH )
121 #define psh_point_is_off( p )     ( (p)->flags & PSH_POINT_OFF    )
122 #define psh_point_is_inflex( p )  ( (p)->flags & PSH_POINT_INFLEX )
123
124 #define psh_point_set_smooth( p )  (p)->flags |= PSH_POINT_SMOOTH
125 #define psh_point_set_off( p )     (p)->flags |= PSH_POINT_OFF
126 #define psh_point_set_inflex( p )  (p)->flags |= PSH_POINT_INFLEX
127
128
129   /* the following bit-flags are re-computed for each dimension */
130 #define PSH_POINT_STRONG      16U /* point is strong                           */
131 #define PSH_POINT_FITTED      32U /* point is already fitted                   */
132 #define PSH_POINT_EXTREMUM    64U /* point is local extremum                   */
133 #define PSH_POINT_POSITIVE   128U /* extremum has positive contour flow        */
134 #define PSH_POINT_NEGATIVE   256U /* extremum has negative contour flow        */
135 #define PSH_POINT_EDGE_MIN   512U /* point is aligned to left/bottom stem edge */
136 #define PSH_POINT_EDGE_MAX  1024U /* point is aligned to top/right stem edge   */
137
138
139 #define psh_point_is_strong( p )    ( (p)->flags2 & PSH_POINT_STRONG )
140 #define psh_point_is_fitted( p )    ( (p)->flags2 & PSH_POINT_FITTED )
141 #define psh_point_is_extremum( p )  ( (p)->flags2 & PSH_POINT_EXTREMUM )
142 #define psh_point_is_positive( p )  ( (p)->flags2 & PSH_POINT_POSITIVE )
143 #define psh_point_is_negative( p )  ( (p)->flags2 & PSH_POINT_NEGATIVE )
144 #define psh_point_is_edge_min( p )  ( (p)->flags2 & PSH_POINT_EDGE_MIN )
145 #define psh_point_is_edge_max( p )  ( (p)->flags2 & PSH_POINT_EDGE_MAX )
146
147 #define psh_point_set_strong( p )    (p)->flags2 |= PSH_POINT_STRONG
148 #define psh_point_set_fitted( p )    (p)->flags2 |= PSH_POINT_FITTED
149 #define psh_point_set_extremum( p )  (p)->flags2 |= PSH_POINT_EXTREMUM
150 #define psh_point_set_positive( p )  (p)->flags2 |= PSH_POINT_POSITIVE
151 #define psh_point_set_negative( p )  (p)->flags2 |= PSH_POINT_NEGATIVE
152 #define psh_point_set_edge_min( p )  (p)->flags2 |= PSH_POINT_EDGE_MIN
153 #define psh_point_set_edge_max( p )  (p)->flags2 |= PSH_POINT_EDGE_MAX
154
155
156   typedef struct  PSH_PointRec_
157   {
158     PSH_Point    prev;
159     PSH_Point    next;
160     PSH_Contour  contour;
161     FT_UInt      flags;
162     FT_UInt      flags2;
163     FT_Char      dir_in;
164     FT_Char      dir_out;
165     PSH_Hint     hint;
166     FT_Pos       org_u;
167     FT_Pos       org_v;
168     FT_Pos       cur_u;
169 #ifdef DEBUG_HINTER
170     FT_Pos       org_x;
171     FT_Pos       cur_x;
172     FT_Pos       org_y;
173     FT_Pos       cur_y;
174     FT_UInt      flags_x;
175     FT_UInt      flags_y;
176 #endif
177
178   } PSH_PointRec;
179
180
181   typedef struct  PSH_ContourRec_
182   {
183     PSH_Point  start;
184     FT_UInt    count;
185
186   } PSH_ContourRec;
187
188
189   typedef struct  PSH_GlyphRec_
190   {
191     FT_UInt            num_points;
192     FT_UInt            num_contours;
193
194     PSH_Point          points;
195     PSH_Contour        contours;
196
197     FT_Memory          memory;
198     FT_Outline*        outline;
199     PSH_Globals        globals;
200     PSH_Hint_TableRec  hint_tables[2];
201
202     FT_Bool            vertical;
203     FT_Int             major_dir;
204     FT_Int             minor_dir;
205
206     FT_Bool            do_horz_hints;
207     FT_Bool            do_vert_hints;
208     FT_Bool            do_horz_snapping;
209     FT_Bool            do_vert_snapping;
210     FT_Bool            do_stem_adjust;
211
212   } PSH_GlyphRec, *PSH_Glyph;
213
214
215 #ifdef DEBUG_HINTER
216   extern PSH_Hint_Table  ps_debug_hint_table;
217
218   typedef void
219   (*PSH_HintFunc)( PSH_Hint  hint,
220                    FT_Bool   vertical );
221
222   extern PSH_HintFunc    ps_debug_hint_func;
223
224   extern PSH_Glyph       ps_debug_glyph;
225 #endif
226
227
228   extern FT_Error
229   ps_hints_apply( PS_Hints        ps_hints,
230                   FT_Outline*     outline,
231                   PSH_Globals     globals,
232                   FT_Render_Mode  hint_mode );
233
234
235 FT_END_HEADER
236
237
238 #endif /* PSHALGO_H_ */
239
240
241 /* END */