1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  ttdriver.c                                                             */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    TrueType font driver implementation (body).                          */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*  Copyright 1996-2015 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
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h>
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_DEBUG_H
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_STREAM_H
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_SFNT_H
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include FT_SERVICE_FONT_FORMAT_H
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_MULTIPLE_MASTERS_H
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_MULTIPLE_MASTERS_H
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_TRUETYPE_ENGINE_H
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_TRUETYPE_GLYF_H
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_PROPERTIES_H
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_TRUETYPE_DRIVER_H
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttdriver.h"
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttgload.h"
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttpload.h"
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttgxvar.h"
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "tterrors.h"
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttpic.h"
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* messages during execution.                                            */
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef  FT_COMPONENT
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT  trace_ttdriver
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  PROPERTY SERVICE
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_property_set( FT_Module    module,         /* TT_Driver */
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   const char*  property_name,
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   const void*  value )
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error   error  = FT_Err_Ok;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_Driver  driver = (TT_Driver)module;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !ft_strcmp( property_name, "interpreter-version" ) )
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt*  interpreter_version = (FT_UInt*)value;
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef TT_CONFIG_OPTION_SUBPIXEL_HINTING
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( *interpreter_version != TT_INTERPRETER_VERSION_35 )
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        error = FT_ERR( Unimplemented_Feature );
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      else
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        driver->interpreter_version = *interpreter_version;
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return error;
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_TRACE0(( "tt_property_set: missing property `%s'\n",
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                property_name ));
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_THROW( Missing_Property );
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_property_get( FT_Module    module,         /* TT_Driver */
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   const char*  property_name,
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   const void*  value )
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error   error  = FT_Err_Ok;
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_Driver  driver = (TT_Driver)module;
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UInt  interpreter_version = driver->interpreter_version;
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !ft_strcmp( property_name, "interpreter-version" ) )
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt*  val = (FT_UInt*)value;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *val = interpreter_version;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return error;
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_TRACE0(( "tt_property_get: missing property `%s'\n",
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                property_name ));
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_THROW( Missing_Property );
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_PROPERTIESREC(
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_service_properties,
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Properties_SetFunc)tt_property_set,
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Properties_GetFunc)tt_property_get )
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                          F A C E S                              ****/
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Function>                                                            */
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    tt_get_kerning                                                     */
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    A driver method used to return the kerning vector between two      */
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    glyphs of the same face.                                           */
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Input>                                                               */
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    face        :: A handle to the source face object.                 */
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    right_glyph :: The index of the right glyph in the kern pair.      */
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Output>                                                              */
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    kerning     :: The kerning vector.  This is in font units for      */
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   scalable formats, and in pixels for fixed-sizes     */
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   formats.                                            */
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Return>                                                              */
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    FreeType error code.  0 means success.                             */
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Note>                                                                */
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    supported by this function.  Other layouts, or more sophisticated  */
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    kernings, are out of scope of this method (the basic driver        */
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    interface is meant to be simple).                                  */
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    They can be implemented by format-specific interfaces.             */
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_get_kerning( FT_Face     ttface,          /* TT_Face */
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_UInt     left_glyph,
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_UInt     right_glyph,
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_Vector*  kerning )
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_Face       face = (TT_Face)ttface;
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    kerning->x = 0;
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    kerning->y = 0;
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( sfnt )
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_get_advances( FT_Face    ttface,
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_UInt    start,
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_UInt    count,
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_Int32   flags,
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_Fixed  *advances )
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UInt  nn;
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_Face  face  = (TT_Face) ttface;
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* XXX: TODO: check for sbits */
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( flags & FT_LOAD_VERTICAL_LAYOUT )
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      for ( nn = 0; nn < count; nn++ )
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_Short   tsb;
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_UShort  ah;
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        /* since we don't need `tsb', we use zero for `yMax' parameter */
211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        TT_Get_VMetrics( face, start + nn, 0, &tsb, &ah );
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        advances[nn] = ah;
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      for ( nn = 0; nn < count; nn++ )
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_Short   lsb;
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_UShort  aw;
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        TT_Get_HMetrics( face, start + nn, &lsb, &aw );
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        advances[nn] = aw;
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_Err_Ok;
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                           S I Z E S                             ****/
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_size_select( FT_Size   size,
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_ULong  strike_index )
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_Face   ttface = (TT_Face)size->face;
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_Size   ttsize = (TT_Size)size;
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error  error  = FT_Err_Ok;
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ttsize->strike_index = strike_index;
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( FT_IS_SCALABLE( size->face ) )
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* use the scaled metrics, even when tt_size_reset fails */
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Select_Metrics( size->face, strike_index );
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      tt_size_reset( ttsize ); /* ignore return value */
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      SFNT_Service      sfnt    = (SFNT_Service) ttface->sfnt;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Size_Metrics*  metrics = &size->metrics;
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      error = sfnt->load_strike_metrics( ttface, strike_index, metrics );
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( error )
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ttsize->strike_index = 0xFFFFFFFFUL;
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_size_request( FT_Size          size,
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_Size_Request  req )
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_Size   ttsize = (TT_Size)size;
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error  error  = FT_Err_Ok;
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( FT_HAS_FIXED_SIZES( size->face ) )
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TT_Face       ttface = (TT_Face)size->face;
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      SFNT_Service  sfnt   = (SFNT_Service) ttface->sfnt;
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_ULong      strike_index;
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      error = sfnt->set_sbit_strike( ttface, req, &strike_index );
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( error )
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ttsize->strike_index = 0xFFFFFFFFUL;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      else
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return tt_size_select( size, strike_index );
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Request_Metrics( size->face, req );
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( FT_IS_SCALABLE( size->face ) )
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      error = tt_size_reset( ttsize );
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      ttsize->root.metrics = ttsize->metrics;
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Function>                                                            */
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    tt_glyph_load                                                      */
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    A driver method used to load a glyph within a given glyph slot.    */
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Input>                                                               */
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    slot        :: A handle to the target slot object where the glyph  */
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   will be loaded.                                     */
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    size        :: A handle to the source face size at which the glyph */
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   must be scaled, loaded, etc.                        */
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    glyph_index :: The index of the glyph in the font file.            */
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   FT_LOAD_XXX constants can be used to control the    */
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   glyph loading process (e.g., whether the outline    */
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   should be scaled, whether to load bitmaps or not,   */
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   whether to hint the outline, etc).                  */
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Return>                                                              */
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    FreeType error code.  0 means success.                             */
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_glyph_load( FT_GlyphSlot  ttslot,      /* TT_GlyphSlot */
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 FT_Size       ttsize,      /* TT_Size      */
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 FT_UInt       glyph_index,
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 FT_Int32      load_flags )
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_GlyphSlot  slot = (TT_GlyphSlot)ttslot;
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_Size       size = (TT_Size)ttsize;
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Face       face = ttslot->face;
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error      error;
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !slot )
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return FT_THROW( Invalid_Slot_Handle );
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !size )
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return FT_THROW( Invalid_Size_Handle );
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !face )
365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return FT_THROW( Invalid_Face_Handle );
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_INCREMENTAL
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( glyph_index >= (FT_UInt)face->num_glyphs &&
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         !face->internal->incremental_interface   )
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( glyph_index >= (FT_UInt)face->num_glyphs )
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return FT_THROW( Invalid_Argument );
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( load_flags & FT_LOAD_NO_HINTING )
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT   */
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* are necessary to disable hinting for tricky fonts */
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( FT_IS_TRICKY( face ) )
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        load_flags &= ~FT_LOAD_NO_HINTING;
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( load_flags & FT_LOAD_NO_AUTOHINT )
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        load_flags |= FT_LOAD_NO_HINTING;
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( !FT_IS_TRICKY( face ) )
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        load_flags |= FT_LOAD_NO_HINTING;
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* now load the glyph outline if necessary */
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* force drop-out mode to 2 - irrelevant now */
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* slot->outline.dropout_mode = 2; */
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                D R I V E R  I N T E R F A C E                   ****/
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_MULTIMASTERSREC(
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_service_gx_multi_masters,
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Get_MM_Func)        NULL,
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Set_MM_Design_Func) NULL,
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Set_MM_Blend_Func)  TT_Set_MM_Blend,
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Get_MM_Var_Func)    TT_Get_MM_Var,
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Set_Var_Design_Func)TT_Set_Var_Design )
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const FT_Service_TrueTypeEngineRec  tt_service_truetype_engine =
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_USE_BYTECODE_INTERPRETER
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_TRUETYPE_ENGINE_TYPE_PATENTED
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else /* !TT_USE_BYTECODE_INTERPRETER */
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_TRUETYPE_ENGINE_TYPE_NONE
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_USE_BYTECODE_INTERPRETER */
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_TTGLYFREC(
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_service_truetype_glyf,
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (TT_Glyf_GetLocationFunc)tt_face_get_location )
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICEDESCREC5(
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_services,
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FT_SERVICE_ID_FONT_FORMAT,     FT_FONT_FORMAT_TRUETYPE,
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_MULTI_MASTERS,   &TT_SERVICE_GX_MULTI_MASTERS_GET,
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET,
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_PROPERTIES,      &TT_SERVICE_PROPERTIES_GET )
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICEDESCREC4(
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_services,
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FT_SERVICE_ID_FONT_FORMAT,     FT_FONT_FORMAT_TRUETYPE,
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET,
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_PROPERTIES,      &TT_SERVICE_PROPERTIES_GET )
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_CALLBACK_DEF( FT_Module_Interface )
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_get_interface( FT_Module    driver,    /* TT_Driver */
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    const char*  tt_interface )
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Library           library;
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Module_Interface  result;
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Module            sfntd;
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SFNT_Service         sfnt;
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    /* TT_SERVICES_GET dereferences `library' in PIC mode */
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_PIC
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !driver )
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    library = driver->library;
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !library )
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface );
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( result != NULL )
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return result;
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CONFIG_OPTION_PIC
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !driver )
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    library = driver->library;
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !library )
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* only return the default interface from the SFNT module */
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfntd = FT_Get_Module( library, "sfnt" );
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( sfntd )
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( sfnt )
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return sfnt->get_interface( driver, tt_interface );
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* The FT_DriverInterface structure is defined in ftdriver.h. */
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_USE_BYTECODE_INTERPRETER
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TT_HINTER_FLAG  FT_MODULE_DRIVER_HAS_HINTER
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TT_HINTER_FLAG  0
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TT_SIZE_SELECT  tt_size_select
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TT_SIZE_SELECT  0
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_DRIVER(
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_driver_class,
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_MODULE_FONT_DRIVER     |
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_MODULE_DRIVER_SCALABLE |
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TT_HINTER_FLAG,
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      sizeof ( TT_DriverRec ),
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      "truetype",      /* driver name                           */
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      0x10000L,        /* driver version == 1.0                 */
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      0x20000L,        /* driver requires FreeType 2.0 or above */
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      (void*)0,        /* driver specific interface */
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      tt_driver_init,
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      tt_driver_done,
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      tt_get_interface,
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( TT_FaceRec ),
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( TT_SizeRec ),
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( FT_GlyphSlotRec ),
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_init,
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_done,
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_size_init,
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_size_done,
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_slot_init,
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    0,                       /* FT_Slot_DoneFunc */
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_glyph_load,
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_get_kerning,
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    0,                       /* FT_Face_AttachFunc */
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_get_advances,
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_size_request,
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_SIZE_SELECT
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
566