1 /***************************************************************************/
2 /*                                                                         */
3 /*  ttobjs.h                                                               */
4 /*                                                                         */
5 /*    Objects manager (specification).                                     */
6 /*                                                                         */
7 /*  Copyright 1996-2018 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 TTOBJS_H_
20 #define TTOBJS_H_
21 
22 
23 #include <ft2build.h>
24 #include FT_INTERNAL_OBJECTS_H
25 #include FT_INTERNAL_TRUETYPE_TYPES_H
26 
27 
28 FT_BEGIN_HEADER
29 
30 
31   /*************************************************************************/
32   /*                                                                       */
33   /* <Type>                                                                */
34   /*    TT_Driver                                                          */
35   /*                                                                       */
36   /* <Description>                                                         */
37   /*    A handle to a TrueType driver object.                              */
38   /*                                                                       */
39   typedef struct TT_DriverRec_*  TT_Driver;
40 
41 
42   /*************************************************************************/
43   /*                                                                       */
44   /* <Type>                                                                */
45   /*    TT_GlyphSlot                                                       */
46   /*                                                                       */
47   /* <Description>                                                         */
48   /*    A handle to a TrueType glyph slot object.                          */
49   /*                                                                       */
50   /* <Note>                                                                */
51   /*    This is a direct typedef of FT_GlyphSlot, as there is nothing      */
52   /*    specific about the TrueType glyph slot.                            */
53   /*                                                                       */
54   typedef FT_GlyphSlot  TT_GlyphSlot;
55 
56 
57   /*************************************************************************/
58   /*                                                                       */
59   /* <Struct>                                                              */
60   /*    TT_GraphicsState                                                   */
61   /*                                                                       */
62   /* <Description>                                                         */
63   /*    The TrueType graphics state used during bytecode interpretation.   */
64   /*                                                                       */
65   typedef struct  TT_GraphicsState_
66   {
67     FT_UShort      rp0;
68     FT_UShort      rp1;
69     FT_UShort      rp2;
70 
71     FT_UnitVector  dualVector;
72     FT_UnitVector  projVector;
73     FT_UnitVector  freeVector;
74 
75     FT_Long        loop;
76     FT_F26Dot6     minimum_distance;
77     FT_Int         round_state;
78 
79     FT_Bool        auto_flip;
80     FT_F26Dot6     control_value_cutin;
81     FT_F26Dot6     single_width_cutin;
82     FT_F26Dot6     single_width_value;
83     FT_UShort      delta_base;
84     FT_UShort      delta_shift;
85 
86     FT_Byte        instruct_control;
87     /* According to Greg Hitchcock from Microsoft, the `scan_control'     */
88     /* variable as documented in the TrueType specification is a 32-bit   */
89     /* integer; the high-word part holds the SCANTYPE value, the low-word */
90     /* part the SCANCTRL value.  We separate it into two fields.          */
91     FT_Bool        scan_control;
92     FT_Int         scan_type;
93 
94     FT_UShort      gep0;
95     FT_UShort      gep1;
96     FT_UShort      gep2;
97 
98   } TT_GraphicsState;
99 
100 
101 #ifdef TT_USE_BYTECODE_INTERPRETER
102 
103   FT_LOCAL( void )
104   tt_glyphzone_done( TT_GlyphZone  zone );
105 
106   FT_LOCAL( FT_Error )
107   tt_glyphzone_new( FT_Memory     memory,
108                     FT_UShort     maxPoints,
109                     FT_Short      maxContours,
110                     TT_GlyphZone  zone );
111 
112 #endif /* TT_USE_BYTECODE_INTERPRETER */
113 
114 
115 
116   /*************************************************************************/
117   /*                                                                       */
118   /*  EXECUTION SUBTABLES                                                  */
119   /*                                                                       */
120   /*  These sub-tables relate to instruction execution.                    */
121   /*                                                                       */
122   /*************************************************************************/
123 
124 
125 #define TT_MAX_CODE_RANGES  3
126 
127 
128   /*************************************************************************/
129   /*                                                                       */
130   /* There can only be 3 active code ranges at once:                       */
131   /*   - the Font Program                                                  */
132   /*   - the CVT Program                                                   */
133   /*   - a glyph's instructions set                                        */
134   /*                                                                       */
135   typedef enum  TT_CodeRange_Tag_
136   {
137     tt_coderange_none = 0,
138     tt_coderange_font,
139     tt_coderange_cvt,
140     tt_coderange_glyph
141 
142   } TT_CodeRange_Tag;
143 
144 
145   typedef struct  TT_CodeRange_
146   {
147     FT_Byte*  base;
148     FT_Long   size;
149 
150   } TT_CodeRange;
151 
152   typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];
153 
154 
155   /*************************************************************************/
156   /*                                                                       */
157   /* Defines a function/instruction definition record.                     */
158   /*                                                                       */
159   typedef struct  TT_DefRecord_
160   {
161     FT_Int    range;          /* in which code range is it located?     */
162     FT_Long   start;          /* where does it start?                   */
163     FT_Long   end;            /* where does it end?                     */
164     FT_UInt   opc;            /* function #, or instruction code        */
165     FT_Bool   active;         /* is it active?                          */
166     FT_Bool   inline_delta;   /* is function that defines inline delta? */
167     FT_ULong  sph_fdef_flags; /* flags to identify special functions    */
168 
169   } TT_DefRecord, *TT_DefArray;
170 
171 
172   /*************************************************************************/
173   /*                                                                       */
174   /* Subglyph transformation record.                                       */
175   /*                                                                       */
176   typedef struct  TT_Transform_
177   {
178     FT_Fixed    xx, xy;     /* transformation matrix coefficients */
179     FT_Fixed    yx, yy;
180     FT_F26Dot6  ox, oy;     /* offsets                            */
181 
182   } TT_Transform;
183 
184 
185   /*************************************************************************/
186   /*                                                                       */
187   /* A note regarding non-squared pixels:                                  */
188   /*                                                                       */
189   /* (This text will probably go into some docs at some time; for now, it  */
190   /* is kept here to explain some definitions in the TT_Size_Metrics       */
191   /* record).                                                              */
192   /*                                                                       */
193   /* The CVT is a one-dimensional array containing values that control     */
194   /* certain important characteristics in a font, like the height of all   */
195   /* capitals, all lowercase letter, default spacing or stem width/height. */
196   /*                                                                       */
197   /* These values are found in FUnits in the font file, and must be scaled */
198   /* to pixel coordinates before being used by the CVT and glyph programs. */
199   /* Unfortunately, when using distinct x and y resolutions (or distinct x */
200   /* and y pointsizes), there are two possible scalings.                   */
201   /*                                                                       */
202   /* A first try was to implement a `lazy' scheme where all values were    */
203   /* scaled when first used.  However, while some values are always used   */
204   /* in the same direction, some others are used under many different      */
205   /* circumstances and orientations.                                       */
206   /*                                                                       */
207   /* I have found a simpler way to do the same, and it even seems to work  */
208   /* in most of the cases:                                                 */
209   /*                                                                       */
210   /* - All CVT values are scaled to the maximum ppem size.                 */
211   /*                                                                       */
212   /* - When performing a read or write in the CVT, a ratio factor is used  */
213   /*   to perform adequate scaling.  Example:                              */
214   /*                                                                       */
215   /*     x_ppem = 14                                                       */
216   /*     y_ppem = 10                                                       */
217   /*                                                                       */
218   /*   We choose ppem = x_ppem = 14 as the CVT scaling size.  All cvt      */
219   /*   entries are scaled to it.                                           */
220   /*                                                                       */
221   /*     x_ratio = 1.0                                                     */
222   /*     y_ratio = y_ppem/ppem (< 1.0)                                     */
223   /*                                                                       */
224   /*   We compute the current ratio like:                                  */
225   /*                                                                       */
226   /*   - If projVector is horizontal,                                      */
227   /*       ratio = x_ratio = 1.0                                           */
228   /*                                                                       */
229   /*   - if projVector is vertical,                                        */
230   /*       ratio = y_ratio                                                 */
231   /*                                                                       */
232   /*   - else,                                                             */
233   /*       ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */
234   /*                                                                       */
235   /*   Reading a cvt value returns                                         */
236   /*     ratio * cvt[index]                                                */
237   /*                                                                       */
238   /*   Writing a cvt value in pixels:                                      */
239   /*     cvt[index] / ratio                                                */
240   /*                                                                       */
241   /*   The current ppem is simply                                          */
242   /*     ratio * ppem                                                      */
243   /*                                                                       */
244   /*************************************************************************/
245 
246 
247   /*************************************************************************/
248   /*                                                                       */
249   /* Metrics used by the TrueType size and context objects.                */
250   /*                                                                       */
251   typedef struct  TT_Size_Metrics_
252   {
253     /* for non-square pixels */
254     FT_Long     x_ratio;
255     FT_Long     y_ratio;
256 
257     FT_UShort   ppem;               /* maximum ppem size              */
258     FT_Long     ratio;              /* current ratio                  */
259     FT_Fixed    scale;
260 
261     FT_F26Dot6  compensations[4];   /* device-specific compensations  */
262 
263     FT_Bool     valid;
264 
265     FT_Bool     rotated;            /* `is the glyph rotated?'-flag   */
266     FT_Bool     stretched;          /* `is the glyph stretched?'-flag */
267 
268   } TT_Size_Metrics;
269 
270 
271   /*************************************************************************/
272   /*                                                                       */
273   /* TrueType size class.                                                  */
274   /*                                                                       */
275   typedef struct  TT_SizeRec_
276   {
277     FT_SizeRec         root;
278 
279     /* we have our own copy of metrics so that we can modify */
280     /* it without affecting auto-hinting (when used)         */
281     FT_Size_Metrics*   metrics;        /* for the current rendering mode */
282     FT_Size_Metrics    hinted_metrics; /* for the hinted rendering mode  */
283 
284     TT_Size_Metrics    ttmetrics;
285 
286     FT_ULong           strike_index;      /* 0xFFFFFFFF to indicate invalid */
287 
288 #ifdef TT_USE_BYTECODE_INTERPRETER
289 
290     FT_Long            point_size;    /* for the `MPS' bytecode instruction */
291 
292     FT_UInt            num_function_defs; /* number of function definitions */
293     FT_UInt            max_function_defs;
294     TT_DefArray        function_defs;     /* table of function definitions  */
295 
296     FT_UInt            num_instruction_defs;  /* number of ins. definitions */
297     FT_UInt            max_instruction_defs;
298     TT_DefArray        instruction_defs;      /* table of ins. definitions  */
299 
300     FT_UInt            max_func;
301     FT_UInt            max_ins;
302 
303     TT_CodeRangeTable  codeRangeTable;
304 
305     TT_GraphicsState   GS;
306 
307     FT_ULong           cvt_size;      /* the scaled control value table */
308     FT_Long*           cvt;
309 
310     FT_UShort          storage_size; /* The storage area is now part of */
311     FT_Long*           storage;      /* the instance                    */
312 
313     TT_GlyphZoneRec    twilight;     /* The instance's twilight zone    */
314 
315     TT_ExecContext     context;
316 
317     /* if negative, `fpgm' (resp. `prep'), wasn't executed yet; */
318     /* otherwise it is the returned error code                  */
319     FT_Error           bytecode_ready;
320     FT_Error           cvt_ready;
321 
322 #endif /* TT_USE_BYTECODE_INTERPRETER */
323 
324   } TT_SizeRec;
325 
326 
327   /*************************************************************************/
328   /*                                                                       */
329   /* TrueType driver class.                                                */
330   /*                                                                       */
331   typedef struct  TT_DriverRec_
332   {
333     FT_DriverRec  root;
334 
335     TT_GlyphZoneRec  zone;     /* glyph loader points zone */
336 
337     FT_UInt  interpreter_version;
338 
339   } TT_DriverRec;
340 
341 
342   /* Note: All of the functions below (except tt_size_reset()) are used    */
343   /* as function pointers in a FT_Driver_ClassRec.  Therefore their        */
344   /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face,  */
345   /* TT_Size, etc., so that the compiler can confirm that the types and    */
346   /* number of parameters are correct.  In all cases the FT_xxx types are  */
347   /* cast to their TT_xxx counterparts inside the functions since FreeType */
348   /* will always use the TT driver to create them.                         */
349 
350 
351   /*************************************************************************/
352   /*                                                                       */
353   /* Face functions                                                        */
354   /*                                                                       */
355   FT_LOCAL( FT_Error )
356   tt_face_init( FT_Stream      stream,
357                 FT_Face        ttface,      /* TT_Face */
358                 FT_Int         face_index,
359                 FT_Int         num_params,
360                 FT_Parameter*  params );
361 
362   FT_LOCAL( void )
363   tt_face_done( FT_Face  ttface );          /* TT_Face */
364 
365 
366   /*************************************************************************/
367   /*                                                                       */
368   /* Size functions                                                        */
369   /*                                                                       */
370   FT_LOCAL( FT_Error )
371   tt_size_init( FT_Size  ttsize );          /* TT_Size */
372 
373   FT_LOCAL( void )
374   tt_size_done( FT_Size  ttsize );          /* TT_Size */
375 
376 #ifdef TT_USE_BYTECODE_INTERPRETER
377 
378   FT_LOCAL( FT_Error )
379   tt_size_run_fpgm( TT_Size  size,
380                     FT_Bool  pedantic );
381 
382   FT_LOCAL( FT_Error )
383   tt_size_run_prep( TT_Size  size,
384                     FT_Bool  pedantic );
385 
386   FT_LOCAL( FT_Error )
387   tt_size_ready_bytecode( TT_Size  size,
388                           FT_Bool  pedantic );
389 
390 #endif /* TT_USE_BYTECODE_INTERPRETER */
391 
392   FT_LOCAL( FT_Error )
393   tt_size_reset( TT_Size  size,
394                  FT_Bool  only_height );
395 
396 
397   /*************************************************************************/
398   /*                                                                       */
399   /* Driver functions                                                      */
400   /*                                                                       */
401   FT_LOCAL( FT_Error )
402   tt_driver_init( FT_Module  ttdriver );    /* TT_Driver */
403 
404   FT_LOCAL( void )
405   tt_driver_done( FT_Module  ttdriver );    /* TT_Driver */
406 
407 
408   /*************************************************************************/
409   /*                                                                       */
410   /* Slot functions                                                        */
411   /*                                                                       */
412   FT_LOCAL( FT_Error )
413   tt_slot_init( FT_GlyphSlot  slot );
414 
415 
416   /* auxiliary */
417 #define IS_HINTED( flags )  ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
418 
419 
420 FT_END_HEADER
421 
422 #endif /* TTOBJS_H_ */
423 
424 
425 /* END */
426