1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  cffobjs.c                                                              */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    OpenType objects manager (body).                                     */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier/*  Copyright 1996-2012 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 FT_INTERNAL_DEBUG_H
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_CALC_H
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_STREAM_H
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_ERRORS_H
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_IDS_H
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_TAGS_H
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_SFNT_H
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffobjs.h"
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffload.h"
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffcmap.h"
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cfferrs.h"
31295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "cffpic.h"
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* messages during execution.                                            */
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_cffobjs
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                            SIZE FUNCTIONS                             */
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Note that we store the global hints in the size's `internal' root    */
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  field.                                                               */
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static PSH_Globals_Funcs
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_get_globals_funcs( CFF_Size  size )
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Face          face     = (CFF_Face)size->root.face;
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font          font     = (CFF_Font)face->extra.data;
59aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    PSHinter_Service  pshinter = font->pshinter;
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Module         module;
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    module = FT_Get_Module( size->root.face->driver->root.library,
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            "pshinter" );
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ( module && pshinter && pshinter->get_globals_funcs )
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           ? pshinter->get_globals_funcs( module )
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           : 0;
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_done( FT_Size  cffsize )        /* CFF_Size */
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Size      size     = (CFF_Size)cffsize;
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Face      face     = (CFF_Face)size->root.face;
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font      font     = (CFF_Font)face->extra.data;
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Internal  internal = (CFF_Internal)cffsize->internal;
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( internal )
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      PSH_Globals_Funcs  funcs;
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      funcs = cff_size_get_globals_funcs( size );
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( funcs )
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_UInt  i;
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        funcs->destroy( internal->topfont );
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( i = font->num_subfonts; i > 0; i-- )
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          funcs->destroy( internal->subfonts[i - 1] );
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `internal' is freed by destroy_size (in ftobjs.c) */
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CFF and Type 1 private dictionaries have slightly different      */
1030a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* structures; we need to synthesize a Type 1 dictionary on the fly */
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_make_private_dict( CFF_SubFont  subfont,
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         PS_Private   priv )
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Private  cpriv = &subfont->private_dict;
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt      n, count;
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_MEM_ZERO( priv, sizeof ( *priv ) );
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_blue_values = cpriv->num_blue_values;
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->blue_values[n] = (FT_Short)cpriv->blue_values[n];
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_other_blues = cpriv->num_other_blues;
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->other_blues[n] = (FT_Short)cpriv->other_blues[n];
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_family_blues = cpriv->num_family_blues;
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->family_blues[n] = (FT_Short)cpriv->family_blues[n];
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_family_other_blues = cpriv->num_family_other_blues;
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n];
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->blue_scale = cpriv->blue_scale;
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->blue_shift = (FT_Int)cpriv->blue_shift;
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->blue_fuzz  = (FT_Int)cpriv->blue_fuzz;
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->standard_width[0]  = (FT_UShort)cpriv->standard_width;
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->standard_height[0] = (FT_UShort)cpriv->standard_height;
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_snap_widths = cpriv->num_snap_widths;
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n];
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_snap_heights = cpriv->num_snap_heights;
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n];
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->force_bold     = cpriv->force_bold;
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->language_group = cpriv->language_group;
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->lenIV          = cpriv->lenIV;
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_init( FT_Size  cffsize )         /* CFF_Size */
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Size           size  = (CFF_Size)cffsize;
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error           error = CFF_Err_Ok;
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PSH_Globals_Funcs  funcs = cff_size_get_globals_funcs( size );
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( funcs )
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Face      face     = (CFF_Face)cffsize->face;
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Font      font     = (CFF_Font)face->extra.data;
164aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CFF_Internal  internal = NULL;
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      PS_PrivateRec  priv;
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory      memory = cffsize->face->memory;
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt  i;
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_NEW( internal ) )
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cff_make_private_dict( &font->top_font, &priv );
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = funcs->create( cffsize->face->memory, &priv,
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             &internal->topfont );
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = font->num_subfonts; i > 0; i-- )
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CFF_SubFont  sub = font->subfonts[i - 1];
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cff_make_private_dict( sub, &priv );
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error = funcs->create( cffsize->face->memory, &priv,
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               &internal->subfonts[i - 1] );
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cffsize->internal = (FT_Size_Internal)(void*)internal;
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->strike_index = 0xFFFFFFFFUL;
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_select( FT_Size   size,
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   FT_ULong  strike_index )
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Size           cffsize = (CFF_Size)size;
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PSH_Globals_Funcs  funcs;
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cffsize->strike_index = strike_index;
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Select_Metrics( size->face, strike_index );
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    funcs = cff_size_get_globals_funcs( cffsize );
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( funcs )
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Face      face     = (CFF_Face)size->face;
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Font      font     = (CFF_Font)face->extra.data;
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Internal  internal = (CFF_Internal)size->internal;
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
225295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;
226295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_UInt   i;
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      funcs->set_scale( internal->topfont,
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        size->metrics.x_scale, size->metrics.y_scale,
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        0, 0 );
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = font->num_subfonts; i > 0; i-- )
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CFF_SubFont  sub     = font->subfonts[i - 1];
236295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        FT_ULong     sub_upm = sub->font_dict.units_per_em;
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Pos       x_scale, y_scale;
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( top_upm != sub_upm )
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x_scale = size->metrics.x_scale;
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y_scale = size->metrics.y_scale;
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        funcs->set_scale( internal->subfonts[i - 1],
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          x_scale, y_scale, 0, 0 );
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CFF_Err_Ok;
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_request( FT_Size          size,
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Size_Request  req )
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Size           cffsize = (CFF_Size)size;
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PSH_Globals_Funcs  funcs;
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_HAS_FIXED_SIZES( size->face ) )
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Face      cffface = (CFF_Face)size->face;
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      SFNT_Service  sfnt    = (SFNT_Service)cffface->sfnt;
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_ULong      strike_index;
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) )
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffsize->strike_index = 0xFFFFFFFFUL;
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return cff_size_select( size, strike_index );
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Request_Metrics( size->face, req );
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    funcs = cff_size_get_globals_funcs( cffsize );
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( funcs )
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Face      cffface  = (CFF_Face)size->face;
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Font      font     = (CFF_Font)cffface->extra.data;
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Internal  internal = (CFF_Internal)size->internal;
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
297295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;
298295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_UInt   i;
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      funcs->set_scale( internal->topfont,
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        size->metrics.x_scale, size->metrics.y_scale,
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        0, 0 );
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = font->num_subfonts; i > 0; i-- )
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CFF_SubFont  sub     = font->subfonts[i - 1];
308295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        FT_ULong     sub_upm = sub->font_dict.units_per_em;
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Pos       x_scale, y_scale;
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( top_upm != sub_upm )
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x_scale = size->metrics.x_scale;
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y_scale = size->metrics.y_scale;
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        funcs->set_scale( internal->subfonts[i - 1],
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          x_scale, y_scale, 0, 0 );
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CFF_Err_Ok;
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                            SLOT  FUNCTIONS                            */
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_slot_done( FT_GlyphSlot  slot )
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    slot->internal->glyph_hints = 0;
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_slot_init( FT_GlyphSlot  slot )
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Face          face     = (CFF_Face)slot->face;
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font          font     = (CFF_Font)face->extra.data;
350aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    PSHinter_Service  pshinter = font->pshinter;
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( pshinter )
354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Module  module;
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      module = FT_Get_Module( slot->face->driver->root.library,
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              "pshinter" );
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( module )
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        T2_Hints_Funcs  funcs;
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        funcs = pshinter->get_t2_funcs( module );
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        slot->internal->glyph_hints = (void*)funcs;
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CFF_Err_Ok;
371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                           FACE  FUNCTIONS                             */
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_String*
381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_strcpy( FT_Memory         memory,
382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              const FT_String*  source )
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error    error;
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_String*  result;
386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (void)FT_STRDUP( result, source );
389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( error );
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
396aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /* Strip all subset prefixes of the form `ABCDEF+'.  Usually, there */
397aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold'   */
398aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /* have been seen in the wild.                                      */
399aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
400aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  static void
401aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  remove_subset_prefix( FT_String*  name )
402aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  {
403aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Int32  idx             = 0;
404aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Int32  length          = strlen( name ) + 1;
405aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Bool   continue_search = 1;
40641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
407aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
408aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    while ( continue_search )
409aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    {
410aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      if ( length >= 7 && name[6] == '+' )
411aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      {
412aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        for ( idx = 0; idx < 6; idx++ )
413aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        {
414aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          /* ASCII uppercase letters */
415aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )
416aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            continue_search = 0;
417aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        }
418aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
419aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        if ( continue_search )
420aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        {
421aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          for ( idx = 7; idx < length; idx++ )
422aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            name[idx - 7] = name[idx];
423aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          length -= 7;
424aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        }
425aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      }
426aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      else
427aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        continue_search = 0;
428aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    }
429aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  }
430aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
431aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
432aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  /* Remove the style part from the family name (if present). */
433aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
434aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  static void
435aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  remove_style( FT_String*        family_name,
436aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                const FT_String*  style_name )
437aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  {
438aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Int32  family_name_length, style_name_length;
439aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
440aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
441aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    family_name_length = strlen( family_name );
442aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    style_name_length  = strlen( style_name );
443aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
444aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( family_name_length > style_name_length )
445aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {
446aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      FT_Int  idx;
447aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
448aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
449aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      for ( idx = 1; idx <= style_name_length; ++idx )
450aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
451aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( family_name[family_name_length - idx] !=
452aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner             style_name[style_name_length - idx] )
453aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          break;
454aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
455aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
456aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( idx > style_name_length )
457aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
458aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* family_name ends with style_name; remove it */
459aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        idx = family_name_length - style_name_length - 1;
460aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
461aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* also remove special characters     */
462aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* between real family name and style */
463aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        while ( idx > 0                     &&
464aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                ( family_name[idx] == '-' ||
465aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                  family_name[idx] == ' ' ||
466aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                  family_name[idx] == '_' ||
467aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                  family_name[idx] == '+' ) )
468aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          --idx;
469aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
470aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( idx > 0 )
471aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          family_name[idx + 1] = '\0';
472aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
473aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
474aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  }
475aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
476aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_face_init( FT_Stream      stream,
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 FT_Face        cffface,        /* CFF_Face */
480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 FT_Int         face_index,
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 FT_Int         num_params,
482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 FT_Parameter*  params )
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
484aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    CFF_Face            face        = (CFF_Face)cffface;
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error            error;
486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SFNT_Service        sfnt;
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Service_PsCMaps  psnames;
488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PSHinter_Service    pshinter;
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool             pure_cff    = 1;
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool             sfnt_format = 0;
491aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Library          library     = cffface->driver->root.library;
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sfnt = (SFNT_Service)FT_Get_Module_Interface(
495295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner             library, "sfnt" );
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !sfnt )
49741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    {
49841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
49941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      error = CFF_Err_Missing_Module;
50041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      goto Exit;
50141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    }
502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pshinter = (PSHinter_Service)FT_Get_Module_Interface(
506295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                 library, "pshinter" );
507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
50841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_TRACE2(( "CFF driver\n" ));
50941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* create input stream from resource */
511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_STREAM_SEEK( 0 ) )
512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check whether we have a valid OpenType file */
515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = sfnt->init_face( stream, face, face_index, num_params, params );
516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      if ( face->format_tag != TTAG_OTTO )  /* `OTTO'; OpenType/CFF font */
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
52041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        FT_TRACE2(( "  not an OpenType/CFF font\n" ));
52141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        error = CFF_Err_Unknown_File_Format;
52241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        goto Exit;
523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* if we are performing a simple font format check, exit immediately */
526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( face_index < 0 )
527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return CFF_Err_Ok;
528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* UNDOCUMENTED!  A CFF in an SFNT can have only a single font. */
530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( face_index > 0 )
531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_ERROR(( "cff_face_init: invalid face index\n" ));
533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error = CFF_Err_Invalid_Argument;
534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      sfnt_format = 1;
538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* now, the font can be either an OpenType/CFF font, or an SVG CEF */
540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* font; in the latter case it doesn't have a `head' table         */
541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = face->goto_table( face, TTAG_head, stream, 0 );
542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !error )
543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        pure_cff = 0;
545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* load font directory */
5470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        error = sfnt->load_face( stream, face, 0, num_params, params );
548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* load the `cmap' table explicitly */
554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error = sfnt->load_cmap( face, stream );
555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* XXX: we don't load the GPOS table, as OpenType Layout     */
559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* support will be added later to a layout library on top of */
560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* FreeType 2                                                */
561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* now load the CFF part of the file */
564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = face->goto_table( face, TTAG_CFF, stream, 0 );
565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* rewind to start of file; we are going to load a pure-CFF font */
571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_STREAM_SEEK( 0 ) )
572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = CFF_Err_Ok;
574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* now load and parse the CFF table in the file */
577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
578aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CFF_Font         cff = NULL;
579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_FontRecDict  dict;
580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory        memory = cffface->memory;
581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Int32         flags;
582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt          i;
583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_NEW( cff ) )
586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->extra.data = cff;
589295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      error = cff_font_load( library, stream, face_index, cff, pure_cff );
590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cff->pshinter = pshinter;
594aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      cff->psnames  = psnames;
595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5960a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      cffface->face_index = face_index;
5970a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Complement the root flags with some interesting information. */
599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Note that this is only necessary for pure CFF and CEF fonts; */
600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* SFNT based fonts use the `name' table instead.               */
601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cffface->num_glyphs = cff->num_glyphs;
603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      dict = &cff->top_font.font_dict;
605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* we need the `PSNames' module for CFF and CEF formats */
607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* which aren't CID-keyed                               */
608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( dict->cid_registry == 0xFFFFU && !psnames )
609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
610295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        FT_ERROR(( "cff_face_init:"
611295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                   " cannot open CFF & CEF fonts\n"
612295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                   "              "
613295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                   " without the `PSNames' module\n" ));
61441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        error = CFF_Err_Missing_Module;
61541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        goto Exit;
616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
618bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#ifdef FT_DEBUG_LEVEL_TRACE
619bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly      {
620bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        FT_UInt     idx;
621bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        FT_String*  s;
622bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
623bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
624bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        FT_TRACE4(( "SIDs\n" ));
625bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
626bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        /* dump string index, including default strings for convenience */
627bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        for ( idx = 0; idx < cff->num_strings + 390; idx++ )
628bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        {
629bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          s = cff_index_get_sid_string( cff, idx );
630bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          if ( s )
631bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            FT_TRACE4(("  %5d %s\n", idx, s ));
632bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        }
633bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly      }
634bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#endif /* FT_DEBUG_LEVEL_TRACE */
635bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
636bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly      if ( !dict->has_font_matrix )
6370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;
6380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6390a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* Normalize the font matrix so that `matrix->xx' is 1; the */
6400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* scaling is done with `units_per_em' then (at this point, */
6410a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* it already contains the scaling factor, but without      */
6420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* normalization of the matrix).                            */
6430a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /*                                                          */
6440a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* Note that the offsets must be expressed in integer font  */
6450a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* units.                                                   */
6460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      {
6480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Matrix*  matrix = &dict->font_matrix;
6490a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Vector*  offset = &dict->font_offset;
6500a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_ULong*   upm    = &dict->units_per_em;
6510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Fixed    temp   = FT_ABS( matrix->yy );
6520a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6540a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        if ( temp != 0x10000L )
6550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        {
6560a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          *upm = FT_DivFix( *upm, temp );
6570a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->xx = FT_DivFix( matrix->xx, temp );
6590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->yx = FT_DivFix( matrix->yx, temp );
6600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->xy = FT_DivFix( matrix->xy, temp );
6610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->yy = FT_DivFix( matrix->yy, temp );
6620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          offset->x  = FT_DivFix( offset->x,  temp );
6630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          offset->y  = FT_DivFix( offset->y,  temp );
6640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        }
6650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6660a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset->x >>= 16;
6670a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset->y >>= 16;
6680a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      }
6690a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      for ( i = cff->num_subfonts; i > 0; i-- )
6710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      {
6720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        CFF_FontRecDict  sub = &cff->subfonts[i - 1]->font_dict;
6730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        CFF_FontRecDict  top = &cff->top_font.font_dict;
6740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Matrix*  matrix;
6760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Vector*  offset;
6770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_ULong*   upm;
6780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Fixed    temp;
6790a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6800a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
681bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        if ( sub->has_font_matrix )
6820a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        {
683295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          FT_Long  scaling;
6840a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6850a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
686bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          /* if we have a top-level matrix, */
687bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          /* concatenate the subfont matrix */
688bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
689bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          if ( top->has_font_matrix )
690bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          {
691bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            if ( top->units_per_em > 1 && sub->units_per_em > 1 )
692bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly              scaling = FT_MIN( top->units_per_em, sub->units_per_em );
693bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            else
694bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly              scaling = 1;
6950a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
696bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            FT_Matrix_Multiply_Scaled( &top->font_matrix,
697bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                       &sub->font_matrix,
698bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                       scaling );
699bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            FT_Vector_Transform_Scaled( &sub->font_offset,
700bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                        &top->font_matrix,
701bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                        scaling );
7020a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
703bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            sub->units_per_em = FT_MulDiv( sub->units_per_em,
704bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                           top->units_per_em,
705bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                           scaling );
706bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          }
7070a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        }
7080a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        else
7090a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        {
7100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          sub->font_matrix = top->font_matrix;
7110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          sub->font_offset = top->font_offset;
7120a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          sub->units_per_em = top->units_per_em;
7140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        }
7150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7160a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        matrix = &sub->font_matrix;
7170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset = &sub->font_offset;
7180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        upm    = &sub->units_per_em;
7190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        temp   = FT_ABS( matrix->yy );
7200a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7210a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        if ( temp != 0x10000L )
7220a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        {
7230a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          *upm = FT_DivFix( *upm, temp );
7240a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7250a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->xx = FT_DivFix( matrix->xx, temp );
7260a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->yx = FT_DivFix( matrix->yx, temp );
7270a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->xy = FT_DivFix( matrix->xy, temp );
7280a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->yy = FT_DivFix( matrix->yy, temp );
7290a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          offset->x  = FT_DivFix( offset->x,  temp );
7300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          offset->y  = FT_DivFix( offset->y,  temp );
7310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        }
7320a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7330a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset->x >>= 16;
7340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset->y >>= 16;
7350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      }
7360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( pure_cff )
738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        char*  style_name = NULL;
740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* set up num_faces */
743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->num_faces = cff->num_faces;
744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* compute number of glyphs */
746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( dict->cid_registry != 0xFFFFU )
7477f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner          cffface->num_glyphs = cff->charset.max_cid + 1;
748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cffface->num_glyphs = cff->charstrings_index.count;
750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* set global bbox, as well as EM size */
752295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        cffface->bbox.xMin =   dict->font_bbox.xMin            >> 16;
753295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        cffface->bbox.yMin =   dict->font_bbox.yMin            >> 16;
754295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        /* no `U' suffix here to 0xFFFF! */
755295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16;
756295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16;
757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        cffface->units_per_EM = (FT_UShort)( dict->units_per_em );
759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->ascender  = (FT_Short)( cffface->bbox.yMax );
761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->descender = (FT_Short)( cffface->bbox.yMin );
762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 );
764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cffface->height < cffface->ascender - cffface->descender )
765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cffface->height = (FT_Short)( cffface->ascender - cffface->descender );
766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->underline_position  =
768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          (FT_Short)( dict->underline_position >> 16 );
769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->underline_thickness =
770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          (FT_Short)( dict->underline_thickness >> 16 );
771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* retrieve font family & style name */
773aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        cffface->family_name = cff_index_get_name( cff, face_index );
774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cffface->family_name )
775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
776aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          char*  full   = cff_index_get_sid_string( cff,
777aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                                    dict->full_name );
778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          char*  fullp  = full;
779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          char*  family = cffface->family_name;
780aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          char*  family_name = NULL;
781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
78341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier          remove_subset_prefix( cffface->family_name );
784aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( dict->family_name )
786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
787aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            family_name = cff_index_get_sid_string( cff,
788aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                                    dict->family_name );
789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( family_name )
790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              family = family_name;
791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* We try to extract the style name from the full name.   */
794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* We need to ignore spaces and dashes during the search. */
795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( full && family )
796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            while ( *fullp )
798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              /* skip common characters at the start of both strings */
800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( *fullp == *family )
801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                family++;
803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                fullp++;
804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                continue;
805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              /* ignore spaces and dashes in full name during comparison */
808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( *fullp == ' ' || *fullp == '-' )
809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                fullp++;
811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                continue;
812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              /* ignore spaces and dashes in family name during comparison */
815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( *family == ' ' || *family == '-' )
816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                family++;
818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                continue;
819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( !*family && *fullp )
822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                /* The full name begins with the same characters as the  */
824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                /* family name, with spaces and dashes removed.  In this */
825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                /* case, the remaining string in `fullp' will be used as */
826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                /* the style name.                                       */
827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                style_name = cff_strcpy( memory, fullp );
828aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
829aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                /* remove the style part from the family name (if present) */
83041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                remove_style( cffface->family_name, style_name );
831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              break;
833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          char  *cid_font_name =
839aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                   cff_index_get_sid_string( cff,
840aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                             dict->cid_font_name );
841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* do we have a `/FontName' for a CID-keyed font? */
844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( cid_font_name )
845aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            cffface->family_name = cff_strcpy( memory, cid_font_name );
846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( style_name )
849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cffface->style_name = style_name;
850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* assume "Regular" style if we don't know better */
852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cffface->style_name = cff_strcpy( memory, (char *)"Regular" );
853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*******************************************************************/
855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                 */
856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* Compute face flags.                                             */
857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                 */
85841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
85941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
86041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                FT_FACE_FLAG_HINTER;      /* has native hinter */
861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( sfnt_format )
86341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier          flags |= FT_FACE_FLAG_SFNT;
864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* fixed width font? */
866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( dict->is_fixed_pitch )
86741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier          flags |= FT_FACE_FLAG_FIXED_WIDTH;
868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */
870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* kerning available? */
872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( face->kern_pairs )
87341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier          flags |= FT_FACE_FLAG_KERNING;
874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->face_flags = flags;
877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*******************************************************************/
879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                 */
880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* Compute style flags.                                            */
881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                 */
882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        flags = 0;
883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( dict->italic_angle )
885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          flags |= FT_STYLE_FLAG_ITALIC;
886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
888aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          char  *weight = cff_index_get_sid_string( cff,
889aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                                    dict->weight );
890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( weight )
893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( !ft_strcmp( weight, "Bold"  ) ||
894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 !ft_strcmp( weight, "Black" ) )
895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              flags |= FT_STYLE_FLAG_BOLD;
896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* double check */
899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name )
900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( !ft_strncmp( cffface->style_name, "Bold", 4 )  ||
901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               !ft_strncmp( cffface->style_name, "Black", 5 ) )
902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            flags |= FT_STYLE_FLAG_BOLD;
903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->style_flags = flags;
905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */
910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* has unset this flag because of the 3.0 `post' table.          */
911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( dict->cid_registry == 0xFFFFU )
912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      if ( dict->cid_registry != 0xFFFFU && pure_cff )
916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;
917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*******************************************************************/
920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                 */
921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Compute char maps.                                              */
922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                 */
923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9240a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* Try to synthesize a Unicode charmap if there is none available */
925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* already.  If an OpenType font contains a Unicode "cmap", we    */
926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* will use it, whatever be in the CFF part of the file.          */
927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_CharMapRec  cmaprec;
929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_CharMap     cmap;
930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_UInt        nn;
931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CFF_Encoding   encoding = &cff->encoding;
932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ )
935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cmap = cffface->charmaps[nn];
937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
938aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          /* Windows Unicode? */
939aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          if ( cmap->platform_id == TT_PLATFORM_MICROSOFT &&
940aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich               cmap->encoding_id == TT_MS_ID_UNICODE_CS   )
941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Skip_Unicode;
942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
943aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          /* Apple Unicode platform id? */
944aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE )
945aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            goto Skip_Unicode; /* Apple Unicode */
946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* since CID-keyed fonts don't contain glyph names, we can't */
949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* construct a cmap                                          */
950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU )
951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
953aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_MAX_CHARMAP_CACHEABLE
954aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE )
955aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        {
956aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          FT_ERROR(( "cff_face_init: no Unicode cmap is found, "
957aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                     "and too many subtables (%d) to add synthesized cmap\n",
958aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                     nn ));
959aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          goto Exit;
960aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        }
961aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif
962aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* we didn't find a Unicode charmap -- synthesize one */
964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cmaprec.face        = cffface;
965aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        cmaprec.platform_id = TT_PLATFORM_MICROSOFT;
966aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;
967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cmaprec.encoding    = FT_ENCODING_UNICODE;
968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nn = (FT_UInt)cffface->num_charmaps;
970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
971aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        error = FT_CMap_New( &FT_CFF_CMAP_UNICODE_CLASS_REC_GET, NULL,
972aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                             &cmaprec, NULL );
973aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        if ( error && FT_Err_No_Unicode_Glyph_Name != error )
974aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          goto Exit;
975aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        error = FT_Err_Ok;
976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* if no Unicode charmap was previously selected, select this one */
978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps )
979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cffface->charmap = cffface->charmaps[nn];
980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Skip_Unicode:
982aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_MAX_CHARMAP_CACHEABLE
983aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        if ( nn > FT_MAX_CHARMAP_CACHEABLE )
984aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        {
985aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          FT_ERROR(( "cff_face_init: Unicode cmap is found, "
986aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                     "but too many preceding subtables (%d) to access\n",
987aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                     nn - 1 ));
988aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          goto Exit;
989aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        }
990aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif
991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( encoding->count > 0 )
992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_CMap_Class  clazz;
994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cmaprec.face        = cffface;
997aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          cmaprec.platform_id = TT_PLATFORM_ADOBE;  /* Adobe platform id */
998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( encoding->offset == 0 )
1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding_id = TT_ADOBE_ID_STANDARD;
1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding    = FT_ENCODING_ADOBE_STANDARD;
1003295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            clazz               = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET;
1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( encoding->offset == 1 )
1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding_id = TT_ADOBE_ID_EXPERT;
1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding    = FT_ENCODING_ADOBE_EXPERT;
1009295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            clazz               = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET;
1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else
1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM;
1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding    = FT_ENCODING_ADOBE_CUSTOM;
1015295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            clazz               = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET;
1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1018aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          error = FT_CMap_New( clazz, NULL, &cmaprec, NULL );
1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_face_done( FT_Face  cffface )         /* CFF_Face */
1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
10310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    CFF_Face      face = (CFF_Face)cffface;
10320a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    FT_Memory     memory;
10330a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    SFNT_Service  sfnt;
10340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
10350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
10360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( !face )
10370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      return;
1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
10390a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    memory = cffface->memory;
10400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    sfnt   = (SFNT_Service)face->sfnt;
1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( sfnt )
1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      sfnt->done_face( face );
1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Font  cff = (CFF_Font)face->extra.data;
1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( cff )
1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cff_font_done( cff );
1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FREE( face->extra.data );
1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_driver_init( FT_Module  module )
1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( module );
1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CFF_Err_Ok;
1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_driver_done( FT_Module  module )
1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( module );
1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
1075