xref: /inferno-os/libfreetype/ttinterp.h (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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