1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  sfobjs.c                                                               */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    SFNT object management (base).                                       */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/*  Copyright 1996-2008, 2010-2013 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>
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "sfobjs.h"
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttload.h"
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttcmap.h"
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttkern.h"
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_SFNT_H
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_IDS_H
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_TAGS_H
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SERVICE_POSTSCRIPT_CMAPS_H
29295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_SFNT_NAMES_H
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "sferrors.h"
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_BDF
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttbdf.h"
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* messages during execution.                                            */
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_sfobjs
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a UTF-16 name entry to ASCII */
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_String*
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  tt_name_entry_ascii_from_utf16( TT_NameEntry  entry,
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  FT_Memory     memory )
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
53aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_String*  string = NULL;
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     len, code, n;
55aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Byte*    read   = (FT_Byte*)entry->string;
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error    error;
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    len = (FT_UInt)entry->stringLength / 2;
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_NEW_ARRAY( string, len + 1 ) )
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return NULL;
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < len; n++ )
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      code = FT_NEXT_USHORT( read );
67a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
68a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      if ( code == 0 )
69a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        break;
70a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( code < 32 || code > 127 )
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        code = '?';
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      string[n] = (char)code;
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
77a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    string[n] = 0;
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return string;
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert an Apple Roman or symbol name entry to ASCII */
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_String*
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  tt_name_entry_ascii_from_other( TT_NameEntry  entry,
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  FT_Memory     memory )
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
88aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_String*  string = NULL;
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     len, code, n;
90aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Byte*    read   = (FT_Byte*)entry->string;
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error    error;
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    len = (FT_UInt)entry->stringLength;
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_NEW_ARRAY( string, len + 1 ) )
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return NULL;
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < len; n++ )
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      code = *read++;
102a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
103a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      if ( code == 0 )
104a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        break;
105a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( code < 32 || code > 127 )
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        code = '?';
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      string[n] = (char)code;
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
112a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    string[n] = 0;
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return string;
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef FT_String*  (*TT_NameEntry_ConvertFunc)( TT_NameEntry  entry,
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                   FT_Memory     memory );
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    tt_face_get_name                                                   */
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns a given ENGLISH name record in ASCII.                      */
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    face   :: A handle to the source face object.                      */
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    nameid :: The name id of the name record to return.                */
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* <InOut>                                                               */
1360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /*    name   :: The address of a string pointer.  NULL if no name is     */
1370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /*              present.                                                 */
1380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /*                                                                       */
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  static FT_Error
1430a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  tt_face_get_name( TT_Face      face,
1440a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project                    FT_UShort    nameid,
1450a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project                    FT_String**  name )
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory         memory = face->root.memory;
148a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Error          error  = FT_Err_Ok;
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_String*        result = NULL;
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort         n;
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_NameEntryRec*  rec;
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int            found_apple         = -1;
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int            found_apple_roman   = -1;
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int            found_apple_english = -1;
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int            found_win           = -1;
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int            found_unicode       = -1;
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool           is_english = 0;
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_NameEntry_ConvertFunc  convert;
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    FT_ASSERT( name );
1640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    rec = face->name_table.names;
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < face->num_names; n++, rec++ )
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* According to the OpenType 1.3 specification, only Microsoft or  */
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Apple platform IDs might be used in the `name' table.  The      */
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `Unicode' platform is reserved for the `cmap' table, and the    */
171aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      /* `ISO' one is deprecated.                                        */
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                 */
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* However, the Apple TrueType specification doesn't say the same  */
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* thing and goes to suggest that all Unicode `name' table entries */
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* should be coded in UTF-16 (in big-endian format I suppose).     */
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                 */
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( rec->nameID == nameid && rec->stringLength > 0 )
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( rec->platformID )
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case TT_PLATFORM_APPLE_UNICODE:
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case TT_PLATFORM_ISO:
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* there is `languageID' to check there.  We should use this */
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* field only as a last solution when nothing else is        */
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* available.                                                */
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*                                                           */
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          found_unicode = n;
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case TT_PLATFORM_MACINTOSH:
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* This is a bit special because some fonts will use either    */
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* an English language id, or a Roman encoding id, to indicate */
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* the English version of its font name.                       */
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*                                                             */
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( rec->languageID == TT_MAC_LANGID_ENGLISH )
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            found_apple_english = n;
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( rec->encodingID == TT_MAC_ID_ROMAN )
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            found_apple_roman = n;
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case TT_PLATFORM_MICROSOFT:
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* we only take a non-English name when there is nothing */
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* else available in the font                            */
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*                                                       */
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 )
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            switch ( rec->encodingID )
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            case TT_MS_ID_SYMBOL_CS:
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            case TT_MS_ID_UNICODE_CS:
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            case TT_MS_ID_UCS_4:
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 );
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              found_win  = n;
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              break;
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            default:
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              ;
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        default:
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ;
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    found_apple = found_apple_roman;
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( found_apple_english >= 0 )
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      found_apple = found_apple_english;
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* some fonts contain invalid Unicode or Macintosh formatted entries; */
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* we will thus favor names encoded in Windows formats if available   */
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* (provided it is an English name)                                   */
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                                    */
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    convert = NULL;
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) )
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      rec = face->name_table.names + found_win;
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( rec->encodingID )
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* all Unicode strings are encoded using UTF-16BE */
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case TT_MS_ID_UNICODE_CS:
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case TT_MS_ID_SYMBOL_CS:
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        convert = tt_name_entry_ascii_from_utf16;
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case TT_MS_ID_UCS_4:
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* Apparently, if this value is found in a name table entry, it is */
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* documented as `full Unicode repertoire'.  Experience with the   */
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* MsGothic font shipped with Windows Vista shows that this really */
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* means UTF-16 encoded names (UCS-4 values are only used within   */
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* charmaps).                                                      */
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        convert = tt_name_entry_ascii_from_utf16;
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      default:
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ;
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( found_apple >= 0 )
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      rec     = face->name_table.names + found_apple;
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      convert = tt_name_entry_ascii_from_other;
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( found_unicode >= 0 )
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      rec     = face->name_table.names + found_unicode;
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      convert = tt_name_entry_ascii_from_utf16;
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( rec && convert )
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( rec->string == NULL )
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Stream  stream = face->name_table.stream;
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_STREAM_SEEK( rec->stringOffset )              ||
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_STREAM_READ( rec->string, rec->stringLength ) )
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_FREE( rec->string );
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          rec->stringLength = 0;
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          result            = NULL;
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      result = convert( rec, memory );
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
2940a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    *name = result;
2950a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    return error;
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Encoding
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_find_encoding( int  platform_id,
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      int  encoding_id )
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    typedef struct  TEncoding_
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      int          platform_id;
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      int          encoding_id;
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Encoding  encoding;
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } TEncoding;
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    static
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    const TEncoding  tt_encodings[] =
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_ISO,           -1,                  FT_ENCODING_UNICODE },
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_APPLE_UNICODE, -1,                  FT_ENCODING_UNICODE },
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_MACINTOSH,     TT_MAC_ID_ROMAN,     FT_ENCODING_APPLE_ROMAN },
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SYMBOL_CS,  FT_ENCODING_MS_SYMBOL },
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UCS_4,      FT_ENCODING_UNICODE },
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE },
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SJIS,       FT_ENCODING_SJIS },
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_GB2312,     FT_ENCODING_GB2312 },
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_BIG_5,      FT_ENCODING_BIG5 },
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_WANSUNG,    FT_ENCODING_WANSUNG },
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_JOHAB,      FT_ENCODING_JOHAB }
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    };
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    const TEncoding  *cur, *limit;
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur   = tt_encodings;
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; cur < limit; cur++ )
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( cur->platform_id == platform_id )
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cur->encoding_id == encoding_id ||
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             cur->encoding_id == -1          )
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return cur->encoding;
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FT_ENCODING_NONE;
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Fill in face->ttc_header.  If the font is not a TTC, it is */
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* synthesized into a TTC with one offset table.              */
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_open_font( FT_Stream  stream,
354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  TT_Face    face )
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory = stream->memory;
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error   error;
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong   tag, offset;
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    static const FT_Frame_Field  ttc_header_fields[] =
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_STRUCTURE
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_STRUCTURE  TTC_HeaderRec
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FRAME_START( 8 ),
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_LONG( version ),
367c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        FT_FRAME_LONG( count   ),  /* this is ULong in the specs */
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FRAME_END
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    };
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->ttc_header.tag     = 0;
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->ttc_header.version = 0;
374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->ttc_header.count   = 0;
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    offset = FT_STREAM_POS();
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_READ_ULONG( tag ) )
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3810a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( tag != 0x00010000UL &&
3820a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project         tag != TTAG_ttcf    &&
3830a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project         tag != TTAG_OTTO    &&
3840a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project         tag != TTAG_true    &&
3850a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project         tag != TTAG_typ1    &&
3860a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project         tag != 0x00020000UL )
387e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    {
388e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang      FT_TRACE2(( "  not a font using the SFNT container format\n" ));
389a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Unknown_File_Format );
390e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    }
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->ttc_header.tag = TTAG_ttcf;
393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( tag == TTAG_ttcf )
395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Int  n;
397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_TRACE3(( "sfnt_open_font: file is a collection\n" ));
400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) )
402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
404c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      if ( face->ttc_header.count == 0 )
405a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        return FT_THROW( Invalid_Table );
406c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
407c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      /* a rough size estimate: let's conservatively assume that there   */
408c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      /* is just a single table info in each subfont header (12 + 16*1 = */
409c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */
410c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      /* size of the TTC header plus `28*count' bytes for all subfont    */
411c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      /* headers                                                         */
412c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) )
413a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        return FT_THROW( Array_Too_Large );
414c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* now read the offsets of each font in the file */
416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) )
417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) )
420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( n = 0; n < face->ttc_header.count; n++ )
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        face->ttc_header.offsets[n] = FT_GET_ULONG();
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FRAME_EXIT();
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" ));
430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->ttc_header.version = 1 << 16;
432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->ttc_header.count   = 1;
433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      if ( FT_NEW( face->ttc_header.offsets ) )
435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->ttc_header.offsets[0] = offset;
438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_init_face( FT_Stream      stream,
446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  TT_Face        face,
447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  FT_Int         face_index,
448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  FT_Int         num_params,
449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  FT_Parameter*  params )
450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error        error;
452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Library      library = face->root.driver->root.library;
453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SFNT_Service    sfnt;
454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* for now, parameters are unused */
457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( num_params );
458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( params );
459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sfnt = (SFNT_Service)face->sfnt;
462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !sfnt )
463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !sfnt )
466e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang      {
467e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang        FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" ));
468a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        return FT_THROW( Missing_Module );
469e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang      }
470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->sfnt       = sfnt;
472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->goto_table = sfnt->goto_table;
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS );
476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
477e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_TRACE2(( "SFNT driver\n" ));
478e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = sfnt_open_font( stream, face );
480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index ));
484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( face_index < 0 )
486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face_index = 0;
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( face_index >= face->ttc_header.count )
489a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Invalid_Argument );
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) )
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check that we have a valid TrueType file */
495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = sfnt->load_font_dir( face, stream );
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4990a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    face->root.num_faces  = face->ttc_header.count;
5000a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    face->root.face_index = face_index;
501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
506a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define LOAD_( x )                                          \
507a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  do {                                                      \
508a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_TRACE2(( "`" #x "' " ));                             \
509a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_TRACE3(( "-->\n" ));                                 \
510a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                                                            \
511a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    error = sfnt->load_ ## x( face, stream );               \
512a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                                                            \
513a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_TRACE2(( "%s\n", ( !error )                          \
514a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                        ? "loaded"                          \
515a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                        : FT_ERR_EQ( error, Table_Missing ) \
516a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                          ? "missing"                       \
517a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                          : "failed to load" ));            \
518a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_TRACE3(( "\n" ));                                    \
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } while ( 0 )
520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
521a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define LOADM_( x, vertical )                               \
522a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  do {                                                      \
523a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_TRACE2(( "`%s" #x "' ",                              \
524a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                vertical ? "vertical " : "" ));             \
525a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_TRACE3(( "-->\n" ));                                 \
526a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                                                            \
527a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    error = sfnt->load_ ## x( face, stream, vertical );     \
528a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                                                            \
529a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_TRACE2(( "%s\n", ( !error )                          \
530a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                        ? "loaded"                          \
531a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                        : FT_ERR_EQ( error, Table_Missing ) \
532a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                          ? "missing"                       \
533a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                          : "failed to load" ));            \
534a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_TRACE3(( "\n" ));                                    \
535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } while ( 0 )
536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
537a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define GET_NAME( id, field )                                   \
538a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  do {                                                          \
539a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \
540a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    if ( error )                                                \
541a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      goto Exit;                                                \
5420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  } while ( 0 )
5430a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_load_face( FT_Stream      stream,
547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  TT_Face        face,
548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  FT_Int         face_index,
549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  FT_Int         num_params,
550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  FT_Parameter*  params )
551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5520a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    FT_Error      error;
5530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
5540a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    FT_Error      psnames_error;
5550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#endif
556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool       has_outline;
557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool       is_apple_sbit;
558a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Bool       ignore_preferred_family    = FALSE;
559295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_Bool       ignore_preferred_subfamily = FALSE;
560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( face_index );
564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
565a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
566295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* Check parameters */
567c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
568295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
569295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_Int  i;
570295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
571295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
572295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      for ( i = 0; i < num_params; i++ )
573295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      {
574295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY )
575295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          ignore_preferred_family = TRUE;
576295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY )
577295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          ignore_preferred_subfamily = TRUE;
578295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      }
579295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Load tables */
582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We now support two SFNT-based bitmapped font formats.  They */
584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* are recognized easily as they do not include a `glyf'       */
585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* table.                                                      */
586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                             */
587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* The first format comes from Apple, and uses a table named   */
588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* `bhed' instead of `head' to store the font header (using    */
589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* the same format).  It also doesn't include horizontal and   */
590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* vertical metrics tables (i.e. `hhea' and `vhea' tables are  */
591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* missing).                                                   */
592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                             */
593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* The other format comes from Microsoft, and is used with     */
594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* WinCE/PocketPC.  It looks like a standard TTF, except that  */
595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* it doesn't contain outlines.                                */
596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                             */
597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE2(( "sfnt_load_face: %08p\n\n", face ));
599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* do we have outlines in there? */
601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_INCREMENTAL
602c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 ||
603c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                           tt_face_lookup_table( face, TTAG_glyf )    != 0 ||
604c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                           tt_face_lookup_table( face, TTAG_CFF )     != 0 );
605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
606c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 ||
607c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                           tt_face_lookup_table( face, TTAG_CFF )  != 0 );
608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    is_apple_sbit = 0;
611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* if this font doesn't contain outlines, we try to load */
613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* a `bhed' table                                        */
614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !has_outline && sfnt->load_bhed )
615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      LOAD_( bhed );
617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      is_apple_sbit = FT_BOOL( !error );
618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* load the font header (`head' table) if this isn't an Apple */
621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* sbit font file                                             */
622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !is_apple_sbit )
623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      LOAD_( head );
625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( face->header.Units_Per_EM == 0 )
630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
631a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      error = FT_THROW( Invalid_Table );
632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* the following tables are often not present in embedded TrueType */
637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* fonts within PDF documents, so don't check for them.            */
638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LOAD_( maxp );
639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LOAD_( cmap );
640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* the following tables are optional in PCL fonts -- */
642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* don't check for errors                            */
643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LOAD_( name );
644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LOAD_( post );
6450a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    psnames_error = error;
6480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#endif
649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* do not load the metrics headers and tables if this is an Apple */
651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* sbit font file                                                 */
652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !is_apple_sbit )
653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* load the `hhea' and `hmtx' tables */
655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      LOADM_( hhea, 0 );
656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !error )
657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        LOADM_( hmtx, 0 );
659a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        if ( FT_ERR_EQ( error, Table_Missing ) )
660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
661a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang          error = FT_THROW( Hmtx_Table_Missing );
662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_INCREMENTAL
664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* If this is an incrementally loaded font and there are */
665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* overriding metrics, tolerate a missing `hmtx' table.  */
666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( face->root.internal->incremental_interface          &&
667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               face->root.internal->incremental_interface->funcs->
668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 get_glyph_metrics                                 )
669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            face->horizontal.number_Of_HMetrics = 0;
671a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang            error                               = FT_Err_Ok;
672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
676a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      else if ( FT_ERR_EQ( error, Table_Missing ) )
677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* No `hhea' table necessary for SFNT Mac fonts. */
679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( face->format_tag == TTAG_true )
680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_TRACE2(( "This is an SFNT Mac font.\n" ));
682c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          has_outline = 0;
684a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang          error       = FT_Err_Ok;
685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
688a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang          error = FT_THROW( Horiz_Header_Missing );
689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_INCREMENTAL
691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* If this is an incrementally loaded font and there are */
692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* overriding metrics, tolerate a missing `hhea' table.  */
693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( face->root.internal->incremental_interface          &&
694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               face->root.internal->incremental_interface->funcs->
695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 get_glyph_metrics                                 )
696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            face->horizontal.number_Of_HMetrics = 0;
698a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang            error                               = FT_Err_Ok;
699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* try to load the `vhea' and `vmtx' tables */
709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      LOADM_( hhea, 1 );
710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !error )
711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        LOADM_( hmtx, 1 );
713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( !error )
714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          face->vertical_info = 1;
715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
717a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      if ( error && FT_ERR_NEQ( error, Table_Missing ) )
718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      LOAD_( os2 );
721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7238583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner        /* we treat the table as missing if there are any errors */
724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        face->os2.version = 0xFFFFU;
725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* the optional tables */
729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    /* embedded bitmap support */
731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( sfnt->load_eblc )
732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      LOAD_( eblc );
734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        /* a font which contains neither bitmaps nor outlines is */
7370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        /* still valid (although rather useless in most cases);  */
7380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        /* however, you can find such stripped fonts in PDFs     */
739a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        if ( FT_ERR_EQ( error, Table_Missing ) )
740a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang          error = FT_Err_Ok;
741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LOAD_( pclt );
747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
749a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      if ( FT_ERR_NEQ( error, Table_Missing ) )
750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->pclt.Version = 0;
753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* consider the kerning and gasp tables as optional */
756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LOAD_( gasp );
757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LOAD_( kern );
758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->root.num_glyphs = face->max_profile.numGlyphs;
760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes  */
762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* a WWS-only font face.  `WWS' stands for `weight', width', and */
763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* `slope', a term used by Microsoft's Windows Presentation      */
7640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    /* Foundation (WPF).  This flag has been introduced in version   */
7650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    /* 1.5 of the OpenType specification (May 2008).                 */
766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
767295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    face->root.family_name = NULL;
768295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    face->root.style_name  = NULL;
769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 )
770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
771295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( !ignore_preferred_family )
772295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !face->root.family_name )
7740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        GET_NAME( FONT_FAMILY, &face->root.family_name );
775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
776295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( !ignore_preferred_subfamily )
777295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !face->root.style_name )
7790a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7830a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      GET_NAME( WWS_FAMILY, &face->root.family_name );
784295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( !face->root.family_name && !ignore_preferred_family )
7850a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !face->root.family_name )
7870a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        GET_NAME( FONT_FAMILY, &face->root.family_name );
788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7890a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      GET_NAME( WWS_SUBFAMILY, &face->root.style_name );
790295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( !face->root.style_name && !ignore_preferred_subfamily )
7910a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !face->root.style_name )
7930a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* now set up root fields */
797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
798295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_Face  root  = &face->root;
799295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_Long  flags = root->face_flags;
800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*********************************************************************/
803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                   */
804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Compute face flags.                                               */
805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                   */
806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( has_outline == TRUE )
807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */
808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* The sfnt driver only supports bitmap fonts natively, thus we */
810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* don't set FT_FACE_FLAG_HINTER.                               */
811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */
812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */
813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
815a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      if ( !psnames_error                             &&
816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           face->postscript.FormatType != 0x00030000L )
817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        flags |= FT_FACE_FLAG_GLYPH_NAMES;
818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* fixed width font? */
821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( face->postscript.isFixedPitch )
822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        flags |= FT_FACE_FLAG_FIXED_WIDTH;
823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* vertical information? */
825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( face->vertical_info )
826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        flags |= FT_FACE_FLAG_VERTICAL;
827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* kerning available ? */
829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( TT_FACE_HAS_KERNING( face ) )
830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        flags |= FT_FACE_FLAG_KERNING;
831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Don't bother to load the tables unless somebody asks for them. */
834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* No need to do work which will (probably) not be used.          */
835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&
836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           tt_face_lookup_table( face, TTAG_fvar ) != 0 &&
837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           tt_face_lookup_table( face, TTAG_gvar ) != 0 )
838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      root->face_flags = flags;
842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*********************************************************************/
844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                   */
845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Compute style flags.                                              */
846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                   */
847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      flags = 0;
849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( has_outline == TRUE && face->os2.version != 0xFFFFU )
850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        /* We have an OS/2 table; use the `fsSelection' field.  Bit 9 */
8520a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        /* indicates an oblique font face.  This flag has been        */
8530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        /* introduced in version 1.5 of the OpenType specification.   */
854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( face->os2.fsSelection & 512 )       /* bit 9 */
856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          flags |= FT_STYLE_FLAG_ITALIC;
857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else if ( face->os2.fsSelection & 1 )    /* bit 0 */
858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          flags |= FT_STYLE_FLAG_ITALIC;
859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( face->os2.fsSelection & 32 )        /* bit 5 */
861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          flags |= FT_STYLE_FLAG_BOLD;
862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* this is an old Mac font, use the header field */
8660a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( face->header.Mac_Style & 1 )
868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          flags |= FT_STYLE_FLAG_BOLD;
869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( face->header.Mac_Style & 2 )
871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          flags |= FT_STYLE_FLAG_ITALIC;
872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      root->style_flags = flags;
875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*********************************************************************/
877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                   */
878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Polish the charmaps.                                              */
879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                   */
880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*   Try to set the charmap encoding according to the platform &     */
881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*   encoding ID of each charmap.                                    */
882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                   */
883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tt_face_build_cmaps( face );  /* ignore errors */
885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* set the encoding fields */
888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Int  m;
890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( m = 0; m < root->num_charmaps; m++ )
893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_CharMap  charmap = root->charmaps[m];
895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          charmap->encoding = sfnt_find_encoding( charmap->platform_id,
898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                  charmap->encoding_id );
899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( root->charmap     == NULL &&
902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               charmap->encoding == FT_ENCODING_UNICODE )
903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            /* set 'root->charmap' to the first Unicode encoding we find */
905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            root->charmap = charmap;
906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
9120a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /*
9140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project       *  Now allocate the root array of FT_Bitmap_Size records and
9150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project       *  populate them.  Unfortunately, it isn't possible to indicate bit
9160a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project       *  depths in the FT_Bitmap_Size record.  This is a design error.
9170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project       */
9180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      {
9190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_UInt  i, count;
9200a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9210a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9220a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        count = face->sbit_num_strikes;
9230a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9240a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        if ( count > 0 )
9250a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        {
9260a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          FT_Memory        memory   = face->root.stream->memory;
9270a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          FT_UShort        em_size  = face->header.Units_Per_EM;
9280a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          FT_Short         avgwidth = face->os2.xAvgCharWidth;
9290a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          FT_Size_Metrics  metrics;
9300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9320a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          if ( em_size == 0 || face->os2.version == 0xFFFFU )
9330a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          {
9340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            avgwidth = 0;
9350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            em_size = 1;
9360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          }
9370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          if ( FT_NEW_ARRAY( root->available_sizes, count ) )
9390a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            goto Exit;
9400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9410a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          for ( i = 0; i < count; i++ )
9420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          {
9430a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            FT_Bitmap_Size*  bsize = root->available_sizes + i;
9440a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9450a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            error = sfnt->load_strike_metrics( face, i, &metrics );
9470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            if ( error )
9480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project              goto Exit;
9490a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9500a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            bsize->height = (FT_Short)( metrics.height >> 6 );
9510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            bsize->width = (FT_Short)(
9520a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project                ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );
9530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9540a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            bsize->x_ppem = metrics.x_ppem << 6;
9550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            bsize->y_ppem = metrics.y_ppem << 6;
9560a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9570a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            /* assume 72dpi */
9580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project            bsize->size   = metrics.y_ppem << 6;
9590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          }
9600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          root->face_flags     |= FT_FACE_FLAG_FIXED_SIZES;
9620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          root->num_fixed_sizes = (FT_Int)count;
9630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        }
9640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      }
9650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9660a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
9670a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
9680a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* a font with no bitmaps and no outlines is scalable; */
9690a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* it has only empty glyphs then                       */
9700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )
9710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        root->face_flags |= FT_FACE_FLAG_SCALABLE;
9720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*********************************************************************/
975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                   */
976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*  Set up metrics.                                                  */
977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                   */
9780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      if ( FT_IS_SCALABLE( root ) )
979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* XXX What about if outline header is missing */
981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*     (e.g. sfnt wrapped bitmap)?             */
982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        root->bbox.xMin    = face->header.xMin;
983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        root->bbox.yMin    = face->header.yMin;
984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        root->bbox.xMax    = face->header.xMax;
985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        root->bbox.yMax    = face->header.yMax;
986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        root->units_per_EM = face->header.Units_Per_EM;
987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* XXX: Computing the ascender/descender/height is very different */
990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      from what the specification tells you.  Apparently, we    */
991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      must be careful because                                   */
992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                */
993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      - not all fonts have an OS/2 table; in this case, we take */
994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*        the values in the horizontal header.  However, these    */
995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*        values very often are not reliable.                     */
996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                */
997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      - otherwise, the correct typographic values are in the    */
998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*        sTypoAscender, sTypoDescender & sTypoLineGap fields.    */
999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                */
1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*        However, certain fonts have these fields set to 0.      */
1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*        Rather, they have usWinAscent & usWinDescent correctly  */
1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*        set (but with different values).                        */
1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                */
1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      As an example, Arial Narrow is implemented through four   */
1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */
1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                */
1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      Strangely, all fonts have the same values in their        */
1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      sTypoXXX fields, except ARIALNB which sets them to 0.     */
1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                */
1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      On the other hand, they all have different                */
1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      usWinAscent/Descent values -- as a conclusion, the OS/2   */
1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      table cannot be used to compute the text height reliably! */
1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                */
1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1015c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        /* The ascender and descender are taken from the `hhea' table. */
1016c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        /* If zero, they are taken from the `OS/2' table.              */
1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        root->ascender  = face->horizontal.Ascender;
1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        root->descender = face->horizontal.Descender;
1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1021c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        root->height = (FT_Short)( root->ascender - root->descender +
1022c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                                   face->horizontal.Line_Gap );
1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1024c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        if ( !( root->ascender || root->descender ) )
1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1026c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner          if ( face->os2.version != 0xFFFFU )
1027c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner          {
1028c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner            if ( face->os2.sTypoAscender || face->os2.sTypoDescender )
1029c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner            {
1030c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner              root->ascender  = face->os2.sTypoAscender;
1031c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner              root->descender = face->os2.sTypoDescender;
1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1033c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner              root->height = (FT_Short)( root->ascender - root->descender +
1034c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                                         face->os2.sTypoLineGap );
1035c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner            }
1036c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner            else
1037c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner            {
1038c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner              root->ascender  =  (FT_Short)face->os2.usWinAscent;
1039c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner              root->descender = -(FT_Short)face->os2.usWinDescent;
1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1041c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner              root->height = (FT_UShort)( root->ascender - root->descender );
1042c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner            }
1043c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner          }
1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
10460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        root->max_advance_width  = face->horizontal.advance_Width_Max;
10470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        root->max_advance_height = (FT_Short)( face->vertical_info
10480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project                                     ? face->vertical.advance_Height_Max
10490a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project                                     : root->height );
1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
10510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */
10520a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        /* Adjust underline position from top edge to centre of     */
10530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        /* stroke to convert TrueType meaning to FreeType meaning.  */
10540a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        root->underline_position  = face->postscript.underlinePosition -
10550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project                                    face->postscript.underlineThickness / 2;
1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        root->underline_thickness = face->postscript.underlineThickness;
1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE2(( "sfnt_load_face: done\n" ));
1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef LOAD_
1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef LOADM_
10700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#undef GET_NAME
1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  sfnt_done_face( TT_Face  face )
1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
10760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    FT_Memory     memory;
10770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    SFNT_Service  sfnt;
10780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
10790a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
10800a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( !face )
10810a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      return;
1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
10830a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    memory = face->root.memory;
10840a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    sfnt   = (SFNT_Service)face->sfnt;
1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( sfnt )
1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* destroy the postscript names table if it is loaded */
1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( sfnt->free_psnames )
1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        sfnt->free_psnames( face );
1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* destroy the embedded bitmaps table if it is loaded */
1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( sfnt->free_eblc )
1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        sfnt->free_eblc( face );
1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_BDF
1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing the embedded BDF properties */
1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_free_bdf_props( face );
1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing the kerning table */
1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tt_face_done_kern( face );
1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing the collection table */
1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( face->ttc_header.offsets );
1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->ttc_header.count = 0;
1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing table directory */
1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( face->dir_tables );
1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->num_tables = 0;
1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Stream  stream = FT_FACE_STREAM( face );
1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* simply release the 'cmap' table frame */
1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FRAME_RELEASE( face->cmap_table );
1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->cmap_size = 0;
1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing the horizontal metrics */
1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Stream  stream = FT_FACE_STREAM( face );
1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FRAME_RELEASE( face->horz_metrics );
1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FRAME_RELEASE( face->vert_metrics );
1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->horz_metrics_size = 0;
1130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->vert_metrics_size = 0;
1131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing the vertical ones, if any */
1134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( face->vertical_info )
1135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FREE( face->vertical.long_metrics  );
1137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FREE( face->vertical.short_metrics );
1138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->vertical_info = 0;
1139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing the gasp table */
1142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( face->gasp.gaspRanges );
1143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->gasp.numRanges = 0;
1144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing the name table */
1146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( sfnt )
1147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      sfnt->free_name( face );
1148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing family and style name */
1150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( face->root.family_name );
1151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( face->root.style_name );
1152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* freeing sbit size table */
1154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( face->root.available_sizes );
1155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->root.num_fixed_sizes = 0;
1156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( face->postscript_name );
1158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    face->sfnt = 0;
1160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
1164