PageRenderTime 29ms CodeModel.GetById 13ms app.highlight 13ms RepoModel.GetById 1ms app.codeStats 0ms

/src/freetype/src/pshinter/pshalgo.h

https://bitbucket.org/cabalistic/ogredeps/
C++ Header | 255 lines | 168 code | 61 blank | 26 comment | 9 complexity | aa83c2ff5920b28bce38bfce94bb927b MD5 | raw file
  1/***************************************************************************/
  2/*                                                                         */
  3/*  pshalgo.h                                                              */
  4/*                                                                         */
  5/*    PostScript hinting algorithm (specification).                        */
  6/*                                                                         */
  7/*  Copyright 2001, 2002, 2003, 2008 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#include FT_TRIGONOMETRY_H
 26
 27
 28FT_BEGIN_HEADER
 29
 30
 31  /* handle to Hint structure */
 32  typedef struct PSH_HintRec_*  PSH_Hint;
 33
 34  /* hint bit-flags */
 35  typedef enum  PSH_Hint_Flags_
 36  {
 37    PSH_HINT_GHOST  = PS_HINT_FLAG_GHOST,
 38    PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
 39    PSH_HINT_ACTIVE = 4,
 40    PSH_HINT_FITTED = 8
 41
 42  } PSH_Hint_Flags;
 43
 44
 45#define psh_hint_is_active( x )  ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )
 46#define psh_hint_is_ghost( x )   ( ( (x)->flags & PSH_HINT_GHOST  ) != 0 )
 47#define psh_hint_is_fitted( x )  ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )
 48
 49#define psh_hint_activate( x )    (x)->flags |=  PSH_HINT_ACTIVE
 50#define psh_hint_deactivate( x )  (x)->flags &= ~PSH_HINT_ACTIVE
 51#define psh_hint_set_fitted( x )  (x)->flags |=  PSH_HINT_FITTED
 52
 53  /* hint structure */
 54  typedef struct  PSH_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    PSH_Hint  parent;
 62    FT_Int    order;
 63
 64  } PSH_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  PSH_ZoneRec_
 71  {
 72    FT_Fixed  scale;
 73    FT_Fixed  delta;
 74    FT_Pos    min;
 75    FT_Pos    max;
 76
 77  } PSH_ZoneRec, *PSH_Zone;
 78
 79
 80  typedef struct  PSH_Hint_TableRec_
 81  {
 82    FT_UInt        max_hints;
 83    FT_UInt        num_hints;
 84    PSH_Hint       hints;
 85    PSH_Hint*      sort;
 86    PSH_Hint*      sort_global;
 87    FT_UInt        num_zones;
 88    PSH_ZoneRec*   zones;
 89    PSH_Zone       zone;
 90    PS_Mask_Table  hint_masks;
 91    PS_Mask_Table  counter_masks;
 92
 93  } PSH_Hint_TableRec, *PSH_Hint_Table;
 94
 95
 96  typedef struct PSH_PointRec_*    PSH_Point;
 97  typedef struct PSH_ContourRec_*  PSH_Contour;
 98
 99  enum
