sfdriver.c revision ee451cb395940862dad63c85adfe8f2fd55e864c
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  sfdriver.c                                                             */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    High-level SFNT driver interface (body).                             */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  Copyright 1996-2007, 2009-2013 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#include "../../include/ft2build.h"
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftdebug.h"
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/sfnt.h"
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftobjs.h"
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sfdriver.h"
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttload.h"
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sfobjs.h"
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sfntpic.h"
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sferrors.h"
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttsbit.h"
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttpost.h"
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_BDF
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttbdf.h"
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svbdf.h"
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttcmap.h"
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttkern.h"
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttmtx.h"
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svgldict.h"
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svpostnm.h"
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svsfnt.h"
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svttcmap.h"
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* messages during execution.                                            */
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef  FT_COMPONENT
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT  trace_sfdriver
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  SFNT TABLE SERVICE
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void*
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  get_sfnt_table( TT_Face      face,
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_Sfnt_Tag  tag )
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void*  table;
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch ( tag )
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case ft_sfnt_head:
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      table = &face->header;
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case ft_sfnt_hhea:
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      table = &face->horizontal;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case ft_sfnt_vhea:
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      table = face->vertical_info ? &face->vertical : 0;
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case ft_sfnt_os2:
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      table = face->os2.version == 0xFFFFU ? 0 : &face->os2;
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case ft_sfnt_post:
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      table = &face->postscript;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case ft_sfnt_maxp:
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      table = &face->max_profile;
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case ft_sfnt_pclt:
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      table = face->pclt.Version ? &face->pclt : 0;
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    default:
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      table = 0;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return table;
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  sfnt_table_info( TT_Face    face,
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_UInt    idx,
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_ULong  *tag,
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_ULong  *offset,
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_ULong  *length )
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !offset || !length )
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return FT_THROW( Invalid_Argument );
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !tag )
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *length = face->num_tables;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx >= face->num_tables )
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FT_THROW( Table_Missing );
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *tag    = face->dir_tables[idx].Tag;
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *offset = face->dir_tables[idx].Offset;
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *length = face->dir_tables[idx].Length;
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_Err_Ok;
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_SFNT_TABLEREC(
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_service_sfnt_table,
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_SFNT_TableLoadFunc)tt_face_load_any,
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_SFNT_TableGetFunc) get_sfnt_table,
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_SFNT_TableInfoFunc)sfnt_table_info )
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  GLYPH DICT SERVICE
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  sfnt_get_glyph_name( TT_Face     face,
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       FT_UInt     glyph_index,
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       FT_Pointer  buffer,
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       FT_UInt     buffer_max )
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_String*  gname;
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error    error;
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = tt_face_get_ps_name( face, glyph_index, &gname );
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !error )
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_STRCPYN( buffer, gname, buffer_max );
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_UInt
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  sfnt_get_name_index( TT_Face     face,
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       FT_String*  glyph_name )
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Face  root = &face->root;
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UInt  i, max_gid = FT_UINT_MAX;
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( root->num_glyphs < 0 )
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return 0;
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX )
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      max_gid = (FT_UInt)root->num_glyphs;
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n",
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_UINT_MAX, root->num_glyphs ));
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for ( i = 0; i < max_gid; i++ )
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_String*  gname;
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Error    error = tt_face_get_ps_name( face, i, &gname );
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( error )
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        continue;
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( !ft_strcmp( glyph_name, gname ) )
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return i;
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_GLYPHDICTREC(
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_service_glyph_dict,
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_GlyphDict_GetNameFunc)  sfnt_get_glyph_name,
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index )
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  POSTSCRIPT NAME SERVICE
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const char*
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  sfnt_get_ps_name( TT_Face  face )
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Int       n, found_win, found_apple;
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const char*  result = NULL;
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* shouldn't happen, but just in case to avoid memory leaks */
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( face->postscript_name )
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return face->postscript_name;
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* scan the name table to see whether we have a Postscript name here, */
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* either in Macintosh or Windows platform encodings                  */
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    found_win   = -1;
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    found_apple = -1;
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for ( n = 0; n < face->num_names; n++ )
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TT_NameEntryRec*  name = face->name_table.names + n;
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( name->nameID == 6 && name->stringLength > 0 )
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( name->platformID == 3     &&
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             name->encodingID == 1     &&
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             name->languageID == 0x409 )
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          found_win = n;
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( name->platformID == 1 &&
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             name->encodingID == 0 &&
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             name->languageID == 0 )
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          found_apple = n;
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( found_win != -1 )
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Memory         memory = face->root.memory;
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TT_NameEntryRec*  name   = face->name_table.names + found_win;
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt           len    = name->stringLength / 2;
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Error          error  = FT_Err_Ok;
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UNUSED( error );
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( !FT_ALLOC( result, name->stringLength + 1 ) )
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_Stream   stream = face->name_table.stream;
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_String*  r      = (FT_String*)result;
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_Byte*    p      = (FT_Byte*)name->string;
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( FT_STREAM_SEEK( name->stringOffset ) ||
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             FT_FRAME_ENTER( name->stringLength ) )
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_FREE( result );
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          name->stringLength = 0;
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          name->stringOffset = 0;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_FREE( name->string );
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          goto Exit;
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        p = (FT_Byte*)stream->cursor;
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for ( ; len > 0; len--, p += 2 )
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 )
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            *r++ = p[1];
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *r = '\0';
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_FRAME_EXIT();
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      goto Exit;
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( found_apple != -1 )
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Memory         memory = face->root.memory;
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TT_NameEntryRec*  name   = face->name_table.names + found_apple;
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt           len    = name->stringLength;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Error          error  = FT_Err_Ok;
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UNUSED( error );
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( !FT_ALLOC( result, len + 1 ) )
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_Stream  stream = face->name_table.stream;
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( FT_STREAM_SEEK( name->stringOffset ) ||
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             FT_STREAM_READ( result, len )        )
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          name->stringOffset = 0;
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          name->stringLength = 0;
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_FREE( name->string );
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_FREE( result );
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          goto Exit;
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ((char*)result)[len] = '\0';
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Exit:
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    face->postscript_name = result;
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return result;
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_PSFONTNAMEREC(
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_service_ps_name,
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_PsName_GetFunc)sfnt_get_ps_name )
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  TT CMAP INFO
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_TTCMAPSREC(
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_service_get_cmap_info,
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (TT_CMap_Info_GetFunc)tt_get_cmap_info )
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_BDF
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  sfnt_get_charset_id( TT_Face       face,
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       const char*  *acharset_encoding,
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       const char*  *acharset_registry )
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BDF_PropertyRec  encoding, registry;
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error         error;
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* XXX: I don't know whether this is correct, since
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *      tt_face_find_bdf_prop only returns something correct if we have
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *      previously selected a size that is listed in the BDF table.
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *      Should we change the BDF table format to include single offsets
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *      for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry );
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !error )
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding );
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( !error )
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             encoding.type == BDF_PROPERTY_TYPE_ATOM )
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *acharset_encoding = encoding.u.atom;
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *acharset_registry = registry.u.atom;
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        else
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          error = FT_THROW( Invalid_Argument );
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_BDFRec(
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_service_bdf,
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id,
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop )
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_BDF */
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  SERVICE LIST
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICEDESCREC5(
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_services,
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICEDESCREC4(
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_services,
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined TT_CONFIG_OPTION_BDF
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICEDESCREC4(
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_services,
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICEDESCREC3(
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_services,
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_CALLBACK_DEF( FT_Module_Interface )
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  sfnt_get_interface( FT_Module    module,
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      const char*  module_interface )
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* SFNT_SERVICES_GET derefers `library' in PIC mode */
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_PIC
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Library  library;
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !module )
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    library = module->library;
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !library )
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UNUSED( module );
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface );
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PUT_EMBEDDED_BITMAPS( a )  a
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PUT_EMBEDDED_BITMAPS( a )  NULL
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PUT_PS_NAMES( a )  a
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PUT_PS_NAMES( a )  NULL
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SFNT_INTERFACE(
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_interface,
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_goto_table,
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_init_face,
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_load_face,
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_done_face,
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_get_interface,
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_any,
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_head,
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_hhea,
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_cmap,
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_maxp,
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_os2,
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_post,
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_name,
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_free_name,
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_kern,
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_gasp,
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_pclt,
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* see `ttload.h' */
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ),
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ),
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* see `ttpost.h' */
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PUT_PS_NAMES( tt_face_get_ps_name   ),
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PUT_PS_NAMES( tt_face_free_ps_names ),
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* since version 2.1.8 */
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_get_kerning,
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* since version 2.2 */
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_font_dir,
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_load_hmtx,
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* see `ttsbit.h' and `sfnt.h' */
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PUT_EMBEDDED_BITMAPS( tt_face_load_eblc ),
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PUT_EMBEDDED_BITMAPS( tt_face_free_eblc ),
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike     ),
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tt_face_get_metrics
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_MODULE(
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt_module_class,
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    0,  /* not a font driver or renderer */
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( FT_ModuleRec ),
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    "sfnt",     /* driver name                            */
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    0x10000L,   /* driver version 1.0                     */
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    0x20000L,   /* driver requires FreeType 2.0 or higher */
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (const void*)&SFNT_INTERFACE_GET,  /* module specific interface */
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Module_Constructor)0,
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Module_Destructor) 0,
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Module_Requester)  sfnt_get_interface )
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
530