1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* pshalgo3.h */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* PostScript hinting algorithm 3 (specification). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 2001, 2002 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 __PSHALGO3_H__ 20*37da2899SCharles.Forsyth #define __PSHALGO3_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 /* handle to Hint structure */ 32*37da2899SCharles.Forsyth typedef struct PSH3_HintRec_* PSH3_Hint; 33*37da2899SCharles.Forsyth 34*37da2899SCharles.Forsyth /* hint bit-flags */ 35*37da2899SCharles.Forsyth typedef enum 36*37da2899SCharles.Forsyth { 37*37da2899SCharles.Forsyth PSH3_HINT_GHOST = PS_HINT_FLAG_GHOST, 38*37da2899SCharles.Forsyth PSH3_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM, 39*37da2899SCharles.Forsyth PSH3_HINT_ACTIVE = 4, 40*37da2899SCharles.Forsyth PSH3_HINT_FITTED = 8 41*37da2899SCharles.Forsyth 42*37da2899SCharles.Forsyth } PSH3_Hint_Flags; 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth 45*37da2899SCharles.Forsyth #define psh3_hint_is_active( x ) ( ( (x)->flags & PSH3_HINT_ACTIVE ) != 0 ) 46*37da2899SCharles.Forsyth #define psh3_hint_is_ghost( x ) ( ( (x)->flags & PSH3_HINT_GHOST ) != 0 ) 47*37da2899SCharles.Forsyth #define psh3_hint_is_fitted( x ) ( ( (x)->flags & PSH3_HINT_FITTED ) != 0 ) 48*37da2899SCharles.Forsyth 49*37da2899SCharles.Forsyth #define psh3_hint_activate( x ) (x)->flags |= PSH3_HINT_ACTIVE 50*37da2899SCharles.Forsyth #define psh3_hint_deactivate( x ) (x)->flags &= ~PSH3_HINT_ACTIVE 51*37da2899SCharles.Forsyth #define psh3_hint_set_fitted( x ) (x)->flags |= PSH3_HINT_FITTED 52*37da2899SCharles.Forsyth 53*37da2899SCharles.Forsyth /* hint structure */ 54*37da2899SCharles.Forsyth typedef struct PSH3_HintRec_ 55*37da2899SCharles.Forsyth { 56*37da2899SCharles.Forsyth FT_Int org_pos; 57*37da2899SCharles.Forsyth FT_Int org_len; 58*37da2899SCharles.Forsyth FT_Pos cur_pos; 59*37da2899SCharles.Forsyth FT_Pos cur_len; 60*37da2899SCharles.Forsyth FT_UInt flags; 61*37da2899SCharles.Forsyth PSH3_Hint parent; 62*37da2899SCharles.Forsyth FT_Int order; 63*37da2899SCharles.Forsyth 64*37da2899SCharles.Forsyth } PSH3_HintRec; 65*37da2899SCharles.Forsyth 66*37da2899SCharles.Forsyth 67*37da2899SCharles.Forsyth /* this is an interpolation zone used for strong points; */ 68*37da2899SCharles.Forsyth /* weak points are interpolated according to their strong */ 69*37da2899SCharles.Forsyth /* neighbours */ 70*37da2899SCharles.Forsyth typedef struct PSH3_ZoneRec_ 71*37da2899SCharles.Forsyth { 72*37da2899SCharles.Forsyth FT_Fixed scale; 73*37da2899SCharles.Forsyth FT_Fixed delta; 74*37da2899SCharles.Forsyth FT_Pos min; 75*37da2899SCharles.Forsyth FT_Pos max; 76*37da2899SCharles.Forsyth 77*37da2899SCharles.Forsyth } PSH3_ZoneRec, *PSH3_Zone; 78*37da2899SCharles.Forsyth 79*37da2899SCharles.Forsyth 80*37da2899SCharles.Forsyth typedef struct PSH3_Hint_TableRec_ 81*37da2899SCharles.Forsyth { 82*37da2899SCharles.Forsyth FT_UInt max_hints; 83*37da2899SCharles.Forsyth FT_UInt num_hints; 84*37da2899SCharles.Forsyth PSH3_Hint hints; 85*37da2899SCharles.Forsyth PSH3_Hint* sort; 86*37da2899SCharles.Forsyth PSH3_Hint* sort_global; 87*37da2899SCharles.Forsyth FT_UInt num_zones; 88*37da2899SCharles.Forsyth PSH3_ZoneRec* zones; 89*37da2899SCharles.Forsyth PSH3_Zone zone; 90*37da2899SCharles.Forsyth PS_Mask_Table hint_masks; 91*37da2899SCharles.Forsyth PS_Mask_Table counter_masks; 92*37da2899SCharles.Forsyth 93*37da2899SCharles.Forsyth } PSH3_Hint_TableRec, *PSH3_Hint_Table; 94*37da2899SCharles.Forsyth 95*37da2899SCharles.Forsyth 96*37da2899SCharles.Forsyth typedef struct PSH3_PointRec_* PSH3_Point; 97*37da2899SCharles.Forsyth typedef struct PSH3_ContourRec_* PSH3_Contour; 98*37da2899SCharles.Forsyth 99*37da2899SCharles.Forsyth enum 100*37da2899SCharles.Forsyth { 101*37da2899SCharles.Forsyth PSH3_DIR_NONE = 4, 102*37da2899SCharles.Forsyth PSH3_DIR_UP = -1, 103*37da2899SCharles.Forsyth PSH3_DIR_DOWN = 1, 104*37da2899SCharles.Forsyth PSH3_DIR_LEFT = -2, 105*37da2899SCharles.Forsyth PSH3_DIR_RIGHT = 2 106*37da2899SCharles.Forsyth }; 107*37da2899SCharles.Forsyth 108*37da2899SCharles.Forsyth #define PSH3_DIR_HORIZONTAL 2 109*37da2899SCharles.Forsyth #define PSH3_DIR_VERTICAL 1 110*37da2899SCharles.Forsyth 111*37da2899SCharles.Forsyth #define PSH3_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) ) 112*37da2899SCharles.Forsyth #define PSH3_DIR_IS_HORIZONTAL( d ) PSH3_DIR_COMPARE( d, PSH3_DIR_HORIZONTAL ) 113*37da2899SCharles.Forsyth #define PSH3_DIR_IS_VERTICAL( d ) PSH3_DIR_COMPARE( d, PSH3_DIR_VERTICAL ) 114*37da2899SCharles.Forsyth 115*37da2899SCharles.Forsyth 116*37da2899SCharles.Forsyth /* the following bit-flags are computed once by the glyph */ 117*37da2899SCharles.Forsyth /* analyzer, for both dimensions */ 118*37da2899SCharles.Forsyth enum 119*37da2899SCharles.Forsyth { 120*37da2899SCharles.Forsyth PSH3_POINT_OFF = 1, /* point is off the curve */ 121*37da2899SCharles.Forsyth PSH3_POINT_SMOOTH = 2, /* point is smooth */ 122*37da2899SCharles.Forsyth PSH3_POINT_INFLEX = 4 /* point is inflection */ 123*37da2899SCharles.Forsyth }; 124*37da2899SCharles.Forsyth 125*37da2899SCharles.Forsyth #define psh3_point_is_smooth( p ) ( (p)->flags & PSH3_POINT_SMOOTH ) 126*37da2899SCharles.Forsyth #define psh3_point_is_off( p ) ( (p)->flags & PSH3_POINT_OFF ) 127*37da2899SCharles.Forsyth #define psh3_point_is_inflex( p ) ( (p)->flags & PSH3_POINT_INFLEX ) 128*37da2899SCharles.Forsyth 129*37da2899SCharles.Forsyth #define psh3_point_set_smooth( p ) (p)->flags |= PSH3_POINT_SMOOTH 130*37da2899SCharles.Forsyth #define psh3_point_set_off( p ) (p)->flags |= PSH3_POINT_OFF 131*37da2899SCharles.Forsyth #define psh3_point_set_inflex( p ) (p)->flags |= PSH3_POINT_INFLEX 132*37da2899SCharles.Forsyth 133*37da2899SCharles.Forsyth /* the following bit-flags are re-computed for each dimension */ 134*37da2899SCharles.Forsyth enum 135*37da2899SCharles.Forsyth { 136*37da2899SCharles.Forsyth PSH3_POINT_STRONG = 16, /* point is strong */ 137*37da2899SCharles.Forsyth PSH3_POINT_FITTED = 32, /* point is already fitted */ 138*37da2899SCharles.Forsyth PSH3_POINT_EXTREMUM = 64, /* point is local extremum */ 139*37da2899SCharles.Forsyth PSH3_POINT_POSITIVE = 128, /* extremum has positive contour flow */ 140*37da2899SCharles.Forsyth PSH3_POINT_NEGATIVE = 256, /* extremum has negative contour flow */ 141*37da2899SCharles.Forsyth PSH3_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */ 142*37da2899SCharles.Forsyth PSH3_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */ 143*37da2899SCharles.Forsyth }; 144*37da2899SCharles.Forsyth 145*37da2899SCharles.Forsyth #define psh3_point_is_strong( p ) ( (p)->flags2 & PSH3_POINT_STRONG ) 146*37da2899SCharles.Forsyth #define psh3_point_is_fitted( p ) ( (p)->flags2 & PSH3_POINT_FITTED ) 147*37da2899SCharles.Forsyth #define psh3_point_is_extremum( p ) ( (p)->flags2 & PSH3_POINT_EXTREMUM ) 148*37da2899SCharles.Forsyth #define psh3_point_is_positive( p ) ( (p)->flags2 & PSH3_POINT_POSITIVE ) 149*37da2899SCharles.Forsyth #define psh3_point_is_negative( p ) ( (p)->flags2 & PSH3_POINT_NEGATIVE ) 150*37da2899SCharles.Forsyth #define psh3_point_is_edge_min( p ) ( (p)->flags2 & PSH3_POINT_EDGE_MIN ) 151*37da2899SCharles.Forsyth #define psh3_point_is_edge_max( p ) ( (p)->flags2 & PSH3_POINT_EDGE_MAX ) 152*37da2899SCharles.Forsyth 153*37da2899SCharles.Forsyth #define psh3_point_set_strong( p ) (p)->flags2 |= PSH3_POINT_STRONG 154*37da2899SCharles.Forsyth #define psh3_point_set_fitted( p ) (p)->flags2 |= PSH3_POINT_FITTED 155*37da2899SCharles.Forsyth #define psh3_point_set_extremum( p ) (p)->flags2 |= PSH3_POINT_EXTREMUM 156*37da2899SCharles.Forsyth #define psh3_point_set_positive( p ) (p)->flags2 |= PSH3_POINT_POSITIVE 157*37da2899SCharles.Forsyth #define psh3_point_set_negative( p ) (p)->flags2 |= PSH3_POINT_NEGATIVE 158*37da2899SCharles.Forsyth #define psh3_point_set_edge_min( p ) (p)->flags2 |= PSH3_POINT_EDGE_MIN 159*37da2899SCharles.Forsyth #define psh3_point_set_edge_max( p ) (p)->flags2 |= PSH3_POINT_EDGE_MAX 160*37da2899SCharles.Forsyth 161*37da2899SCharles.Forsyth 162*37da2899SCharles.Forsyth typedef struct PSH3_PointRec_ 163*37da2899SCharles.Forsyth { 164*37da2899SCharles.Forsyth PSH3_Point prev; 165*37da2899SCharles.Forsyth PSH3_Point next; 166*37da2899SCharles.Forsyth PSH3_Contour contour; 167*37da2899SCharles.Forsyth FT_UInt flags; 168*37da2899SCharles.Forsyth FT_UInt flags2; 169*37da2899SCharles.Forsyth FT_Char dir_in; 170*37da2899SCharles.Forsyth FT_Char dir_out; 171*37da2899SCharles.Forsyth FT_Angle angle_in; 172*37da2899SCharles.Forsyth FT_Angle angle_out; 173*37da2899SCharles.Forsyth PSH3_Hint hint; 174*37da2899SCharles.Forsyth FT_Pos org_u; 175*37da2899SCharles.Forsyth FT_Pos org_v; 176*37da2899SCharles.Forsyth FT_Pos cur_u; 177*37da2899SCharles.Forsyth #ifdef DEBUG_HINTER 178*37da2899SCharles.Forsyth FT_Pos org_x; 179*37da2899SCharles.Forsyth FT_Pos cur_x; 180*37da2899SCharles.Forsyth FT_Pos org_y; 181*37da2899SCharles.Forsyth FT_Pos cur_y; 182*37da2899SCharles.Forsyth FT_UInt flags_x; 183*37da2899SCharles.Forsyth FT_UInt flags_y; 184*37da2899SCharles.Forsyth #endif 185*37da2899SCharles.Forsyth 186*37da2899SCharles.Forsyth } PSH3_PointRec; 187*37da2899SCharles.Forsyth 188*37da2899SCharles.Forsyth 189*37da2899SCharles.Forsyth #define PSH3_POINT_EQUAL_ORG( a, b ) ( (a)->org_u == (b)->org_u && \ 190*37da2899SCharles.Forsyth (a)->org_v == (b)->org_v ) 191*37da2899SCharles.Forsyth 192*37da2899SCharles.Forsyth #define PSH3_POINT_ANGLE( a, b ) FT_Atan2( (b)->org_u - (a)->org_u, \ 193*37da2899SCharles.Forsyth (b)->org_v - (a)->org_v ) 194*37da2899SCharles.Forsyth 195*37da2899SCharles.Forsyth typedef struct PSH3_ContourRec_ 196*37da2899SCharles.Forsyth { 197*37da2899SCharles.Forsyth PSH3_Point start; 198*37da2899SCharles.Forsyth FT_UInt count; 199*37da2899SCharles.Forsyth 200*37da2899SCharles.Forsyth } PSH3_ContourRec; 201*37da2899SCharles.Forsyth 202*37da2899SCharles.Forsyth 203*37da2899SCharles.Forsyth typedef struct PSH3_GlyphRec_ 204*37da2899SCharles.Forsyth { 205*37da2899SCharles.Forsyth FT_UInt num_points; 206*37da2899SCharles.Forsyth FT_UInt num_contours; 207*37da2899SCharles.Forsyth 208*37da2899SCharles.Forsyth PSH3_Point points; 209*37da2899SCharles.Forsyth PSH3_Contour contours; 210*37da2899SCharles.Forsyth 211*37da2899SCharles.Forsyth FT_Memory memory; 212*37da2899SCharles.Forsyth FT_Outline* outline; 213*37da2899SCharles.Forsyth PSH_Globals globals; 214*37da2899SCharles.Forsyth PSH3_Hint_TableRec hint_tables[2]; 215*37da2899SCharles.Forsyth 216*37da2899SCharles.Forsyth FT_Bool vertical; 217*37da2899SCharles.Forsyth FT_Int major_dir; 218*37da2899SCharles.Forsyth FT_Int minor_dir; 219*37da2899SCharles.Forsyth 220*37da2899SCharles.Forsyth FT_Bool do_horz_hints; 221*37da2899SCharles.Forsyth FT_Bool do_vert_hints; 222*37da2899SCharles.Forsyth FT_Bool do_horz_snapping; 223*37da2899SCharles.Forsyth FT_Bool do_vert_snapping; 224*37da2899SCharles.Forsyth 225*37da2899SCharles.Forsyth } PSH3_GlyphRec, *PSH3_Glyph; 226*37da2899SCharles.Forsyth 227*37da2899SCharles.Forsyth 228*37da2899SCharles.Forsyth #ifdef DEBUG_HINTER 229*37da2899SCharles.Forsyth extern PSH3_Hint_Table ps3_debug_hint_table; 230*37da2899SCharles.Forsyth 231*37da2899SCharles.Forsyth typedef void 232*37da2899SCharles.Forsyth (*PSH3_HintFunc)( PSH3_Hint hint, 233*37da2899SCharles.Forsyth FT_Bool vertical ); 234*37da2899SCharles.Forsyth 235*37da2899SCharles.Forsyth extern PSH3_HintFunc ps3_debug_hint_func; 236*37da2899SCharles.Forsyth 237*37da2899SCharles.Forsyth extern PSH3_Glyph ps3_debug_glyph; 238*37da2899SCharles.Forsyth #endif 239*37da2899SCharles.Forsyth 240*37da2899SCharles.Forsyth 241*37da2899SCharles.Forsyth extern FT_Error 242*37da2899SCharles.Forsyth ps3_hints_apply( PS_Hints ps_hints, 243*37da2899SCharles.Forsyth FT_Outline* outline, 244*37da2899SCharles.Forsyth PSH_Globals globals, 245*37da2899SCharles.Forsyth FT_Render_Mode hint_mode ); 246*37da2899SCharles.Forsyth 247*37da2899SCharles.Forsyth 248*37da2899SCharles.Forsyth FT_END_HEADER 249*37da2899SCharles.Forsyth 250*37da2899SCharles.Forsyth 251*37da2899SCharles.Forsyth #endif /* __PSHALGO3_H__ */ 252*37da2899SCharles.Forsyth 253*37da2899SCharles.Forsyth 254*37da2899SCharles.Forsyth /* END */ 255