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
26FT_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
105    TT_DefRecord  *Def; /* either FDEF or IDEF */
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            subpixel;          /* Using subpixel hinting?       */
267    FT_Bool            ignore_x_mode;     /* Standard rendering mode for   */
268                                          /* subpixel hinting.  On if gray */
269                                          /* or subpixel hinting is on.    */
270
271    /* The following 4 aren't fully implemented but here for MS rasterizer */
272    /* compatibility.                                                      */
273    FT_Bool            compatible_widths;     /* compatible widths?        */
274    FT_Bool            symmetrical_smoothing; /* symmetrical_smoothing?    */
275    FT_Bool            bgr;                   /* bgr instead of rgb?       */
276    FT_Bool            subpixel_positioned;   /* subpixel positioned       */
277                                              /* (DirectWrite ClearType)?  */
278
279    FT_Int             rasterizer_version;    /* MS rasterizer version     */
280
281    FT_Bool            iup_called;            /* IUP called for glyph?     */
282
283    FT_ULong           sph_tweak_flags;       /* flags to control          */
284                                              /* hint tweaks               */
285
286    FT_ULong           sph_in_func_flags;     /* flags to indicate if in   */
287                                              /* special functions         */
288
289#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
290
291  } TT_ExecContextRec;
292
293
294  extern const TT_GraphicsState  tt_default_graphics_state;
295
296
297#ifdef TT_USE_BYTECODE_INTERPRETER
298  FT_LOCAL( FT_Error )
299  TT_Goto_CodeRange( TT_ExecContext  exec,
300                     FT_Int          range,
301                     FT_Long         IP );
302
303  FT_LOCAL( FT_Error )
304  TT_Set_CodeRange( TT_ExecContext  exec,
305                    FT_Int          range,
306                    void*           base,
307                    FT_Long         length );
308
309  FT_LOCAL( FT_Error )
310  TT_Clear_CodeRange( TT_ExecContext  exec,
311                      FT_Int          range );
312
313
314  FT_LOCAL( FT_Error )
315  Update_Max( FT_Memory  memory,
316              FT_ULong*  size,
317              FT_Long    multiplier,
318              void*      _pbuff,
319              FT_ULong   new_max );
320#endif /* TT_USE_BYTECODE_INTERPRETER */
321
322
323  /*************************************************************************/
324  /*                                                                       */
325  /* <Function>                                                            */
326  /*    TT_New_Context                                                     */
327  /*                                                                       */
328  /* <Description>                                                         */
329  /*    Queries the face context for a given font.  Note that there is     */
330  /*    now a _single_ execution context in the TrueType driver which is   */
331  /*    shared among faces.                                                */
332  /*                                                                       */
333  /* <Input>                                                               */
334  /*    face :: A handle to the source face object.                        */
335  /*                                                                       */
336  /* <Return>                                                              */
337  /*    A handle to the execution context.  Initialized for `face'.        */
338  /*                                                                       */
339  /* <Note>                                                                */
340  /*    Only the glyph loader and debugger should call this function.      */
341  /*                                                                       */
342  FT_EXPORT( TT_ExecContext )
343  TT_New_Context( TT_Driver  driver );
344
345
346#ifdef TT_USE_BYTECODE_INTERPRETER
347  FT_LOCAL( FT_Error )
348  TT_Done_Context( TT_ExecContext  exec );
349
350  FT_LOCAL( FT_Error )
351  TT_Load_Context( TT_ExecContext  exec,
352                   TT_Face         face,
353                   TT_Size         size );
354
355  FT_LOCAL( FT_Error )
356  TT_Save_Context( TT_ExecContext  exec,
357                   TT_Size         ins );
358
359  FT_LOCAL( FT_Error )
360  TT_Run_Context( TT_ExecContext  exec,
361                  FT_Bool         debug );
362#endif /* TT_USE_BYTECODE_INTERPRETER */
363
364
365  /*************************************************************************/
366  /*                                                                       */
367  /* <Function>                                                            */
368  /*    TT_RunIns                                                          */
369  /*                                                                       */
370  /* <Description>                                                         */
371  /*    Executes one or more instruction in the execution context.  This   */
372  /*    is the main function of the TrueType opcode interpreter.           */
373  /*                                                                       */
374  /* <Input>                                                               */
375  /*    exec :: A handle to the target execution context.                  */
376  /*                                                                       */
377  /* <Return>                                                              */
378  /*    FreeType error code.  0 means success.                             */
379  /*                                                                       */
380  /* <Note>                                                                */
381  /*    Only the object manager and debugger should call this function.    */
382  /*                                                                       */
383  /*    This function is publicly exported because it is directly          */
384  /*    invoked by the TrueType debugger.                                  */
385  /*                                                                       */
386  FT_EXPORT( FT_Error )
387  TT_RunIns( TT_ExecContext  exec );
388
389
390FT_END_HEADER
391
392#endif /* __TTINTERP_H__ */
393
394
395/* END */
396