1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* pshalgo2.h */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* PostScript hinting algorithm 2 (specification). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 2001 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 __PSHALGO2_H__ 20*37da2899SCharles.Forsyth #define __PSHALGO2_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 typedef struct PSH2_HintRec_* PSH2_Hint; 32*37da2899SCharles.Forsyth 33*37da2899SCharles.Forsyth typedef enum 34*37da2899SCharles.Forsyth { 35*37da2899SCharles.Forsyth PSH2_HINT_GHOST = PS_HINT_FLAG_GHOST, 36*37da2899SCharles.Forsyth PSH2_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM, 37*37da2899SCharles.Forsyth PSH2_HINT_ACTIVE = 4, 38*37da2899SCharles.Forsyth PSH2_HINT_FITTED = 8 39*37da2899SCharles.Forsyth 40*37da2899SCharles.Forsyth } PSH2_Hint_Flags; 41*37da2899SCharles.Forsyth 42*37da2899SCharles.Forsyth 43*37da2899SCharles.Forsyth #define psh2_hint_is_active( x ) ( ( (x)->flags & PSH2_HINT_ACTIVE ) != 0 ) 44*37da2899SCharles.Forsyth #define psh2_hint_is_ghost( x ) ( ( (x)->flags & PSH2_HINT_GHOST ) != 0 ) 45*37da2899SCharles.Forsyth #define psh2_hint_is_fitted( x ) ( ( (x)->flags & PSH2_HINT_FITTED ) != 0 ) 46*37da2899SCharles.Forsyth 47*37da2899SCharles.Forsyth #define psh2_hint_activate( x ) (x)->flags |= PSH2_HINT_ACTIVE 48*37da2899SCharles.Forsyth #define psh2_hint_deactivate( x ) (x)->flags &= ~PSH2_HINT_ACTIVE 49*37da2899SCharles.Forsyth #define psh2_hint_set_fitted( x ) (x)->flags |= PSH2_HINT_FITTED 50*37da2899SCharles.Forsyth 51*37da2899SCharles.Forsyth 52*37da2899SCharles.Forsyth typedef struct PSH2_HintRec_ 53*37da2899SCharles.Forsyth { 54*37da2899SCharles.Forsyth FT_Int org_pos; 55*37da2899SCharles.Forsyth FT_Int org_len; 56*37da2899SCharles.Forsyth FT_Pos cur_pos; 57*37da2899SCharles.Forsyth FT_Pos cur_len; 58*37da2899SCharles.Forsyth FT_UInt flags; 59*37da2899SCharles.Forsyth PSH2_Hint parent; 60*37da2899SCharles.Forsyth FT_Int order; 61*37da2899SCharles.Forsyth 62*37da2899SCharles.Forsyth } PSH2_HintRec; 63*37da2899SCharles.Forsyth 64*37da2899SCharles.Forsyth 65*37da2899SCharles.Forsyth /* this is an interpolation zone used for strong points; */ 66*37da2899SCharles.Forsyth /* weak points are interpolated according to their strong */ 67*37da2899SCharles.Forsyth /* neighbours */ 68*37da2899SCharles.Forsyth typedef struct PSH2_ZoneRec_ 69*37da2899SCharles.Forsyth { 70*37da2899SCharles.Forsyth FT_Fixed scale; 71*37da2899SCharles.Forsyth FT_Fixed delta; 72*37da2899SCharles.Forsyth FT_Pos min; 73*37da2899SCharles.Forsyth FT_Pos max; 74*37da2899SCharles.Forsyth 75*37da2899SCharles.Forsyth } PSH2_ZoneRec, *PSH2_Zone; 76*37da2899SCharles.Forsyth 77*37da2899SCharles.Forsyth 78*37da2899SCharles.Forsyth typedef struct PSH2_Hint_TableRec_ 79*37da2899SCharles.Forsyth { 80*37da2899SCharles.Forsyth FT_UInt max_hints; 81*37da2899SCharles.Forsyth FT_UInt num_hints; 82*37da2899SCharles.Forsyth PSH2_Hint hints; 83*37da2899SCharles.Forsyth PSH2_Hint* sort; 84*37da2899SCharles.Forsyth PSH2_Hint* sort_global; 85*37da2899SCharles.Forsyth FT_UInt num_zones; 86*37da2899SCharles.Forsyth PSH2_Zone zones; 87*37da2899SCharles.Forsyth PSH2_Zone zone; 88*37da2899SCharles.Forsyth PS_Mask_Table hint_masks; 89*37da2899SCharles.Forsyth PS_Mask_Table counter_masks; 90*37da2899SCharles.Forsyth 91*37da2899SCharles.Forsyth } PSH2_Hint_TableRec, *PSH2_Hint_Table; 92*37da2899SCharles.Forsyth 93*37da2899SCharles.Forsyth 94*37da2899SCharles.Forsyth typedef struct PSH2_PointRec_* PSH2_Point; 95*37da2899SCharles.Forsyth typedef struct PSH2_ContourRec_* PSH2_Contour; 96*37da2899SCharles.Forsyth 97*37da2899SCharles.Forsyth enum 98*37da2899SCharles.Forsyth { 99*37da2899SCharles.Forsyth PSH2_DIR_NONE = 4, 100*37da2899SCharles.Forsyth PSH2_DIR_UP = 1, 101*37da2899SCharles.Forsyth PSH2_DIR_DOWN = -1, 102*37da2899SCharles.Forsyth PSH2_DIR_LEFT = -2, 103*37da2899SCharles.Forsyth PSH2_DIR_RIGHT = 2 104*37da2899SCharles.Forsyth }; 105*37da2899SCharles.Forsyth 106*37da2899SCharles.Forsyth enum 107*37da2899SCharles.Forsyth { 108*37da2899SCharles.Forsyth PSH2_POINT_OFF = 1, /* point is off the curve */ 109*37da2899SCharles.Forsyth PSH2_POINT_STRONG = 2, /* point is strong */ 110*37da2899SCharles.Forsyth PSH2_POINT_SMOOTH = 4, /* point is smooth */ 111*37da2899SCharles.Forsyth PSH2_POINT_FITTED = 8 /* point is already fitted */ 112*37da2899SCharles.Forsyth }; 113*37da2899SCharles.Forsyth 114*37da2899SCharles.Forsyth 115*37da2899SCharles.Forsyth typedef struct PSH2_PointRec_ 116*37da2899SCharles.Forsyth { 117*37da2899SCharles.Forsyth PSH2_Point prev; 118*37da2899SCharles.Forsyth PSH2_Point next; 119*37da2899SCharles.Forsyth PSH2_Contour contour; 120*37da2899SCharles.Forsyth FT_UInt flags; 121*37da2899SCharles.Forsyth FT_Char dir_in; 122*37da2899SCharles.Forsyth FT_Char dir_out; 123*37da2899SCharles.Forsyth FT_Angle angle_in; 124*37da2899SCharles.Forsyth FT_Angle angle_out; 125*37da2899SCharles.Forsyth PSH2_Hint hint; 126*37da2899SCharles.Forsyth FT_Pos org_u; 127*37da2899SCharles.Forsyth FT_Pos cur_u; 128*37da2899SCharles.Forsyth #ifdef DEBUG_HINTER 129*37da2899SCharles.Forsyth FT_Pos org_x; 130*37da2899SCharles.Forsyth FT_Pos cur_x; 131*37da2899SCharles.Forsyth FT_Pos org_y; 132*37da2899SCharles.Forsyth FT_Pos cur_y; 133*37da2899SCharles.Forsyth FT_UInt flags_x; 134*37da2899SCharles.Forsyth FT_UInt flags_y; 135*37da2899SCharles.Forsyth #endif 136*37da2899SCharles.Forsyth 137*37da2899SCharles.Forsyth } PSH2_PointRec; 138*37da2899SCharles.Forsyth 139*37da2899SCharles.Forsyth 140*37da2899SCharles.Forsyth #define psh2_point_is_strong( p ) ( (p)->flags & PSH2_POINT_STRONG ) 141*37da2899SCharles.Forsyth #define psh2_point_is_fitted( p ) ( (p)->flags & PSH2_POINT_FITTED ) 142*37da2899SCharles.Forsyth #define psh2_point_is_smooth( p ) ( (p)->flags & PSH2_POINT_SMOOTH ) 143*37da2899SCharles.Forsyth 144*37da2899SCharles.Forsyth #define psh2_point_set_strong( p ) (p)->flags |= PSH2_POINT_STRONG 145*37da2899SCharles.Forsyth #define psh2_point_set_fitted( p ) (p)->flags |= PSH2_POINT_FITTED 146*37da2899SCharles.Forsyth #define psh2_point_set_smooth( p ) (p)->flags |= PSH2_POINT_SMOOTH 147*37da2899SCharles.Forsyth 148*37da2899SCharles.Forsyth 149*37da2899SCharles.Forsyth typedef struct PSH2_ContourRec_ 150*37da2899SCharles.Forsyth { 151*37da2899SCharles.Forsyth PSH2_Point start; 152*37da2899SCharles.Forsyth FT_UInt count; 153*37da2899SCharles.Forsyth 154*37da2899SCharles.Forsyth } PSH2_ContourRec; 155*37da2899SCharles.Forsyth 156*37da2899SCharles.Forsyth 157*37da2899SCharles.Forsyth typedef struct PSH2_GlyphRec_ 158*37da2899SCharles.Forsyth { 159*37da2899SCharles.Forsyth FT_UInt num_points; 160*37da2899SCharles.Forsyth FT_UInt num_contours; 161*37da2899SCharles.Forsyth 162*37da2899SCharles.Forsyth PSH2_Point points; 163*37da2899SCharles.Forsyth PSH2_Contour contours; 164*37da2899SCharles.Forsyth 165*37da2899SCharles.Forsyth FT_Memory memory; 166*37da2899SCharles.Forsyth FT_Outline* outline; 167*37da2899SCharles.Forsyth PSH_Globals globals; 168*37da2899SCharles.Forsyth PSH2_Hint_TableRec hint_tables[2]; 169*37da2899SCharles.Forsyth 170*37da2899SCharles.Forsyth FT_Bool vertical; 171*37da2899SCharles.Forsyth FT_Int major_dir; 172*37da2899SCharles.Forsyth FT_Int minor_dir; 173*37da2899SCharles.Forsyth 174*37da2899SCharles.Forsyth } PSH2_GlyphRec, *PSH2_Glyph; 175*37da2899SCharles.Forsyth 176*37da2899SCharles.Forsyth 177*37da2899SCharles.Forsyth #ifdef DEBUG_HINTER 178*37da2899SCharles.Forsyth extern PSH2_Hint_Table ps2_debug_hint_table; 179*37da2899SCharles.Forsyth 180*37da2899SCharles.Forsyth typedef void 181*37da2899SCharles.Forsyth (*PSH2_HintFunc)( PSH2_Hint hint, 182*37da2899SCharles.Forsyth FT_Bool vertical ); 183*37da2899SCharles.Forsyth 184*37da2899SCharles.Forsyth extern PSH2_HintFunc ps2_debug_hint_func; 185*37da2899SCharles.Forsyth 186*37da2899SCharles.Forsyth extern PSH2_Glyph ps2_debug_glyph; 187*37da2899SCharles.Forsyth #endif 188*37da2899SCharles.Forsyth 189*37da2899SCharles.Forsyth 190*37da2899SCharles.Forsyth extern FT_Error 191*37da2899SCharles.Forsyth ps2_hints_apply( PS_Hints ps_hints, 192*37da2899SCharles.Forsyth FT_Outline* outline, 193*37da2899SCharles.Forsyth PSH_Globals globals, 194*37da2899SCharles.Forsyth FT_Render_Mode hint_mode ); 195*37da2899SCharles.Forsyth 196*37da2899SCharles.Forsyth 197*37da2899SCharles.Forsyth FT_END_HEADER 198*37da2899SCharles.Forsyth 199*37da2899SCharles.Forsyth 200*37da2899SCharles.Forsyth #endif /* __PSHALGO2_H__ */ 201*37da2899SCharles.Forsyth 202*37da2899SCharles.Forsyth 203*37da2899SCharles.Forsyth /* END */ 204