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/*                                                                         */
7ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki/*  Copyright 1996-2015 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>
20727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_CALC_H
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_STREAM_H
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_ERRORS_H
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_IDS_H
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_TAGS_H
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_SFNT_H
28727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_CFF_DRIVER_H
29727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffobjs.h"
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffload.h"
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffcmap.h"
33295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "cffpic.h"
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
35727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "cfferrs.h"
36727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* messages during execution.                                            */
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_cffobjs
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                            SIZE FUNCTIONS                             */
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Note that we store the global hints in the size's `internal' root    */
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  field.                                                               */
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static PSH_Globals_Funcs
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_get_globals_funcs( CFF_Size  size )
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Face          face     = (CFF_Face)size->root.face;
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font          font     = (CFF_Font)face->extra.data;
63aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    PSHinter_Service  pshinter = font->pshinter;
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Module         module;
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    module = FT_Get_Module( size->root.face->driver->root.library,
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            "pshinter" );
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ( module && pshinter && pshinter->get_globals_funcs )
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           ? pshinter->get_globals_funcs( module )
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           : 0;
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_done( FT_Size  cffsize )        /* CFF_Size */
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Size      size     = (CFF_Size)cffsize;
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Face      face     = (CFF_Face)size->root.face;
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font      font     = (CFF_Font)face->extra.data;
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Internal  internal = (CFF_Internal)cffsize->internal;
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( internal )
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      PSH_Globals_Funcs  funcs;
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      funcs = cff_size_get_globals_funcs( size );
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( funcs )
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_UInt  i;
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        funcs->destroy( internal->topfont );
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( i = font->num_subfonts; i > 0; i-- )
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          funcs->destroy( internal->subfonts[i - 1] );
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `internal' is freed by destroy_size (in ftobjs.c) */
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CFF and Type 1 private dictionaries have slightly different      */
1070a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* structures; we need to synthesize a Type 1 dictionary on the fly */
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_make_private_dict( CFF_SubFont  subfont,
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         PS_Private   priv )
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Private  cpriv = &subfont->private_dict;
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt      n, count;
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_MEM_ZERO( priv, sizeof ( *priv ) );
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_blue_values = cpriv->num_blue_values;
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->blue_values[n] = (FT_Short)cpriv->blue_values[n];
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_other_blues = cpriv->num_other_blues;
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->other_blues[n] = (FT_Short)cpriv->other_blues[n];
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_family_blues = cpriv->num_family_blues;
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->family_blues[n] = (FT_Short)cpriv->family_blues[n];
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_family_other_blues = cpriv->num_family_other_blues;
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n];
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->blue_scale = cpriv->blue_scale;
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->blue_shift = (FT_Int)cpriv->blue_shift;
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->blue_fuzz  = (FT_Int)cpriv->blue_fuzz;
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->standard_width[0]  = (FT_UShort)cpriv->standard_width;
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->standard_height[0] = (FT_UShort)cpriv->standard_height;
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_snap_widths = cpriv->num_snap_widths;
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n];
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    count = priv->num_snap_heights = cpriv->num_snap_heights;
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < count; n++ )
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n];
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->force_bold     = cpriv->force_bold;
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->language_group = cpriv->language_group;
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    priv->lenIV          = cpriv->lenIV;
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_init( FT_Size  cffsize )         /* CFF_Size */
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Size           size  = (CFF_Size)cffsize;
160727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Error           error = FT_Err_Ok;
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PSH_Globals_Funcs  funcs = cff_size_get_globals_funcs( size );
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( funcs )
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Face      face     = (CFF_Face)cffsize->face;
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Font      font     = (CFF_Font)face->extra.data;
168aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CFF_Internal  internal = NULL;
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      PS_PrivateRec  priv;
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory      memory = cffsize->face->memory;
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt  i;
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_NEW( internal ) )
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cff_make_private_dict( &font->top_font, &priv );
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = funcs->create( cffsize->face->memory, &priv,
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             &internal->topfont );
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = font->num_subfonts; i > 0; i-- )
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CFF_SubFont  sub = font->subfonts[i - 1];
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cff_make_private_dict( sub, &priv );
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error = funcs->create( cffsize->face->memory, &priv,
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               &internal->subfonts[i - 1] );
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cffsize->internal = (FT_Size_Internal)(void*)internal;
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->strike_index = 0xFFFFFFFFUL;
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_select( FT_Size   size,
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   FT_ULong  strike_index )
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Size           cffsize = (CFF_Size)size;
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PSH_Globals_Funcs  funcs;
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cffsize->strike_index = strike_index;
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Select_Metrics( size->face, strike_index );
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    funcs = cff_size_get_globals_funcs( cffsize );
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( funcs )
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Face      face     = (CFF_Face)size->face;
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Font      font     = (CFF_Font)face->extra.data;
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Internal  internal = (CFF_Internal)size->internal;
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
229ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki      FT_Long  top_upm  = (FT_Long)font->top_font.font_dict.units_per_em;
230ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki      FT_UInt  i;
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      funcs->set_scale( internal->topfont,
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        size->metrics.x_scale, size->metrics.y_scale,
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        0, 0 );
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = font->num_subfonts; i > 0; i-- )
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CFF_SubFont  sub     = font->subfonts[i - 1];
240ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki        FT_Long      sub_upm = (FT_Long)sub->font_dict.units_per_em;
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Pos       x_scale, y_scale;
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( top_upm != sub_upm )
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x_scale = size->metrics.x_scale;
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y_scale = size->metrics.y_scale;
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        funcs->set_scale( internal->subfonts[i - 1],
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          x_scale, y_scale, 0, 0 );
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_size_request( FT_Size          size,
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Size_Request  req )
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Size           cffsize = (CFF_Size)size;
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PSH_Globals_Funcs  funcs;
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_HAS_FIXED_SIZES( size->face ) )
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Face      cffface = (CFF_Face)size->face;
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      SFNT_Service  sfnt    = (SFNT_Service)cffface->sfnt;
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_ULong      strike_index;
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) )
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffsize->strike_index = 0xFFFFFFFFUL;
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return cff_size_select( size, strike_index );
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Request_Metrics( size->face, req );
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    funcs = cff_size_get_globals_funcs( cffsize );
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( funcs )
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Face      cffface  = (CFF_Face)size->face;
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Font      font     = (CFF_Font)cffface->extra.data;
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Internal  internal = (CFF_Internal)size->internal;
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
301ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki      FT_Long  top_upm  = (FT_Long)font->top_font.font_dict.units_per_em;
302ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki      FT_UInt  i;
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      funcs->set_scale( internal->topfont,
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        size->metrics.x_scale, size->metrics.y_scale,
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        0, 0 );
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = font->num_subfonts; i > 0; i-- )
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CFF_SubFont  sub     = font->subfonts[i - 1];
312ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki        FT_Long      sub_upm = (FT_Long)sub->font_dict.units_per_em;
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Pos       x_scale, y_scale;
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( top_upm != sub_upm )
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x_scale = size->metrics.x_scale;
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y_scale = size->metrics.y_scale;
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        funcs->set_scale( internal->subfonts[i - 1],
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          x_scale, y_scale, 0, 0 );
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
332727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                            SLOT  FUNCTIONS                            */
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_slot_done( FT_GlyphSlot  slot )
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
345ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    slot->internal->glyph_hints = NULL;
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_slot_init( FT_GlyphSlot  slot )
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Face          face     = (CFF_Face)slot->face;
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font          font     = (CFF_Font)face->extra.data;
354aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    PSHinter_Service  pshinter = font->pshinter;
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( pshinter )
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Module  module;
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      module = FT_Get_Module( slot->face->driver->root.library,
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              "pshinter" );
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( module )
365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        T2_Hints_Funcs  funcs;
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        funcs = pshinter->get_t2_funcs( module );
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        slot->internal->glyph_hints = (void*)funcs;
371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                           FACE  FUNCTIONS                             */
381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_String*
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_strcpy( FT_Memory         memory,
386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              const FT_String*  source )
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error    error;
389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_String*  result;
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (void)FT_STRDUP( result, source );
393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( error );
395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
400aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /* Strip all subset prefixes of the form `ABCDEF+'.  Usually, there */
401aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold'   */
402aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /* have been seen in the wild.                                      */
403aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
404aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  static void
405aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  remove_subset_prefix( FT_String*  name )
406aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  {
407aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Int32  idx             = 0;
408727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Int32  length          = (FT_Int32)strlen( name ) + 1;
409aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Bool   continue_search = 1;
41041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
411aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
412aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    while ( continue_search )
413aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    {
414aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      if ( length >= 7 && name[6] == '+' )
415aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      {
416aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        for ( idx = 0; idx < 6; idx++ )
417aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        {
418aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          /* ASCII uppercase letters */
419aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )
420aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            continue_search = 0;
421aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        }
422aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
423aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        if ( continue_search )
424aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        {
425aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          for ( idx = 7; idx < length; idx++ )
426aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            name[idx - 7] = name[idx];
427aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          length -= 7;
428aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        }
429aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      }
430aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      else
431aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        continue_search = 0;
432aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    }
433aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  }
434aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
435aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
436aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  /* Remove the style part from the family name (if present). */
437aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
438aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  static void
439aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  remove_style( FT_String*        family_name,
440aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                const FT_String*  style_name )
441aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  {
442aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Int32  family_name_length, style_name_length;
443aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
444aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
445727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    family_name_length = (FT_Int32)strlen( family_name );
446727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    style_name_length  = (FT_Int32)strlen( style_name );
447aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
448aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( family_name_length > style_name_length )
449aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {
450aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      FT_Int  idx;
451aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
452aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
453aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      for ( idx = 1; idx <= style_name_length; ++idx )
454aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
455aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( family_name[family_name_length - idx] !=
456aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner             style_name[style_name_length - idx] )
457aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          break;
458aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
459aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
460aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( idx > style_name_length )
461aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
462aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* family_name ends with style_name; remove it */
463aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        idx = family_name_length - style_name_length - 1;
464aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
465aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* also remove special characters     */
466aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* between real family name and style */
467aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        while ( idx > 0                     &&
468aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                ( family_name[idx] == '-' ||
469aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                  family_name[idx] == ' ' ||
470aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                  family_name[idx] == '_' ||
471aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                  family_name[idx] == '+' ) )
472aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          --idx;
473aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
474aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( idx > 0 )
475aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          family_name[idx + 1] = '\0';
476aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
477aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
478aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  }
479aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
480aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_face_init( FT_Stream      stream,
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 FT_Face        cffface,        /* CFF_Face */
484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 FT_Int         face_index,
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 FT_Int         num_params,
486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 FT_Parameter*  params )
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
488aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    CFF_Face            face        = (CFF_Face)cffface;
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error            error;
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SFNT_Service        sfnt;
491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Service_PsCMaps  psnames;
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PSHinter_Service    pshinter;
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool             pure_cff    = 1;
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool             sfnt_format = 0;
495aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Library          library     = cffface->driver->root.library;
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sfnt = (SFNT_Service)FT_Get_Module_Interface(
499295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner             library, "sfnt" );
500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !sfnt )
50141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    {
50241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Missing_Module );
50441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      goto Exit;
50541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    }
506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pshinter = (PSHinter_Service)FT_Get_Module_Interface(
510295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                 library, "pshinter" );
511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
51241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_TRACE2(( "CFF driver\n" ));
51341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* create input stream from resource */
515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_STREAM_SEEK( 0 ) )
516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check whether we have a valid OpenType file */
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = sfnt->init_face( stream, face, face_index, num_params, params );
520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5220a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      if ( face->format_tag != TTAG_OTTO )  /* `OTTO'; OpenType/CFF font */
523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
52441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        FT_TRACE2(( "  not an OpenType/CFF font\n" ));
525727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        error = FT_THROW( Unknown_File_Format );
52641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        goto Exit;
527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* if we are performing a simple font format check, exit immediately */
530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( face_index < 0 )
531727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return FT_Err_Ok;
532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      sfnt_format = 1;
534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* now, the font can be either an OpenType/CFF font, or an SVG CEF */
536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* font; in the latter case it doesn't have a `head' table         */
537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = face->goto_table( face, TTAG_head, stream, 0 );
538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !error )
539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        pure_cff = 0;
541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* load font directory */
543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        error = sfnt->load_face( stream, face, face_index,
544727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                 num_params, params );
545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* load the `cmap' table explicitly */
551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error = sfnt->load_cmap( face, stream );
552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* now load the CFF part of the file */
557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = face->goto_table( face, TTAG_CFF, stream, 0 );
558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* rewind to start of file; we are going to load a pure-CFF font */
564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_STREAM_SEEK( 0 ) )
565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
566727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_Err_Ok;
567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* now load and parse the CFF table in the file */
570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
571aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CFF_Font         cff = NULL;
572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_FontRecDict  dict;
573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory        memory = cffface->memory;
574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Int32         flags;
575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt          i;
576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_NEW( cff ) )
579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      face->extra.data = cff;
582295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      error = cff_font_load( library, stream, face_index, cff, pure_cff );
583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cff->pshinter = pshinter;
587aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      cff->psnames  = psnames;
588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5890a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      cffface->face_index = face_index;
5900a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Complement the root flags with some interesting information. */
592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Note that this is only necessary for pure CFF and CEF fonts; */
593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* SFNT based fonts use the `name' table instead.               */
594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
595ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki      cffface->num_glyphs = (FT_Long)cff->num_glyphs;
596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      dict = &cff->top_font.font_dict;
598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* we need the `PSNames' module for CFF and CEF formats */
600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* which aren't CID-keyed                               */
601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( dict->cid_registry == 0xFFFFU && !psnames )
602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
603295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        FT_ERROR(( "cff_face_init:"
604295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                   " cannot open CFF & CEF fonts\n"
605295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                   "              "
606295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                   " without the `PSNames' module\n" ));
607727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        error = FT_THROW( Missing_Module );
60841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        goto Exit;
609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
611bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#ifdef FT_DEBUG_LEVEL_TRACE
612bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly      {
613bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        FT_UInt     idx;
614bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        FT_String*  s;
615bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
616bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
617bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        FT_TRACE4(( "SIDs\n" ));
618bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
619bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        /* dump string index, including default strings for convenience */
620bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        for ( idx = 0; idx < cff->num_strings + 390; idx++ )
621bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        {
622bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          s = cff_index_get_sid_string( cff, idx );
623bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          if ( s )
624bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            FT_TRACE4(("  %5d %s\n", idx, s ));
625bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        }
626bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly      }
627bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#endif /* FT_DEBUG_LEVEL_TRACE */
628bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
629bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly      if ( !dict->has_font_matrix )
6300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;
6310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6320a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* Normalize the font matrix so that `matrix->xx' is 1; the */
6330a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* scaling is done with `units_per_em' then (at this point, */
6340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* it already contains the scaling factor, but without      */
6350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* normalization of the matrix).                            */
6360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /*                                                          */
6370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* Note that the offsets must be expressed in integer font  */
6380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* units.                                                   */
6390a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      {
6410a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Matrix*  matrix = &dict->font_matrix;
6420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Vector*  offset = &dict->font_offset;
6430a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_ULong*   upm    = &dict->units_per_em;
6440a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Fixed    temp   = FT_ABS( matrix->yy );
6450a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        if ( temp != 0x10000L )
6480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        {
649ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki          *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp );
6500a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->xx = FT_DivFix( matrix->xx, temp );
6520a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->yx = FT_DivFix( matrix->yx, temp );
6530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->xy = FT_DivFix( matrix->xy, temp );
6540a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->yy = FT_DivFix( matrix->yy, temp );
6550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          offset->x  = FT_DivFix( offset->x,  temp );
6560a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          offset->y  = FT_DivFix( offset->y,  temp );
6570a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        }
6580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset->x >>= 16;
6600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset->y >>= 16;
6610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      }
6620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      for ( i = cff->num_subfonts; i > 0; i-- )
6640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      {
6650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        CFF_FontRecDict  sub = &cff->subfonts[i - 1]->font_dict;
6660a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        CFF_FontRecDict  top = &cff->top_font.font_dict;
6670a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6680a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Matrix*  matrix;
6690a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Vector*  offset;
6700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_ULong*   upm;
6710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        FT_Fixed    temp;
6720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
674bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly        if ( sub->has_font_matrix )
6750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        {
676295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          FT_Long  scaling;
6770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
6780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
679bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          /* if we have a top-level matrix, */
680bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          /* concatenate the subfont matrix */
681bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly
682bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          if ( top->has_font_matrix )
683bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          {
684bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            if ( top->units_per_em > 1 && sub->units_per_em > 1 )
685ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki              scaling = (FT_Long)FT_MIN( top->units_per_em,
686ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki                                         sub->units_per_em );
687bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            else
688bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly              scaling = 1;
6890a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
690bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            FT_Matrix_Multiply_Scaled( &top->font_matrix,
691bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                       &sub->font_matrix,
692bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                       scaling );
693bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly            FT_Vector_Transform_Scaled( &sub->font_offset,
694bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                        &top->font_matrix,
695bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly                                        scaling );
6960a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
697ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki            sub->units_per_em = (FT_ULong)
698ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki                                  FT_MulDiv( (FT_Long)sub->units_per_em,
699ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki                                             (FT_Long)top->units_per_em,
700ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki                                             scaling );
701bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly          }
7020a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        }
7030a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        else
7040a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        {
7050a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          sub->font_matrix = top->font_matrix;
7060a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          sub->font_offset = top->font_offset;
7070a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7080a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          sub->units_per_em = top->units_per_em;
7090a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        }
7100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        matrix = &sub->font_matrix;
7120a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset = &sub->font_offset;
7130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        upm    = &sub->units_per_em;
7140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        temp   = FT_ABS( matrix->yy );
7150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7160a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        if ( temp != 0x10000L )
7170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        {
718ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki          *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp );
7190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7200a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->xx = FT_DivFix( matrix->xx, temp );
7210a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->yx = FT_DivFix( matrix->yx, temp );
7220a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->xy = FT_DivFix( matrix->xy, temp );
7230a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          matrix->yy = FT_DivFix( matrix->yy, temp );
7240a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          offset->x  = FT_DivFix( offset->x,  temp );
7250a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project          offset->y  = FT_DivFix( offset->y,  temp );
7260a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        }
7270a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
7280a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset->x >>= 16;
7290a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        offset->y >>= 16;
7300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      }
7310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( pure_cff )
733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        char*  style_name = NULL;
735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* set up num_faces */
738ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki        cffface->num_faces = (FT_Long)cff->num_faces;
739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* compute number of glyphs */
741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( dict->cid_registry != 0xFFFFU )
742ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki          cffface->num_glyphs = (FT_Long)( cff->charset.max_cid + 1 );
743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
744ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki          cffface->num_glyphs = (FT_Long)cff->charstrings_index.count;
745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* set global bbox, as well as EM size */
747295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        cffface->bbox.xMin =   dict->font_bbox.xMin            >> 16;
748295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        cffface->bbox.yMin =   dict->font_bbox.yMin            >> 16;
749295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        /* no `U' suffix here to 0xFFFF! */
750295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16;
751295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16;
752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        cffface->units_per_EM = (FT_UShort)( dict->units_per_em );
754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->ascender  = (FT_Short)( cffface->bbox.yMax );
756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->descender = (FT_Short)( cffface->bbox.yMin );
757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 );
759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cffface->height < cffface->ascender - cffface->descender )
760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cffface->height = (FT_Short)( cffface->ascender - cffface->descender );
761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->underline_position  =
763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          (FT_Short)( dict->underline_position >> 16 );
764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->underline_thickness =
765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          (FT_Short)( dict->underline_thickness >> 16 );
766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* retrieve font family & style name */
768ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki        cffface->family_name = cff_index_get_name( cff,
769ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki                                                   (FT_UInt)face_index );
770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cffface->family_name )
771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
772aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          char*  full   = cff_index_get_sid_string( cff,
773aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                                    dict->full_name );
774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          char*  fullp  = full;
775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          char*  family = cffface->family_name;
776aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          char*  family_name = NULL;
777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
77941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier          remove_subset_prefix( cffface->family_name );
780aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( dict->family_name )
782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
783aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            family_name = cff_index_get_sid_string( cff,
784aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                                    dict->family_name );
785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( family_name )
786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              family = family_name;
787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* We try to extract the style name from the full name.   */
790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* We need to ignore spaces and dashes during the search. */
791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( full && family )
792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            while ( *fullp )
794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              /* skip common characters at the start of both strings */
796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( *fullp == *family )
797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                family++;
799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                fullp++;
800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                continue;
801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              /* ignore spaces and dashes in full name during comparison */
804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( *fullp == ' ' || *fullp == '-' )
805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                fullp++;
807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                continue;
808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              /* ignore spaces and dashes in family name during comparison */
811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( *family == ' ' || *family == '-' )
812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                family++;
814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                continue;
815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( !*family && *fullp )
818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                /* The full name begins with the same characters as the  */
820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                /* family name, with spaces and dashes removed.  In this */
821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                /* case, the remaining string in `fullp' will be used as */
822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                /* the style name.                                       */
823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                style_name = cff_strcpy( memory, fullp );
824aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
825aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                /* remove the style part from the family name (if present) */
82641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                remove_style( cffface->family_name, style_name );
827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              break;
829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          char  *cid_font_name =
835aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                   cff_index_get_sid_string( cff,
836aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                             dict->cid_font_name );
837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* do we have a `/FontName' for a CID-keyed font? */
840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( cid_font_name )
841aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            cffface->family_name = cff_strcpy( memory, cid_font_name );
842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( style_name )
845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cffface->style_name = style_name;
846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* assume "Regular" style if we don't know better */
848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cffface->style_name = cff_strcpy( memory, (char *)"Regular" );
849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*******************************************************************/
851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                 */
852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* Compute face flags.                                             */
853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                 */
85441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
85541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
85641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                FT_FACE_FLAG_HINTER;      /* has native hinter */
857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( sfnt_format )
85941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier          flags |= FT_FACE_FLAG_SFNT;
860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* fixed width font? */
862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( dict->is_fixed_pitch )
86341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier          flags |= FT_FACE_FLAG_FIXED_WIDTH;
864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */
866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* kerning available? */
868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( face->kern_pairs )
86941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier          flags |= FT_FACE_FLAG_KERNING;
870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8729c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        cffface->face_flags |= flags;
873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*******************************************************************/
875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                 */
876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* Compute style flags.                                            */
877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*                                                                 */
878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        flags = 0;
879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( dict->italic_angle )
881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          flags |= FT_STYLE_FLAG_ITALIC;
882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
884aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          char  *weight = cff_index_get_sid_string( cff,
885aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                                    dict->weight );
886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( weight )
889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( !ft_strcmp( weight, "Bold"  ) ||
890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 !ft_strcmp( weight, "Black" ) )
891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              flags |= FT_STYLE_FLAG_BOLD;
892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* double check */
895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name )
896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( !ft_strncmp( cffface->style_name, "Bold", 4 )  ||
897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               !ft_strncmp( cffface->style_name, "Black", 5 ) )
898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            flags |= FT_STYLE_FLAG_BOLD;
899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->style_flags = flags;
901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */
906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* has unset this flag because of the 3.0 `post' table.          */
907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( dict->cid_registry == 0xFFFFU )
908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      if ( dict->cid_registry != 0xFFFFU && pure_cff )
912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;
913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*******************************************************************/
916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                 */
917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Compute char maps.                                              */
918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*                                                                 */
919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9200a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      /* Try to synthesize a Unicode charmap if there is none available */
921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* already.  If an OpenType font contains a Unicode "cmap", we    */
922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* will use it, whatever be in the CFF part of the file.          */
923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_CharMapRec  cmaprec;
925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_CharMap     cmap;
926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_UInt        nn;
927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CFF_Encoding   encoding = &cff->encoding;
928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ )
931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cmap = cffface->charmaps[nn];
933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
934aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          /* Windows Unicode? */
935aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          if ( cmap->platform_id == TT_PLATFORM_MICROSOFT &&
936aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich               cmap->encoding_id == TT_MS_ID_UNICODE_CS   )
937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Skip_Unicode;
938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
939aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          /* Apple Unicode platform id? */
940aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE )
941aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            goto Skip_Unicode; /* Apple Unicode */
942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* since CID-keyed fonts don't contain glyph names, we can't */
945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* construct a cmap                                          */
946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU )
947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* we didn't find a Unicode charmap -- synthesize one */
950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cmaprec.face        = cffface;
951aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        cmaprec.platform_id = TT_PLATFORM_MICROSOFT;
952aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;
953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cmaprec.encoding    = FT_ENCODING_UNICODE;
954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nn = (FT_UInt)cffface->num_charmaps;
956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
957727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL,
958aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                             &cmaprec, NULL );
959727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( error                                      &&
960727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
961aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          goto Exit;
962aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        error = FT_Err_Ok;
963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* if no Unicode charmap was previously selected, select this one */
965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps )
966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cffface->charmap = cffface->charmaps[nn];
967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Skip_Unicode:
969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( encoding->count > 0 )
970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_CMap_Class  clazz;
972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cmaprec.face        = cffface;
975aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          cmaprec.platform_id = TT_PLATFORM_ADOBE;  /* Adobe platform id */
976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( encoding->offset == 0 )
978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding_id = TT_ADOBE_ID_STANDARD;
980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding    = FT_ENCODING_ADOBE_STANDARD;
981727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;
982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( encoding->offset == 1 )
984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding_id = TT_ADOBE_ID_EXPERT;
986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding    = FT_ENCODING_ADOBE_EXPERT;
987727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;
988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else
990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM;
992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cmaprec.encoding    = FT_ENCODING_ADOBE_CUSTOM;
993727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;
994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
996aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          error = FT_CMap_New( clazz, NULL, &cmaprec, NULL );
997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_face_done( FT_Face  cffface )         /* CFF_Face */
1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
10090a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    CFF_Face      face = (CFF_Face)cffface;
10100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    FT_Memory     memory;
10110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    SFNT_Service  sfnt;
10120a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
10130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
10140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( !face )
10150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      return;
1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
10170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    memory = cffface->memory;
10180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    sfnt   = (SFNT_Service)face->sfnt;
1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( sfnt )
1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      sfnt->done_face( face );
1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CFF_Font  cff = (CFF_Font)face->extra.data;
1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( cff )
1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cff_font_done( cff );
1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FREE( face->extra.data );
1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
1037727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  cff_driver_init( FT_Module  module )        /* CFF_Driver */
1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1039727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CFF_Driver  driver = (CFF_Driver)module;
1040727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
1041727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
1042ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    /* set default property values, cf. `ftcffdrv.h' */
1043727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
1044ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
1045727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else
1046ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->hinting_engine = FT_CFF_HINTING_ADOBE;
1047727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
1048ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki
1049727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    driver->no_stem_darkening = FALSE;
1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1051ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1;
1052ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1;
1053ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2;
1054ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2;
1055ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3;
1056ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3;
1057ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
1058ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki    driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
1059ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1060727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
1065727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  cff_driver_done( FT_Module  module )        /* CFF_Driver */
1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( module );
1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
1072