1/***************************************************************************/
2/*                                                                         */
3/*  pshalgo.h                                                              */
4/*                                                                         */
5/*    PostScript hinting algorithm (specification).                        */
6/*                                                                         */
7/*  Copyright 2001-2015 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
27FT_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
235FT_END_HEADER
236
237
238#endif /* __PSHALGO_H__ */
239
240
241/* END */
242