1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  sfdriver.c                                                             */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    High-level SFNT driver interface (body).                             */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
79c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod/*  Copyright 1996-2007, 2009-2014 by                                      */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
20295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_INTERNAL_DEBUG_H
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_SFNT_H
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "sfdriver.h"
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttload.h"
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "sfobjs.h"
27295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "sfntpic.h"
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "sferrors.h"
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttsbit.h"
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttpost.h"
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_BDF
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttbdf.h"
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SERVICE_BDF_H
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttcmap.h"
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttkern.h"
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttmtx.h"
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SERVICE_GLYPH_DICT_H
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SERVICE_POSTSCRIPT_NAME_H
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SERVICE_SFNT_H
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SERVICE_TT_CMAP_H
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
53727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
54295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*************************************************************************/
55295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                       */
56295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
57295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
58295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* messages during execution.                                            */
59295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                       */
60295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#undef  FT_COMPONENT
61295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define FT_COMPONENT  trace_sfdriver
62295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
64727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*
65727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   *  SFNT TABLE SERVICE
66727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   *
67727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   */
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void*
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  get_sfnt_table( TT_Face      face,
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  FT_Sfnt_Tag  tag )
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    void*  table;
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( tag )
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case ft_sfnt_head:
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table = &face->header;
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case ft_sfnt_hhea:
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table = &face->horizontal;
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case ft_sfnt_vhea:
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table = face->vertical_info ? &face->vertical : 0;
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case ft_sfnt_os2:
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table = face->os2.version == 0xFFFFU ? 0 : &face->os2;
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case ft_sfnt_post:
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table = &face->postscript;
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case ft_sfnt_maxp:
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table = &face->max_profile;
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case ft_sfnt_pclt:
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table = face->pclt.Version ? &face->pclt : 0;
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table = 0;
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return table;
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_table_info( TT_Face    face,
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   FT_UInt    idx,
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   FT_ULong  *tag,
118295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                   FT_ULong  *offset,
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   FT_ULong  *length )
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
121aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( !offset || !length )
122727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return FT_THROW( Invalid_Argument );
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
124aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( !tag )
125aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      *length = face->num_tables;
126aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    else
127aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {
128aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( idx >= face->num_tables )
129727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return FT_THROW( Table_Missing );
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
131aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      *tag    = face->dir_tables[idx].Tag;
132aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      *offset = face->dir_tables[idx].Offset;
133aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      *length = face->dir_tables[idx].Length;
134aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
140727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICE_SFNT_TABLEREC(
141727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_service_sfnt_table,
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_SFNT_TableLoadFunc)tt_face_load_any,
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_SFNT_TableGetFunc) get_sfnt_table,
144727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_SFNT_TableInfoFunc)sfnt_table_info )
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
149727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*
150727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   *  GLYPH DICT SERVICE
151727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   *
152727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   */
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_get_glyph_name( TT_Face     face,
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_UInt     glyph_index,
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_Pointer  buffer,
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_UInt     buffer_max )
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_String*  gname;
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error    error;
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = tt_face_get_ps_name( face, glyph_index, &gname );
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_STRCPYN( buffer, gname, buffer_max );
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  static FT_UInt
1730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  sfnt_get_name_index( TT_Face     face,
1740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project                       FT_String*  glyph_name )
1750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  {
176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Face  root = &face->root;
177727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
178727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UInt  i, max_gid = FT_UINT_MAX;
179295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
1800a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
181295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( root->num_glyphs < 0 )
182295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return 0;
183727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX )
184727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      max_gid = (FT_UInt)root->num_glyphs;
185295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    else
186295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n",
187727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  FT_UINT_MAX, root->num_glyphs ));
1880a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
189295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    for ( i = 0; i < max_gid; i++ )
1900a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    {
1910a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      FT_String*  gname;
1920a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      FT_Error    error = tt_face_get_ps_name( face, i, &gname );
1930a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
1940a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
1950a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      if ( error )
1960a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        continue;
1970a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
1980a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      if ( !ft_strcmp( glyph_name, gname ) )
199295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        return i;
2000a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    }
2010a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
2020a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    return 0;
2030a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  }
2040a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
2050a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
206727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICE_GLYPHDICTREC(
207727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_service_glyph_dict,
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_GlyphDict_GetNameFunc)  sfnt_get_glyph_name,
209727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index )
210727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*
216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   *  POSTSCRIPT NAME SERVICE
217727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   *
218727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   */
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static const char*
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_get_ps_name( TT_Face  face )
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int       n, found_win, found_apple;
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    const char*  result = NULL;
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* shouldn't happen, but just in case to avoid memory leaks */
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( face->postscript_name )
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return face->postscript_name;
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* scan the name table to see whether we have a Postscript name here, */
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* either in Macintosh or Windows platform encodings                  */
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    found_win   = -1;
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    found_apple = -1;
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < face->num_names; n++ )
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      TT_NameEntryRec*  name = face->name_table.names + n;
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( name->nameID == 6 && name->stringLength > 0 )
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( name->platformID == 3     &&
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             name->encodingID == 1     &&
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             name->languageID == 0x409 )
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          found_win = n;
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( name->platformID == 1 &&
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             name->encodingID == 0 &&
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             name->languageID == 0 )
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          found_apple = n;
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( found_win != -1 )
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory         memory = face->root.memory;
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      TT_NameEntryRec*  name   = face->name_table.names + found_win;
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt           len    = name->stringLength / 2;
260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_Error          error  = FT_Err_Ok;
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UNUSED( error );
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !FT_ALLOC( result, name->stringLength + 1 ) )
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Stream   stream = face->name_table.stream;
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_String*  r      = (FT_String*)result;
2699c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        FT_Byte*    p;
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( FT_STREAM_SEEK( name->stringOffset ) ||
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_FRAME_ENTER( name->stringLength ) )
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_FREE( result );
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          name->stringLength = 0;
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          name->stringOffset = 0;
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_FREE( name->string );
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        p = (FT_Byte*)stream->cursor;
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( ; len > 0; len--, p += 2 )
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 )
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            *r++ = p[1];
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *r = '\0';
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_EXIT();
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( found_apple != -1 )
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory         memory = face->root.memory;
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      TT_NameEntryRec*  name   = face->name_table.names + found_apple;
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt           len    = name->stringLength;
302727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_Error          error  = FT_Err_Ok;
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UNUSED( error );
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !FT_ALLOC( result, len + 1 ) )
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Stream  stream = face->name_table.stream;
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( FT_STREAM_SEEK( name->stringOffset ) ||
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_STREAM_READ( result, len )        )
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          name->stringOffset = 0;
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          name->stringLength = 0;
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_FREE( name->string );
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_FREE( result );
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ((char*)result)[len] = '\0';
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->postscript_name = result;
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
330727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
331727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICE_PSFONTNAMEREC(
332727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_service_ps_name,
333727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_PsName_GetFunc)sfnt_get_ps_name )
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  TT CMAP INFO
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
339727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICE_TTCMAPSREC(
340727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    tt_service_get_cmap_info,
341727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (TT_CMap_Info_GetFunc)tt_get_cmap_info )
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_BDF
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_get_charset_id( TT_Face       face,
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       const char*  *acharset_encoding,
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       const char*  *acharset_registry )
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    BDF_PropertyRec  encoding, registry;
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error         error;
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: I don't know whether this is correct, since
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     *      tt_face_find_bdf_prop only returns something correct if we have
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     *      previously selected a size that is listed in the BDF table.
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     *      Should we change the BDF table format to include single offsets
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     *      for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     */
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry );
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding );
365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !error )
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             encoding.type == BDF_PROPERTY_TYPE_ATOM )
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          *acharset_encoding = encoding.u.atom;
371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          *acharset_registry = registry.u.atom;
372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          error = FT_THROW( Invalid_Argument );
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
382727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICE_BDFRec(
383727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_service_bdf,
384727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id,
385727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop )
386727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_BDF */
389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  SERVICE LIST
393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
395295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF
396727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICEDESCREC5(
397727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_services,
398727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
399727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
400727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,
401727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,
402727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
403295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES
404727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICEDESCREC4(
405727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_services,
406727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
407727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
408727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,
409727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
410295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#elif defined TT_CONFIG_OPTION_BDF
411727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICEDESCREC4(
412727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_services,
413727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
414727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
415727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,
416727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
417295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else
418727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICEDESCREC3(
419727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_services,
420727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
421727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
422727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_Module_Interface )
427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_get_interface( FT_Module    module,
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      const char*  module_interface )
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
430727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* SFNT_SERVICES_GET derefers `library' in PIC mode */
43141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#ifdef FT_CONFIG_OPTION_PIC
43241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Library  library;
43341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
43541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( !module )
43641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      return NULL;
43741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    library = module->library;
43841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( !library )
43941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      return NULL;
44041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#else
44141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UNUSED( module );
44241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#endif
443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
444727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface );
445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
448295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
449727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define PUT_EMBEDDED_BITMAPS( a )  a
450295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else
451727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define PUT_EMBEDDED_BITMAPS( a )  NULL
452295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif
453727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
454295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
455727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define PUT_PS_NAMES( a )  a
456295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else
457727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define PUT_PS_NAMES( a )  NULL
458295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif
459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
460727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SFNT_INTERFACE(
461727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_interface,
462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_goto_table,
463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sfnt_init_face,
465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sfnt_load_face,
466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sfnt_done_face,
467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sfnt_get_interface,
468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_any,
470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_head,
472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_hhea,
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_cmap,
474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_maxp,
475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_os2,
476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_post,
477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_name,
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_free_name,
480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_kern,
482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_gasp,
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_pclt,
484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* see `ttload.h' */
486727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ),
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ),
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* see `ttpost.h' */
491727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    PUT_PS_NAMES( tt_face_get_ps_name   ),
492727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    PUT_PS_NAMES( tt_face_free_ps_names ),
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* since version 2.1.8 */
495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_get_kerning,
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* since version 2.2 */
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_font_dir,
499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_load_hmtx,
500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* see `ttsbit.h' and `sfnt.h' */
502ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    PUT_EMBEDDED_BITMAPS( tt_face_load_sbit ),
503ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    PUT_EMBEDDED_BITMAPS( tt_face_free_sbit ),
504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike     ),
506727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),
507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_get_metrics
509295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
512727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_MODULE(
513727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sfnt_module_class,
51441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    0,  /* not a font driver or renderer */
51641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    sizeof ( FT_ModuleRec ),
517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "sfnt",     /* driver name                            */
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    0x10000L,   /* driver version 1.0                     */
520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    0x20000L,   /* driver requires FreeType 2.0 or higher */
521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
522727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (const void*)&SFNT_INTERFACE_GET,  /* module specific interface */
523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Module_Constructor)0,
525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Module_Destructor) 0,
526727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_Module_Requester)  sfnt_get_interface )
527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
530