misc/libfreetype/src/truetype/ttinterp.h
changeset 5172 88f2e05288ba
equal deleted inserted replaced
5171:f9283dc4860d 5172:88f2e05288ba
       
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  ttinterp.h                                                             */
       
     4 /*                                                                         */
       
     5 /*    TrueType bytecode interpreter (specification).                       */
       
     6 /*                                                                         */
       
     7 /*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2010 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 
       
   106   } TT_CallRec, *TT_CallStack;
       
   107 
       
   108 
       
   109   /*************************************************************************/
       
   110   /*                                                                       */
       
   111   /* The main structure for the interpreter which collects all necessary   */
       
   112   /* variables and states.                                                 */
       
   113   /*                                                                       */
       
   114   typedef struct  TT_ExecContextRec_
       
   115   {
       
   116     TT_Face            face;
       
   117     TT_Size            size;
       
   118     FT_Memory          memory;
       
   119 
       
   120     /* instructions state */
       
   121 
       
   122     FT_Error           error;      /* last execution error */
       
   123 
       
   124     FT_Long            top;        /* top of exec. stack   */
       
   125 
       
   126     FT_UInt            stackSize;  /* size of exec. stack  */
       
   127     FT_Long*           stack;      /* current exec. stack  */
       
   128 
       
   129     FT_Long            args;
       
   130     FT_UInt            new_top;    /* new top after exec.  */
       
   131 
       
   132     TT_GlyphZoneRec    zp0,        /* zone records */
       
   133                        zp1,
       
   134                        zp2,
       
   135                        pts,
       
   136                        twilight;
       
   137 
       
   138     FT_Size_Metrics    metrics;
       
   139     TT_Size_Metrics    tt_metrics; /* size metrics */
       
   140 
       
   141     TT_GraphicsState   GS;         /* current graphics state */
       
   142 
       
   143     FT_Int             curRange;  /* current code range number   */
       
   144     FT_Byte*           code;      /* current code range          */
       
   145     FT_Long            IP;        /* current instruction pointer */
       
   146     FT_Long            codeSize;  /* size of current range       */
       
   147 
       
   148     FT_Byte            opcode;    /* current opcode              */
       
   149     FT_Int             length;    /* length of current opcode    */
       
   150 
       
   151     FT_Bool            step_ins;  /* true if the interpreter must */
       
   152                                   /* increment IP after ins. exec */
       
   153     FT_ULong           cvtSize;
       
   154     FT_Long*           cvt;
       
   155 
       
   156     FT_UInt            glyphSize; /* glyph instructions buffer size */
       
   157     FT_Byte*           glyphIns;  /* glyph instructions buffer */
       
   158 
       
   159     FT_UInt            numFDefs;  /* number of function defs         */
       
   160     FT_UInt            maxFDefs;  /* maximum number of function defs */
       
   161     TT_DefArray        FDefs;     /* table of FDefs entries          */
       
   162 
       
   163     FT_UInt            numIDefs;  /* number of instruction defs */
       
   164     FT_UInt            maxIDefs;  /* maximum number of ins defs */
       
   165     TT_DefArray        IDefs;     /* table of IDefs entries     */
       
   166 
       
   167     FT_UInt            maxFunc;   /* maximum function index     */
       
   168     FT_UInt            maxIns;    /* maximum instruction index  */
       
   169 
       
   170     FT_Int             callTop,    /* top of call stack during execution */
       
   171                        callSize;   /* size of call stack */
       
   172     TT_CallStack       callStack;  /* call stack */
       
   173 
       
   174     FT_UShort          maxPoints;    /* capacity of this context's `pts' */
       
   175     FT_Short           maxContours;  /* record, expressed in points and  */
       
   176                                      /* contours.                        */
       
   177 
       
   178     TT_CodeRangeTable  codeRangeTable;  /* table of valid code ranges */
       
   179                                         /* useful for the debugger   */
       
   180 
       
   181     FT_UShort          storeSize;  /* size of current storage */
       
   182     FT_Long*           storage;    /* storage area            */
       
   183 
       
   184     FT_F26Dot6         period;     /* values used for the */
       
   185     FT_F26Dot6         phase;      /* `SuperRounding'     */
       
   186     FT_F26Dot6         threshold;
       
   187 
       
   188 #if 0
       
   189     /* this seems to be unused */
       
   190     FT_Int             cur_ppem;   /* ppem along the current proj vector */
       
   191 #endif
       
   192 
       
   193     FT_Bool            instruction_trap; /* If `True', the interpreter will */
       
   194                                          /* exit after each instruction     */
       
   195 
       
   196     TT_GraphicsState   default_GS;       /* graphics state resulting from   */
       
   197                                          /* the prep program                */
       
   198     FT_Bool            is_composite;     /* true if the glyph is composite  */
       
   199     FT_Bool            pedantic_hinting; /* true if pedantic interpretation */
       
   200 
       
   201     /* latest interpreter additions */
       
   202 
       
   203     FT_Long            F_dot_P;    /* dot product of freedom and projection */
       
   204                                    /* vectors                               */
       
   205     TT_Round_Func      func_round; /* current rounding function             */
       
   206 
       
   207     TT_Project_Func    func_project,   /* current projection function */
       
   208                        func_dualproj,  /* current dual proj. function */
       
   209                        func_freeProj;  /* current freedom proj. func  */
       
   210 
       
   211     TT_Move_Func       func_move;      /* current point move function */
       
   212     TT_Move_Func       func_move_orig; /* move original position function */
       
   213 
       
   214     TT_Get_CVT_Func    func_read_cvt;  /* read a cvt entry              */
       
   215     TT_Set_CVT_Func    func_write_cvt; /* write a cvt entry (in pixels) */
       
   216     TT_Set_CVT_Func    func_move_cvt;  /* incr a cvt entry (in pixels)  */
       
   217 
       
   218     FT_Bool            grayscale;      /* are we hinting for grayscale? */
       
   219 
       
   220   } TT_ExecContextRec;
       
   221 
       
   222 
       
   223   extern const TT_GraphicsState  tt_default_graphics_state;
       
   224 
       
   225 
       
   226   FT_LOCAL( FT_Error )
       
   227   TT_Goto_CodeRange( TT_ExecContext  exec,
       
   228                      FT_Int          range,
       
   229                      FT_Long         IP );
       
   230 
       
   231   FT_LOCAL( FT_Error )
       
   232   TT_Set_CodeRange( TT_ExecContext  exec,
       
   233                     FT_Int          range,
       
   234                     void*           base,
       
   235                     FT_Long         length );
       
   236 
       
   237   FT_LOCAL( FT_Error )
       
   238   TT_Clear_CodeRange( TT_ExecContext  exec,
       
   239                       FT_Int          range );
       
   240 
       
   241 
       
   242   FT_LOCAL( FT_Error )
       
   243   Update_Max( FT_Memory  memory,
       
   244               FT_ULong*  size,
       
   245               FT_Long    multiplier,
       
   246               void*      _pbuff,
       
   247               FT_ULong   new_max );
       
   248 
       
   249 
       
   250   /*************************************************************************/
       
   251   /*                                                                       */
       
   252   /* <Function>                                                            */
       
   253   /*    TT_New_Context                                                     */
       
   254   /*                                                                       */
       
   255   /* <Description>                                                         */
       
   256   /*    Queries the face context for a given font.  Note that there is     */
       
   257   /*    now a _single_ execution context in the TrueType driver which is   */
       
   258   /*    shared among faces.                                                */
       
   259   /*                                                                       */
       
   260   /* <Input>                                                               */
       
   261   /*    face :: A handle to the source face object.                        */
       
   262   /*                                                                       */
       
   263   /* <Return>                                                              */
       
   264   /*    A handle to the execution context.  Initialized for `face'.        */
       
   265   /*                                                                       */
       
   266   /* <Note>                                                                */
       
   267   /*    Only the glyph loader and debugger should call this function.      */
       
   268   /*                                                                       */
       
   269   FT_EXPORT( TT_ExecContext )
       
   270   TT_New_Context( TT_Driver  driver );
       
   271 
       
   272   FT_LOCAL( FT_Error )
       
   273   TT_Done_Context( TT_ExecContext  exec );
       
   274 
       
   275   FT_LOCAL( FT_Error )
       
   276   TT_Load_Context( TT_ExecContext  exec,
       
   277                    TT_Face         face,
       
   278                    TT_Size         size );
       
   279 
       
   280   FT_LOCAL( FT_Error )
       
   281   TT_Save_Context( TT_ExecContext  exec,
       
   282                    TT_Size         ins );
       
   283 
       
   284   FT_LOCAL( FT_Error )
       
   285   TT_Run_Context( TT_ExecContext  exec,
       
   286                   FT_Bool         debug );
       
   287 
       
   288 
       
   289   /*************************************************************************/
       
   290   /*                                                                       */
       
   291   /* <Function>                                                            */
       
   292   /*    TT_RunIns                                                          */
       
   293   /*                                                                       */
       
   294   /* <Description>                                                         */
       
   295   /*    Executes one or more instruction in the execution context.  This   */
       
   296   /*    is the main function of the TrueType opcode interpreter.           */
       
   297   /*                                                                       */
       
   298   /* <Input>                                                               */
       
   299   /*    exec :: A handle to the target execution context.                  */
       
   300   /*                                                                       */
       
   301   /* <Return>                                                              */
       
   302   /*    FreeType error code.  0 means success.                             */
       
   303   /*                                                                       */
       
   304   /* <Note>                                                                */
       
   305   /*    Only the object manager and debugger should call this function.    */
       
   306   /*                                                                       */
       
   307   /*    This function is publicly exported because it is directly          */
       
   308   /*    invoked by the TrueType debugger.                                  */
       
   309   /*                                                                       */
       
   310   FT_EXPORT( FT_Error )
       
   311   TT_RunIns( TT_ExecContext  exec );
       
   312 
       
   313 
       
   314 FT_END_HEADER
       
   315 
       
   316 #endif /* __TTINTERP_H__ */
       
   317 
       
   318 
       
   319 /* END */