1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* ttinterp.h */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* TrueType bytecode interpreter (specification). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 1996-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 __TTINTERP_H__ 20*37da2899SCharles.Forsyth #define __TTINTERP_H__ 21*37da2899SCharles.Forsyth 22*37da2899SCharles.Forsyth 23*37da2899SCharles.Forsyth #include <ft2build.h> 24*37da2899SCharles.Forsyth #include "ttobjs.h" 25*37da2899SCharles.Forsyth 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsyth FT_BEGIN_HEADER 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsyth 30*37da2899SCharles.Forsyth #ifndef TT_CONFIG_OPTION_STATIC_INTEPRETER /* indirect implementation */ 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsyth #define EXEC_OP_ TT_ExecContext exc, 33*37da2899SCharles.Forsyth #define EXEC_OP TT_ExecContext exc 34*37da2899SCharles.Forsyth #define EXEC_ARG_ exc, 35*37da2899SCharles.Forsyth #define EXEC_ARG exc 36*37da2899SCharles.Forsyth 37*37da2899SCharles.Forsyth #else /* static implementation */ 38*37da2899SCharles.Forsyth 39*37da2899SCharles.Forsyth #define EXEC_OP_ /* void */ 40*37da2899SCharles.Forsyth #define EXEC_OP /* void */ 41*37da2899SCharles.Forsyth #define EXEC_ARG_ /* void */ 42*37da2899SCharles.Forsyth #define EXEC_ARG /* void */ 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth #endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ 45*37da2899SCharles.Forsyth 46*37da2899SCharles.Forsyth 47*37da2899SCharles.Forsyth /*************************************************************************/ 48*37da2899SCharles.Forsyth /* */ 49*37da2899SCharles.Forsyth /* Rounding mode constants. */ 50*37da2899SCharles.Forsyth /* */ 51*37da2899SCharles.Forsyth #define TT_Round_Off 5 52*37da2899SCharles.Forsyth #define TT_Round_To_Half_Grid 0 53*37da2899SCharles.Forsyth #define TT_Round_To_Grid 1 54*37da2899SCharles.Forsyth #define TT_Round_To_Double_Grid 2 55*37da2899SCharles.Forsyth #define TT_Round_Up_To_Grid 4 56*37da2899SCharles.Forsyth #define TT_Round_Down_To_Grid 3 57*37da2899SCharles.Forsyth #define TT_Round_Super 6 58*37da2899SCharles.Forsyth #define TT_Round_Super_45 7 59*37da2899SCharles.Forsyth 60*37da2899SCharles.Forsyth 61*37da2899SCharles.Forsyth /*************************************************************************/ 62*37da2899SCharles.Forsyth /* */ 63*37da2899SCharles.Forsyth /* Function types used by the interpreter, depending on various modes */ 64*37da2899SCharles.Forsyth /* (e.g. the rounding mode, whether to render a vertical or horizontal */ 65*37da2899SCharles.Forsyth /* line etc). */ 66*37da2899SCharles.Forsyth /* */ 67*37da2899SCharles.Forsyth /*************************************************************************/ 68*37da2899SCharles.Forsyth 69*37da2899SCharles.Forsyth /* Rounding function */ 70*37da2899SCharles.Forsyth typedef FT_F26Dot6 71*37da2899SCharles.Forsyth (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6 distance, 72*37da2899SCharles.Forsyth FT_F26Dot6 compensation ); 73*37da2899SCharles.Forsyth 74*37da2899SCharles.Forsyth /* Point displacement along the freedom vector routine */ 75*37da2899SCharles.Forsyth typedef void 76*37da2899SCharles.Forsyth (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone zone, 77*37da2899SCharles.Forsyth FT_UShort point, 78*37da2899SCharles.Forsyth FT_F26Dot6 distance ); 79*37da2899SCharles.Forsyth 80*37da2899SCharles.Forsyth /* Distance projection along one of the projection vectors */ 81*37da2899SCharles.Forsyth typedef FT_F26Dot6 82*37da2899SCharles.Forsyth (*TT_Project_Func)( EXEC_OP_ FT_Vector* v1, 83*37da2899SCharles.Forsyth FT_Vector* v2 ); 84*37da2899SCharles.Forsyth 85*37da2899SCharles.Forsyth /* reading a cvt value. Take care of non-square pixels if necessary */ 86*37da2899SCharles.Forsyth typedef FT_F26Dot6 87*37da2899SCharles.Forsyth (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong idx ); 88*37da2899SCharles.Forsyth 89*37da2899SCharles.Forsyth /* setting or moving a cvt value. Take care of non-square pixels */ 90*37da2899SCharles.Forsyth /* if necessary */ 91*37da2899SCharles.Forsyth typedef void 92*37da2899SCharles.Forsyth (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong idx, 93*37da2899SCharles.Forsyth FT_F26Dot6 value ); 94*37da2899SCharles.Forsyth 95*37da2899SCharles.Forsyth 96*37da2899SCharles.Forsyth /*************************************************************************/ 97*37da2899SCharles.Forsyth /* */ 98*37da2899SCharles.Forsyth /* This structure defines a call record, used to manage function calls. */ 99*37da2899SCharles.Forsyth /* */ 100*37da2899SCharles.Forsyth typedef struct TT_CallRec_ 101*37da2899SCharles.Forsyth { 102*37da2899SCharles.Forsyth FT_Int Caller_Range; 103*37da2899SCharles.Forsyth FT_Long Caller_IP; 104*37da2899SCharles.Forsyth FT_Long Cur_Count; 105*37da2899SCharles.Forsyth FT_Long Cur_Restart; 106*37da2899SCharles.Forsyth 107*37da2899SCharles.Forsyth } TT_CallRec, *TT_CallStack; 108*37da2899SCharles.Forsyth 109*37da2899SCharles.Forsyth 110*37da2899SCharles.Forsyth /*************************************************************************/ 111*37da2899SCharles.Forsyth /* */ 112*37da2899SCharles.Forsyth /* The main structure for the interpreter which collects all necessary */ 113*37da2899SCharles.Forsyth /* variables and states. */ 114*37da2899SCharles.Forsyth /* */ 115*37da2899SCharles.Forsyth typedef struct TT_ExecContextRec_ 116*37da2899SCharles.Forsyth { 117*37da2899SCharles.Forsyth TT_Face face; 118*37da2899SCharles.Forsyth TT_Size size; 119*37da2899SCharles.Forsyth FT_Memory memory; 120*37da2899SCharles.Forsyth 121*37da2899SCharles.Forsyth /* instructions state */ 122*37da2899SCharles.Forsyth 123*37da2899SCharles.Forsyth FT_Error error; /* last execution error */ 124*37da2899SCharles.Forsyth 125*37da2899SCharles.Forsyth FT_Long top; /* top of exec. stack */ 126*37da2899SCharles.Forsyth 127*37da2899SCharles.Forsyth FT_UInt stackSize; /* size of exec. stack */ 128*37da2899SCharles.Forsyth FT_Long* stack; /* current exec. stack */ 129*37da2899SCharles.Forsyth 130*37da2899SCharles.Forsyth FT_Long args; 131*37da2899SCharles.Forsyth FT_UInt new_top; /* new top after exec. */ 132*37da2899SCharles.Forsyth 133*37da2899SCharles.Forsyth TT_GlyphZoneRec zp0, /* zone records */ 134*37da2899SCharles.Forsyth zp1, 135*37da2899SCharles.Forsyth zp2, 136*37da2899SCharles.Forsyth pts, 137*37da2899SCharles.Forsyth twilight; 138*37da2899SCharles.Forsyth 139*37da2899SCharles.Forsyth FT_Size_Metrics metrics; 140*37da2899SCharles.Forsyth TT_Size_Metrics tt_metrics; /* size metrics */ 141*37da2899SCharles.Forsyth 142*37da2899SCharles.Forsyth TT_GraphicsState GS; /* current graphics state */ 143*37da2899SCharles.Forsyth 144*37da2899SCharles.Forsyth FT_Int curRange; /* current code range number */ 145*37da2899SCharles.Forsyth FT_Byte* code; /* current code range */ 146*37da2899SCharles.Forsyth FT_Long IP; /* current instruction pointer */ 147*37da2899SCharles.Forsyth FT_Long codeSize; /* size of current range */ 148*37da2899SCharles.Forsyth 149*37da2899SCharles.Forsyth FT_Byte opcode; /* current opcode */ 150*37da2899SCharles.Forsyth FT_Int length; /* length of current opcode */ 151*37da2899SCharles.Forsyth 152*37da2899SCharles.Forsyth FT_Bool step_ins; /* true if the interpreter must */ 153*37da2899SCharles.Forsyth /* increment IP after ins. exec */ 154*37da2899SCharles.Forsyth FT_Long cvtSize; 155*37da2899SCharles.Forsyth FT_Long* cvt; 156*37da2899SCharles.Forsyth 157*37da2899SCharles.Forsyth FT_UInt glyphSize; /* glyph instructions buffer size */ 158*37da2899SCharles.Forsyth FT_Byte* glyphIns; /* glyph instructions buffer */ 159*37da2899SCharles.Forsyth 160*37da2899SCharles.Forsyth FT_UInt numFDefs; /* number of function defs */ 161*37da2899SCharles.Forsyth FT_UInt maxFDefs; /* maximum number of function defs */ 162*37da2899SCharles.Forsyth TT_DefArray FDefs; /* table of FDefs entries */ 163*37da2899SCharles.Forsyth 164*37da2899SCharles.Forsyth FT_UInt numIDefs; /* number of instruction defs */ 165*37da2899SCharles.Forsyth FT_UInt maxIDefs; /* maximum number of ins defs */ 166*37da2899SCharles.Forsyth TT_DefArray IDefs; /* table of IDefs entries */ 167*37da2899SCharles.Forsyth 168*37da2899SCharles.Forsyth FT_UInt maxFunc; /* maximum function index */ 169*37da2899SCharles.Forsyth FT_UInt maxIns; /* maximum instruction index */ 170*37da2899SCharles.Forsyth 171*37da2899SCharles.Forsyth FT_Int callTop, /* top of call stack during execution */ 172*37da2899SCharles.Forsyth callSize; /* size of call stack */ 173*37da2899SCharles.Forsyth TT_CallStack callStack; /* call stack */ 174*37da2899SCharles.Forsyth 175*37da2899SCharles.Forsyth FT_UShort maxPoints; /* capacity of this context's `pts' */ 176*37da2899SCharles.Forsyth FT_Short maxContours; /* record, expressed in points and */ 177*37da2899SCharles.Forsyth /* contours. */ 178*37da2899SCharles.Forsyth 179*37da2899SCharles.Forsyth TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */ 180*37da2899SCharles.Forsyth /* useful for the debugger */ 181*37da2899SCharles.Forsyth 182*37da2899SCharles.Forsyth FT_UShort storeSize; /* size of current storage */ 183*37da2899SCharles.Forsyth FT_Long* storage; /* storage area */ 184*37da2899SCharles.Forsyth 185*37da2899SCharles.Forsyth FT_F26Dot6 period; /* values used for the */ 186*37da2899SCharles.Forsyth FT_F26Dot6 phase; /* `SuperRounding' */ 187*37da2899SCharles.Forsyth FT_F26Dot6 threshold; 188*37da2899SCharles.Forsyth 189*37da2899SCharles.Forsyth #if 0 190*37da2899SCharles.Forsyth /* this seems to be unused */ 191*37da2899SCharles.Forsyth FT_Int cur_ppem; /* ppem along the current proj vector */ 192*37da2899SCharles.Forsyth #endif 193*37da2899SCharles.Forsyth 194*37da2899SCharles.Forsyth FT_Bool instruction_trap; /* If `True', the interpreter will */ 195*37da2899SCharles.Forsyth /* exit after each instruction */ 196*37da2899SCharles.Forsyth 197*37da2899SCharles.Forsyth TT_GraphicsState default_GS; /* graphics state resulting from */ 198*37da2899SCharles.Forsyth /* the prep program */ 199*37da2899SCharles.Forsyth FT_Bool is_composite; /* true if the glyph is composite */ 200*37da2899SCharles.Forsyth FT_Bool pedantic_hinting; /* true if pedantic interpretation */ 201*37da2899SCharles.Forsyth 202*37da2899SCharles.Forsyth /* latest interpreter additions */ 203*37da2899SCharles.Forsyth 204*37da2899SCharles.Forsyth FT_Long F_dot_P; /* dot product of freedom and projection */ 205*37da2899SCharles.Forsyth /* vectors */ 206*37da2899SCharles.Forsyth TT_Round_Func func_round; /* current rounding function */ 207*37da2899SCharles.Forsyth 208*37da2899SCharles.Forsyth TT_Project_Func func_project, /* current projection function */ 209*37da2899SCharles.Forsyth func_dualproj, /* current dual proj. function */ 210*37da2899SCharles.Forsyth func_freeProj; /* current freedom proj. func */ 211*37da2899SCharles.Forsyth 212*37da2899SCharles.Forsyth TT_Move_Func func_move; /* current point move function */ 213*37da2899SCharles.Forsyth 214*37da2899SCharles.Forsyth TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ 215*37da2899SCharles.Forsyth TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ 216*37da2899SCharles.Forsyth TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ 217*37da2899SCharles.Forsyth 218*37da2899SCharles.Forsyth FT_ULong loadSize; 219*37da2899SCharles.Forsyth TT_SubGlyph_Stack loadStack; /* loading subglyph stack */ 220*37da2899SCharles.Forsyth 221*37da2899SCharles.Forsyth } TT_ExecContextRec; 222*37da2899SCharles.Forsyth 223*37da2899SCharles.Forsyth 224*37da2899SCharles.Forsyth extern const TT_GraphicsState tt_default_graphics_state; 225*37da2899SCharles.Forsyth 226*37da2899SCharles.Forsyth 227*37da2899SCharles.Forsyth FT_LOCAL( FT_Error ) 228*37da2899SCharles.Forsyth TT_Goto_CodeRange( TT_ExecContext exec, 229*37da2899SCharles.Forsyth FT_Int range, 230*37da2899SCharles.Forsyth FT_Long IP ); 231*37da2899SCharles.Forsyth 232*37da2899SCharles.Forsyth FT_LOCAL( FT_Error ) 233*37da2899SCharles.Forsyth TT_Set_CodeRange( TT_ExecContext exec, 234*37da2899SCharles.Forsyth FT_Int range, 235*37da2899SCharles.Forsyth void* base, 236*37da2899SCharles.Forsyth FT_Long length ); 237*37da2899SCharles.Forsyth 238*37da2899SCharles.Forsyth FT_LOCAL( FT_Error ) 239*37da2899SCharles.Forsyth TT_Clear_CodeRange( TT_ExecContext exec, 240*37da2899SCharles.Forsyth FT_Int range ); 241*37da2899SCharles.Forsyth 242*37da2899SCharles.Forsyth 243*37da2899SCharles.Forsyth /*************************************************************************/ 244*37da2899SCharles.Forsyth /* */ 245*37da2899SCharles.Forsyth /* <Function> */ 246*37da2899SCharles.Forsyth /* TT_New_Context */ 247*37da2899SCharles.Forsyth /* */ 248*37da2899SCharles.Forsyth /* <Description> */ 249*37da2899SCharles.Forsyth /* Queries the face context for a given font. Note that there is */ 250*37da2899SCharles.Forsyth /* now a _single_ execution context in the TrueType driver which is */ 251*37da2899SCharles.Forsyth /* shared among faces. */ 252*37da2899SCharles.Forsyth /* */ 253*37da2899SCharles.Forsyth /* <Input> */ 254*37da2899SCharles.Forsyth /* face :: A handle to the source face object. */ 255*37da2899SCharles.Forsyth /* */ 256*37da2899SCharles.Forsyth /* <Return> */ 257*37da2899SCharles.Forsyth /* A handle to the execution context. Initialized for `face'. */ 258*37da2899SCharles.Forsyth /* */ 259*37da2899SCharles.Forsyth /* <Note> */ 260*37da2899SCharles.Forsyth /* Only the glyph loader and debugger should call this function. */ 261*37da2899SCharles.Forsyth /* */ 262*37da2899SCharles.Forsyth FT_EXPORT( TT_ExecContext ) 263*37da2899SCharles.Forsyth TT_New_Context( TT_Face face ); 264*37da2899SCharles.Forsyth 265*37da2899SCharles.Forsyth 266*37da2899SCharles.Forsyth FT_LOCAL( FT_Error ) 267*37da2899SCharles.Forsyth TT_Done_Context( TT_ExecContext exec ); 268*37da2899SCharles.Forsyth 269*37da2899SCharles.Forsyth FT_LOCAL( FT_Error ) 270*37da2899SCharles.Forsyth TT_Destroy_Context( TT_ExecContext exec, 271*37da2899SCharles.Forsyth FT_Memory memory ); 272*37da2899SCharles.Forsyth 273*37da2899SCharles.Forsyth FT_LOCAL( FT_Error ) 274*37da2899SCharles.Forsyth TT_Load_Context( TT_ExecContext exec, 275*37da2899SCharles.Forsyth TT_Face face, 276*37da2899SCharles.Forsyth TT_Size size ); 277*37da2899SCharles.Forsyth 278*37da2899SCharles.Forsyth FT_LOCAL( FT_Error ) 279*37da2899SCharles.Forsyth TT_Save_Context( TT_ExecContext exec, 280*37da2899SCharles.Forsyth TT_Size ins ); 281*37da2899SCharles.Forsyth 282*37da2899SCharles.Forsyth FT_LOCAL( FT_Error ) 283*37da2899SCharles.Forsyth TT_Run_Context( TT_ExecContext exec, 284*37da2899SCharles.Forsyth FT_Bool debug ); 285*37da2899SCharles.Forsyth 286*37da2899SCharles.Forsyth 287*37da2899SCharles.Forsyth /*************************************************************************/ 288*37da2899SCharles.Forsyth /* */ 289*37da2899SCharles.Forsyth /* <Function> */ 290*37da2899SCharles.Forsyth /* TT_RunIns */ 291*37da2899SCharles.Forsyth /* */ 292*37da2899SCharles.Forsyth /* <Description> */ 293*37da2899SCharles.Forsyth /* Executes one or more instruction in the execution context. This */ 294*37da2899SCharles.Forsyth /* is the main function of the TrueType opcode interpreter. */ 295*37da2899SCharles.Forsyth /* */ 296*37da2899SCharles.Forsyth /* <Input> */ 297*37da2899SCharles.Forsyth /* exec :: A handle to the target execution context. */ 298*37da2899SCharles.Forsyth /* */ 299*37da2899SCharles.Forsyth /* <Return> */ 300*37da2899SCharles.Forsyth /* FreeType error code. 0 means success. */ 301*37da2899SCharles.Forsyth /* */ 302*37da2899SCharles.Forsyth /* <Note> */ 303*37da2899SCharles.Forsyth /* Only the object manager and debugger should call this function. */ 304*37da2899SCharles.Forsyth /* */ 305*37da2899SCharles.Forsyth /* This function is publicly exported because it is directly */ 306*37da2899SCharles.Forsyth /* invoked by the TrueType debugger. */ 307*37da2899SCharles.Forsyth /* */ 308*37da2899SCharles.Forsyth FT_EXPORT( FT_Error ) 309*37da2899SCharles.Forsyth TT_RunIns( TT_ExecContext exec ); 310*37da2899SCharles.Forsyth 311*37da2899SCharles.Forsyth 312*37da2899SCharles.Forsyth FT_END_HEADER 313*37da2899SCharles.Forsyth 314*37da2899SCharles.Forsyth #endif /* __TTINTERP_H__ */ 315*37da2899SCharles.Forsyth 316*37da2899SCharles.Forsyth 317*37da2899SCharles.Forsyth /* END */ 318