100  {
101    PSH_DIR_NONE  =  4,
102    PSH_DIR_UP    = -1,
103    PSH_DIR_DOWN  =  1,
104    PSH_DIR_LEFT  = -2,
105    PSH_DIR_RIGHT =  2
106  };
107
108#define PSH_DIR_HORIZONTAL  2
109#define PSH_DIR_VERTICAL    1
110
111#define PSH_DIR_COMPARE( d1, d2 )   ( (d1) == (d2) || (d1) == -(d2) )
112#define PSH_DIR_IS_HORIZONTAL( d )  PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )
113#define PSH_DIR_IS_VERTICAL( d )    PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )
114
115
116 /* the following bit-flags are computed once by the glyph */
117 /* analyzer, for both dimensions                          */
118  enum
119  {
120    PSH_POINT_OFF    = 1,   /* point is off the curve */
121    PSH_POINT_SMOOTH = 2,   /* point is smooth        */
122    PSH_POINT_INFLEX = 4    /* point is inflection    */
123  };
124
125#define psh_point_is_smooth( p )  ( (p)->flags & PSH_POINT_SMOOTH )
126#define psh_point_is_off( p )     ( (p)->flags & PSH_POINT_OFF    )
127#define psh_point_is_inflex( p )  ( (p)->flags & PSH_POINT_INFLEX )
128
129#define psh_point_set_smooth( p )  (p)->flags |= PSH_POINT_SMOOTH
130#define psh_point_set_off( p )     (p)->flags |= PSH_POINT_OFF
131#define psh_point_set_inflex( p )  (p)->flags |= PSH_POINT_INFLEX
132
133  /* the following bit-flags are re-computed for each dimension */
134  enum
135  {
136    PSH_POINT_STRONG   = 16,   /* point is strong                           */
137    PSH_POINT_FITTED   = 32,   /* point is already fitted                   */
138    PSH_POINT_EXTREMUM = 64,   /* point is local extremum                   */
139    PSH_POINT_POSITIVE = 128,  /* extremum has positive contour flow        */
140    PSH_POINT_NEGATIVE = 256,  /* extremum has negative contour flow        */
141    PSH_POINT_EDGE_MIN = 512,  /* point is aligned to left/bottom stem edge */
142    PSH_POINT_EDGE_MAX = 1024  /* point is aligned to top/right stem edge   */
143  };
144
145#define psh_point_is_strong( p )    ( (p)->flags2 & PSH_POINT_STRONG )
146#define psh_point_is_fitted( p )    ( (p)->flags2 & PSH_POINT_FITTED )
147#define psh_point_is_extremum( p )  ( (p)->flags2 & PSH_POINT_EXTREMUM )
148#define psh_point_is_positive( p )  ( (p)->flags2 & PSH_POINT_POSITIVE )
149#define psh_point_is_negative( p )  ( (p)->flags2 & PSH_POINT_NEGATIVE )
150#define psh_point_is_edge_min( p )  ( (p)->flags2 & PSH_POINT_EDGE_MIN )
151#define psh_point_is_edge_max( p )  ( (p)->flags2 & PSH_POINT_EDGE_MAX )
152
153#define psh_point_set_strong( p )    (p)->flags2 |= PSH_POINT_STRONG
154#define psh_point_set_fitted( p )    (p)->flags2 |= PSH_POINT_FITTED
155#define psh_point_set_extremum( p )  (p)->flags2 |= PSH_POINT_EXTREMUM
156#define psh_point_set_positive( p )  (p)->flags2 |= PSH_POINT_POSITIVE
157#define psh_point_set_negative( p )  (p)->flags2 |= PSH_POINT_NEGATIVE
158#define psh_point_set_edge_min( p )  (p)->flags2 |= PSH_POINT_EDGE_MIN
159#define psh_point_set_edge_max( p )  (p)->flags2 |= PSH_POINT_EDGE_MAX
160
161
162  typedef struct  PSH_PointRec_
163  {
164    PSH_Point    prev;
165    PSH_Point    next;
166    PSH_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    PSH_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  } PSH_PointRec;
187
188
189#define PSH_POINT_EQUAL_ORG( a, b )  ( (a)->org_u == (b)->org_u && \
190                                       (a)->org_v == (b)->org_v )
191
192#define PSH_POINT_ANGLE( a, b )  FT_Atan2( (b)->org_u - (a)->org_u,  \
193                                           (b)->org_v - (a)->org_v )
194
195  typedef struct  PSH_ContourRec_
196  {
197    PSH_Point  start;
198    FT_UInt    count;
199
200  } PSH_ContourRec;
201
202
203  typedef struct  PSH_GlyphRec_
204  {
205    FT_UInt            num_points;
206    FT_UInt            num_contours;
207
208    PSH_Point          points;
209    PSH_Contour        contours;
210
211    FT_Memory          memory;
212    FT_Outline*        outline;
213    PSH_Globals        globals;
214    PSH_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  } PSH_GlyphRec, *PSH_Glyph;
227
228
229#ifdef DEBUG_HINTER
230  extern PSH_Hint_Table  ps_debug_hint_table;
231
232  typedef void
233  (*PSH_HintFunc)( PSH_Hint  hint,
234                   FT_Bool   vertical );
235
236  extern PSH_HintFunc    ps_debug_hint_func;
237
238  extern PSH_Glyph       ps_debug_glyph;
239#endif
240
241
242  extern FT_Error
243  ps_hints_apply( PS_Hints        ps_hints,
244                  FT_Outline*     outline,
245                  PSH_Globals     globals,
246                  FT_Render_Mode  hint_mode );
247
248
249FT_END_HEADER
250
251
252#endif /* __PSHALGO_H__ */
253
254
255/* END */