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