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