[251] | 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 | |
---|
| 28 | FT_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 | |
---|
| 249 | FT_END_HEADER |
---|
| 250 | |
---|
| 251 | |
---|
| 252 | #endif /* __PSHALGO_H__ */ |
---|
| 253 | |
---|
| 254 | |
---|
| 255 | /* END */ |
---|