This commit was manufactured by cvs2svn to create branch 'captive'.
[reactos.git] / subsys / win32k / freetype / src / truetype / ttinterp.h
1 /***************************************************************************/
2 /*                                                                         */
3 /*  ttinterp.h                                                             */
4 /*                                                                         */
5 /*    TrueType bytecode interpreter (specification).                       */
6 /*                                                                         */
7 /*  Copyright 1996-2000 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
23 #ifdef FT_FLAT_COMPILE
24
25 #include "ttobjs.h"
26
27 #else
28
29 #include <freetype/src/truetype/ttobjs.h>
30
31 #endif
32
33
34 #ifdef __cplusplus
35   extern "C" {
36 #endif
37
38
39 #ifndef TT_CONFIG_OPTION_STATIC_INTEPRETER  /* indirect implementation */
40
41 #define EXEC_OP_   TT_ExecContext  exc,
42 #define EXEC_OP    TT_ExecContext  exc
43 #define EXEC_ARG_  exc,
44 #define EXEC_ARG   exc
45
46 #else                                       /* static implementation */
47
48 #define EXEC_OP_   /* void */
49 #define EXEC_OP    /* void */
50 #define EXEC_ARG_  /* void */
51 #define EXEC_ARG   /* void */
52
53 #endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
54
55
56   /*************************************************************************/
57   /*                                                                       */
58   /* Rounding mode constants.                                              */
59   /*                                                                       */
60 #define TT_Round_Off             5
61 #define TT_Round_To_Half_Grid    0
62 #define TT_Round_To_Grid         1
63 #define TT_Round_To_Double_Grid  2
64 #define TT_Round_Up_To_Grid      4
65 #define TT_Round_Down_To_Grid    3
66 #define TT_Round_Super           6
67 #define TT_Round_Super_45        7
68
69
70   /*************************************************************************/
71   /*                                                                       */
72   /* Function types used by the interpreter, depending on various modes    */
73   /* (e.g. the rounding mode, whether to render a vertical or horizontal   */
74   /* line etc).                                                            */
75   /*                                                                       */
76   /*************************************************************************/
77
78   /* Rounding function */
79   typedef FT_F26Dot6  (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6  distance,
80                                                  FT_F26Dot6  compensation );
81
82   /* Point displacement along the freedom vector routine */
83   typedef void  (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone*  zone,
84                                           FT_UInt        point,
85                                           FT_F26Dot6     distance );
86
87   /* Distance projection along one of the projection vectors */
88   typedef FT_F26Dot6  (*TT_Project_Func)( EXEC_OP_ FT_Vector*  v1,
89                                                    FT_Vector*  v2 );
90
91   /* reading a cvt value.  Take care of non-square pixels if necessary */
92   typedef FT_F26Dot6  (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong  index );
93
94   /* setting or moving a cvt value.  Take care of non-square pixels  */
95   /* if necessary                                                    */
96   typedef void  (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong    index,
97                                              FT_F26Dot6  value );
98
99
100   /*************************************************************************/
101   /*                                                                       */
102   /* This structure defines a call record, used to manage function calls.  */
103   /*                                                                       */
104   typedef struct  TT_CallRec_
105   {
106     FT_Int   Caller_Range;
107     FT_Long  Caller_IP;
108     FT_Long  Cur_Count;
109     FT_Long  Cur_Restart;
110
111   } TT_CallRec, *TT_CallStack;
112
113
114   /*************************************************************************/
115   /*                                                                       */
116   /* The main structure for the interpreter which collects all necessary   */
117   /* variables and states.                                                 */
118   /*                                                                       */
119   typedef struct  TT_ExecContextRec_
120   {
121     TT_Face         face;
122     TT_Size         size;
123     FT_Memory       memory;
124
125     /* instructions state */
126
127     FT_Error        error;      /* last execution error */
128
129     FT_Long         top;        /* top of exec. stack   */
130
131     FT_UInt         stackSize;  /* size of exec. stack  */
132     FT_Long*        stack;      /* current exec. stack  */
133
134     FT_Long         args;
135     FT_UInt         new_top;    /* new top after exec.  */
136
137     TT_GlyphZone    zp0,        /* zone records */
138                     zp1,
139                     zp2,
140                     pts,
141                     twilight;
142
143     FT_Size_Metrics  metrics;
144     TT_Size_Metrics  tt_metrics; /* size metrics */
145
146     TT_GraphicsState  GS;         /* current graphics state */
147
148     FT_Int          curRange;  /* current code range number   */
149     FT_Byte*        code;      /* current code range          */
150     FT_Long         IP;        /* current instruction pointer */
151     FT_Long         codeSize;  /* size of current range       */
152
153     FT_Byte         opcode;    /* current opcode              */
154     FT_Int          length;    /* length of current opcode    */
155
156     FT_Bool         step_ins;  /* true if the interpreter must */
157                                /* increment IP after ins. exec */
158     FT_Long         cvtSize;
159     FT_Long*        cvt;
160
161     FT_UInt         glyphSize; /* glyph instructions buffer size */
162     FT_Byte*        glyphIns;  /* glyph instructions buffer */
163
164     FT_UInt         numFDefs;  /* number of function defs         */
165     FT_UInt         maxFDefs;  /* maximum number of function defs */
166     TT_DefArray     FDefs;     /* table of FDefs entries          */
167
168     FT_UInt         numIDefs;  /* number of instruction defs */
169     FT_UInt         maxIDefs;  /* maximum number of ins defs */
170     TT_DefArray     IDefs;     /* table of IDefs entries     */
171
172     FT_UInt         maxFunc;   /* maximum function index     */
173     FT_UInt         maxIns;    /* maximum instruction index  */
174
175     FT_Int          callTop,    /* top of call stack during execution */
176                     callSize;   /* size of call stack */
177     TT_CallStack    callStack;  /* call stack */
178
179     FT_UShort       maxPoints;    /* capacity of this context's `pts' */
180     FT_Short        maxContours;  /* record, expressed in points and  */
181                                   /* contours.                        */
182
183     TT_CodeRangeTable  codeRangeTable;  /* table of valid code ranges */
184                                         /* useful for the debugger   */
185
186     FT_UShort       storeSize;  /* size of current storage */
187     FT_Long*        storage;    /* storage area            */
188
189     FT_F26Dot6      period;     /* values used for the */
190     FT_F26Dot6      phase;      /* `SuperRounding'     */
191     FT_F26Dot6      threshold;
192
193 #if 0
194     /* this seems to be unused */
195     FT_Int          cur_ppem;       /* ppem along the current proj vector */
196 #endif
197
198     FT_Bool         instruction_trap;  /* If `True', the interpreter will */
199                                        /* exit after each instruction     */
200
201     TT_GraphicsState  default_GS;      /* graphics state resulting from    */
202                                        /* the prep program                 */
203     FT_Bool          is_composite;     /* true if the glyph is composite   */
204     FT_Bool          pedantic_hinting; /* true for pedantic interpretation */
205
206     /* latest interpreter additions */
207
208     FT_Long            F_dot_P;    /* dot product of freedom and projection */
209                                    /* vectors                               */
210     TT_Round_Func      func_round; /* current rounding function             */
211
212     TT_Project_Func    func_project,   /* current projection function */
213                        func_dualproj,  /* current dual proj. function */
214                        func_freeProj;  /* current freedom proj. func  */
215
216     TT_Move_Func       func_move;      /* current point move function */
217
218     TT_Get_CVT_Func    func_read_cvt;  /* read a cvt entry              */
219     TT_Set_CVT_Func    func_write_cvt; /* write a cvt entry (in pixels) */
220     TT_Set_CVT_Func    func_move_cvt;  /* incr a cvt entry (in pixels)  */
221
222     FT_ULong           loadSize;
223     TT_SubGlyph_Stack  loadStack;      /* loading subglyph stack */
224
225   } TT_ExecContextRec;
226
227
228   extern const TT_GraphicsState  tt_default_graphics_state;
229
230
231   LOCAL_DEF
232   FT_Error  TT_Goto_CodeRange( TT_ExecContext  exec,
233                                FT_Int          range,
234                                FT_Long         IP );
235
236   LOCAL_DEF
237   FT_Error  TT_Set_CodeRange( TT_ExecContext  exec,
238                               FT_Int          range,
239                               void*           base,
240                               FT_Long         length );
241
242   LOCAL_DEF
243   FT_Error  TT_Clear_CodeRange( TT_ExecContext  exec,
244                                 FT_Int          range );
245
246   FT_EXPORT_DEF( TT_ExecContext )  TT_New_Context( TT_Face  face );
247
248   LOCAL_DEF
249   FT_Error  TT_Done_Context( TT_ExecContext  exec );
250
251   LOCAL_DEF
252   FT_Error  TT_Destroy_Context( TT_ExecContext  exec,
253                                 FT_Memory       memory );
254
255   LOCAL_DEF
256   FT_Error  TT_Load_Context( TT_ExecContext  exec,
257                              TT_Face         face,
258                              TT_Size         size );
259
260   LOCAL_DEF
261   FT_Error  TT_Save_Context( TT_ExecContext  exec,
262                              TT_Size         ins );
263
264   LOCAL_DEF
265   FT_Error  TT_Run_Context( TT_ExecContext  exec,
266                             FT_Bool         debug );
267
268   FT_EXPORT_DEF( FT_Error )  TT_RunIns( TT_ExecContext  exec );
269
270
271 #ifdef __cplusplus
272   }
273 #endif
274
275 #endif /* TTINTERP_H */
276
277
278 /* END */