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