1 /***************************************************************************/ 2 /* */ 3 /* ttinterp.h */ 4 /* */ 5 /* TrueType bytecode interpreter (specification). */ 6 /* */ 7 /* Copyright 1996-2015 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 __TTINTERP_H__ 20 #define __TTINTERP_H__ 21 22 #include <ft2build.h> 23 #include "ttobjs.h" 24 25 26 FT_BEGIN_HEADER 27 28 29 /*************************************************************************/ 30 /* */ 31 /* Rounding mode constants. */ 32 /* */ 33 #define TT_Round_Off 5 34 #define TT_Round_To_Half_Grid 0 35 #define TT_Round_To_Grid 1 36 #define TT_Round_To_Double_Grid 2 37 #define TT_Round_Up_To_Grid 4 38 #define TT_Round_Down_To_Grid 3 39 #define TT_Round_Super 6 40 #define TT_Round_Super_45 7 41 42 43 /*************************************************************************/ 44 /* */ 45 /* Function types used by the interpreter, depending on various modes */ 46 /* (e.g. the rounding mode, whether to render a vertical or horizontal */ 47 /* line etc). */ 48 /* */ 49 /*************************************************************************/ 50 51 /* Rounding function */ 52 typedef FT_F26Dot6 53 (*TT_Round_Func)( TT_ExecContext exc, 54 FT_F26Dot6 distance, 55 FT_F26Dot6 compensation ); 56 57 /* Point displacement along the freedom vector routine */ 58 typedef void 59 (*TT_Move_Func)( TT_ExecContext exc, 60 TT_GlyphZone zone, 61 FT_UShort point, 62 FT_F26Dot6 distance ); 63 64 /* Distance projection along one of the projection vectors */ 65 typedef FT_F26Dot6 66 (*TT_Project_Func)( TT_ExecContext exc, 67 FT_Pos dx, 68 FT_Pos dy ); 69 70 /* getting current ppem. Take care of non-square pixels if necessary */ 71 typedef FT_Long 72 (*TT_Cur_Ppem_Func)( TT_ExecContext exc ); 73 74 /* reading a cvt value. Take care of non-square pixels if necessary */ 75 typedef FT_F26Dot6 76 (*TT_Get_CVT_Func)( TT_ExecContext exc, 77 FT_ULong idx ); 78 79 /* setting or moving a cvt value. Take care of non-square pixels */ 80 /* if necessary */ 81 typedef void 82 (*TT_Set_CVT_Func)( TT_ExecContext exc, 83 FT_ULong idx, 84 FT_F26Dot6 value ); 85 86 87 /*************************************************************************/ 88 /* */ 89 /* This structure defines a call record, used to manage function calls. */ 90 /* */ 91 typedef struct TT_CallRec_ 92 { 93 FT_Int Caller_Range; 94 FT_Long Caller_IP; 95 FT_Long Cur_Count; 96 97 TT_DefRecord *Def; /* either FDEF or IDEF */ 98 99 } TT_CallRec, *TT_CallStack; 100 101 102 #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 103 104 /*************************************************************************/ 105 /* */ 106 /* These structures define rules used to tweak subpixel hinting for */ 107 /* various fonts. "", 0, "", NULL value indicates to match any value. */ 108 /* */ 109 110 #define SPH_MAX_NAME_SIZE 32 111 #define SPH_MAX_CLASS_MEMBERS 100 112 113 typedef struct SPH_TweakRule_ 114 { 115 const char family[SPH_MAX_NAME_SIZE]; 116 const FT_UInt ppem; 117 const char style[SPH_MAX_NAME_SIZE]; 118 const FT_ULong glyph; 119 120 } SPH_TweakRule; 121 122 123 typedef struct SPH_ScaleRule_ 124 { 125 const char family[SPH_MAX_NAME_SIZE]; 126 const FT_UInt ppem; 127 const char style[SPH_MAX_NAME_SIZE]; 128 const FT_ULong glyph; 129 const FT_ULong scale; 130 131 } SPH_ScaleRule; 132 133 134 typedef struct SPH_Font_Class_ 135 { 136 const char name[SPH_MAX_NAME_SIZE]; 137 const char member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE]; 138 139 } SPH_Font_Class; 140 141 #endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 142 143 144 /*************************************************************************/ 145 /* */ 146 /* The main structure for the interpreter which collects all necessary */ 147 /* variables and states. */ 148 /* */ 149 typedef struct TT_ExecContextRec_ 150 { 151 TT_Face face; 152 TT_Size size; 153 FT_Memory memory; 154 155 /* instructions state */ 156 157 FT_Error error; /* last execution error */ 158 159 FT_Long top; /* top of exec. stack */ 160 161 FT_Long stackSize; /* size of exec. stack */ 162 FT_Long* stack; /* current exec. stack */ 163 164 FT_Long args; 165 FT_Long new_top; /* new top after exec. */ 166 167 TT_GlyphZoneRec zp0, /* zone records */ 168 zp1, 169 zp2, 170 pts, 171 twilight; 172 173 FT_Size_Metrics metrics; 174 TT_Size_Metrics tt_metrics; /* size metrics */ 175 176 TT_GraphicsState GS; /* current graphics state */ 177 178 FT_Int curRange; /* current code range number */ 179 FT_Byte* code; /* current code range */ 180 FT_Long IP; /* current instruction pointer */ 181 FT_Long codeSize; /* size of current range */ 182 183 FT_Byte opcode; /* current opcode */ 184 FT_Int length; /* length of current opcode */ 185 186 FT_Bool step_ins; /* true if the interpreter must */ 187 /* increment IP after ins. exec */ 188 FT_ULong cvtSize; 189 FT_Long* cvt; 190 191 FT_UInt glyphSize; /* glyph instructions buffer size */ 192 FT_Byte* glyphIns; /* glyph instructions buffer */ 193 194 FT_UInt numFDefs; /* number of function defs */ 195 FT_UInt maxFDefs; /* maximum number of function defs */ 196 TT_DefArray FDefs; /* table of FDefs entries */ 197 198 FT_UInt numIDefs; /* number of instruction defs */ 199 FT_UInt maxIDefs; /* maximum number of ins defs */ 200 TT_DefArray IDefs; /* table of IDefs entries */ 201 202 FT_UInt maxFunc; /* maximum function index */ 203 FT_UInt maxIns; /* maximum instruction index */ 204 205 FT_Int callTop, /* top of call stack during execution */ 206 callSize; /* size of call stack */ 207 TT_CallStack callStack; /* call stack */ 208 209 FT_UShort maxPoints; /* capacity of this context's `pts' */ 210 FT_Short maxContours; /* record, expressed in points and */ 211 /* contours. */ 212 213 TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */ 214 /* useful for the debugger */ 215 216 FT_UShort storeSize; /* size of current storage */ 217 FT_Long* storage; /* storage area */ 218 219 FT_F26Dot6 period; /* values used for the */ 220 FT_F26Dot6 phase; /* `SuperRounding' */ 221 FT_F26Dot6 threshold; 222 223 FT_Bool instruction_trap; /* If `True', the interpreter will */ 224 /* exit after each instruction */ 225 226 TT_GraphicsState default_GS; /* graphics state resulting from */ 227 /* the prep program */ 228 FT_Bool is_composite; /* true if the glyph is composite */ 229 FT_Bool pedantic_hinting; /* true if pedantic interpretation */ 230 231 /* latest interpreter additions */ 232 233 FT_Long F_dot_P; /* dot product of freedom and projection */ 234 /* vectors */ 235 TT_Round_Func func_round; /* current rounding function */ 236 237 TT_Project_Func func_project, /* current projection function */ 238 func_dualproj, /* current dual proj. function */ 239 func_freeProj; /* current freedom proj. func */ 240 241 TT_Move_Func func_move; /* current point move function */ 242 TT_Move_Func func_move_orig; /* move original position function */ 243 244 TT_Cur_Ppem_Func func_cur_ppem; /* get current proj. ppem value */ 245 246 TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ 247 TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ 248 TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ 249 250 FT_Bool grayscale; /* are we hinting for grayscale? */ 251 252 #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 253 TT_Round_Func func_round_sphn; /* subpixel rounding function */ 254 255 FT_Bool subpixel_hinting; /* Using subpixel hinting? */ 256 FT_Bool ignore_x_mode; /* Standard rendering mode for */ 257 /* subpixel hinting. On if gray */ 258 /* or subpixel hinting is on. */ 259 260 /* The following 6 aren't fully implemented but here for MS rasterizer */ 261 /* compatibility. */ 262 FT_Bool compatible_widths; /* compatible widths? */ 263 FT_Bool symmetrical_smoothing; /* symmetrical_smoothing? */ 264 FT_Bool bgr; /* bgr instead of rgb? */ 265 FT_Bool vertical_lcd; /* long side of LCD subpixel */ 266 /* rectangles is horizontal */ 267 FT_Bool subpixel_positioned; /* subpixel positioned */ 268 /* (DirectWrite ClearType)? */ 269 FT_Bool gray_cleartype; /* ClearType hinting but */ 270 /* grayscale rendering */ 271 272 FT_Int rasterizer_version; /* MS rasterizer version */ 273 274 FT_Bool iup_called; /* IUP called for glyph? */ 275 276 FT_ULong sph_tweak_flags; /* flags to control */ 277 /* hint tweaks */ 278 279 FT_ULong sph_in_func_flags; /* flags to indicate if in */ 280 /* special functions */ 281 282 #endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 283 284 } TT_ExecContextRec; 285 286 287 extern const TT_GraphicsState tt_default_graphics_state; 288 289 290 #ifdef TT_USE_BYTECODE_INTERPRETER 291 FT_LOCAL( void ) 292 TT_Goto_CodeRange( TT_ExecContext exec, 293 FT_Int range, 294 FT_Long IP ); 295 296 FT_LOCAL( void ) 297 TT_Set_CodeRange( TT_ExecContext exec, 298 FT_Int range, 299 void* base, 300 FT_Long length ); 301 302 FT_LOCAL( void ) 303 TT_Clear_CodeRange( TT_ExecContext exec, 304 FT_Int range ); 305 306 307 FT_LOCAL( FT_Error ) 308 Update_Max( FT_Memory memory, 309 FT_ULong* size, 310 FT_ULong multiplier, 311 void* _pbuff, 312 FT_ULong new_max ); 313 #endif /* TT_USE_BYTECODE_INTERPRETER */ 314 315 316 /*************************************************************************/ 317 /* */ 318 /* <Function> */ 319 /* TT_New_Context */ 320 /* */ 321 /* <Description> */ 322 /* Queries the face context for a given font. Note that there is */ 323 /* now a _single_ execution context in the TrueType driver which is */ 324 /* shared among faces. */ 325 /* */ 326 /* <Input> */ 327 /* face :: A handle to the source face object. */ 328 /* */ 329 /* <Return> */ 330 /* A handle to the execution context. Initialized for `face'. */ 331 /* */ 332 /* <Note> */ 333 /* Only the glyph loader and debugger should call this function. */ 334 /* (And right now only the glyph loader uses it.) */ 335 /* */ 336 FT_EXPORT( TT_ExecContext ) 337 TT_New_Context( TT_Driver driver ); 338 339 340 #ifdef TT_USE_BYTECODE_INTERPRETER 341 FT_LOCAL( void ) 342 TT_Done_Context( TT_ExecContext exec ); 343 344 FT_LOCAL( FT_Error ) 345 TT_Load_Context( TT_ExecContext exec, 346 TT_Face face, 347 TT_Size size ); 348 349 FT_LOCAL( void ) 350 TT_Save_Context( TT_ExecContext exec, 351 TT_Size ins ); 352 353 FT_LOCAL( FT_Error ) 354 TT_Run_Context( TT_ExecContext exec ); 355 #endif /* TT_USE_BYTECODE_INTERPRETER */ 356 357 358 /*************************************************************************/ 359 /* */ 360 /* <Function> */ 361 /* TT_RunIns */ 362 /* */ 363 /* <Description> */ 364 /* Executes one or more instruction in the execution context. This */ 365 /* is the main function of the TrueType opcode interpreter. */ 366 /* */ 367 /* <Input> */ 368 /* exec :: A handle to the target execution context. */ 369 /* */ 370 /* <Return> */ 371 /* FreeType error code. 0 means success. */ 372 /* */ 373 /* <Note> */ 374 /* Only the object manager and debugger should call this function. */ 375 /* */ 376 /* This function is publicly exported because it is directly */ 377 /* invoked by the TrueType debugger. */ 378 /* */ 379 FT_EXPORT( FT_Error ) 380 TT_RunIns( TT_ExecContext exec ); 381 382 383 FT_END_HEADER 384 385 #endif /* __TTINTERP_H__ */ 386 387 388 /* END */ 389