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