1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  afglobal.c                                                             */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    Auto-fitter routines to compute global hinting values (body).        */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
79c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod/*  Copyright 2003-2014 by                                                 */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "afglobal.h"
209c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "afranges.h"
219c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "hbshim.h"
229c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include FT_INTERNAL_DEBUG_H
239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
249c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
259c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
269c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*                                                                       */
279c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
289c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
299c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /* messages during execution.                                            */
309c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*                                                                       */
319c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#undef  FT_COMPONENT
329c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define FT_COMPONENT  trace_afglobal
339c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
34ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
35ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* get writing system specific header files */
36ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  WRITING_SYSTEM
37ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define WRITING_SYSTEM( ws, WS )  /* empty */
38ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afwrtsys.h"
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "aferrors.h"
41ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afpic.h"
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
449c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#undef  SCRIPT
459c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
469c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          AF_DEFINE_SCRIPT_CLASS(           \
479c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            af_ ## s ## _script_class,      \
489c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            AF_SCRIPT_ ## S,                \
499c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            af_ ## s ## _uniranges,         \
509c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            sc1, sc2, sc3 )
519c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
529c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "afscript.h"
539c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
549c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
559c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#undef  STYLE
569c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define STYLE( s, S, d, ws, sc, ss, c )  \
579c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          AF_DEFINE_STYLE_CLASS(         \
589c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            af_ ## s ## _style_class,    \
599c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            AF_STYLE_ ## S,              \
609c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            ws,                          \
619c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            sc,                          \
629c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            ss,                          \
639c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            c )
649c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
659c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "afstyles.h"
669c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
679c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
68295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifndef FT_CONFIG_OPTION_PIC
69295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
70ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  WRITING_SYSTEM
71ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define WRITING_SYSTEM( ws, WS )               \
72ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          &af_ ## ws ## _writing_system_class,
73295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
74ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_LOCAL_ARRAY_DEF( AF_WritingSystemClass )
75ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  af_writing_system_classes[] =
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
77ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
78ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afwrtsys.h"
79ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
80ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    NULL  /* do not remove */
81ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  };
82ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
83ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
84ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  SCRIPT
859c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
86ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          &af_ ## s ## _script_class,
87ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
88ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_LOCAL_ARRAY_DEF( AF_ScriptClass )
89ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  af_script_classes[] =
90ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {
91ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
92ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afscript.h"
93ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NULL  /* do not remove */
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
979c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
989c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#undef  STYLE
999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define STYLE( s, S, d, ws, sc, ss, c ) \
1009c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          &af_ ## s ## _style_class,
1019c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  FT_LOCAL_ARRAY_DEF( AF_StyleClass )
1039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  af_style_classes[] =
1049c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  {
1059c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "afstyles.h"
1079c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1089c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    NULL  /* do not remove */
1099c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  };
1109c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
111aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif /* !FT_CONFIG_OPTION_PIC */
112295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
114ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef FT_DEBUG_LEVEL_TRACE
115ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1169c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#undef  STYLE
1179c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define STYLE( s, S, d, ws, sc, ss, c )  #s,
118ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
119ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_LOCAL_ARRAY_DEF( char* )
1209c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  af_style_names[] =
121ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {
122ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "afstyles.h"
124ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
125ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  };
126ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
127ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* FT_DEBUG_LEVEL_TRACE */
128ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
129ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1309c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /* Compute the style index of each glyph within a given face. */
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
1339c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  af_face_globals_compute_style_coverage( AF_FaceGlobals  globals )
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Error    error;
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Face     face        = globals->face;
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_CharMap  old_charmap = face->charmap;
1389c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_Byte*    gstyles     = globals->glyph_styles;
139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UInt     ss;
140727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UInt     i;
1419c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_UInt     dflt        = ~0U; /* a non-valid value */
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1449c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    /* the value AF_STYLE_UNASSIGNED means `uncovered glyph' */
1459c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_MEM_SET( globals->glyph_styles,
1469c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                AF_STYLE_UNASSIGNED,
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                globals->glyph_count );
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_Select_Charmap( face, FT_ENCODING_UNICODE );
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1529c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      /*
1539c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod       * Ignore this error; we simply use the fallback style.
1549c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod       * XXX: Shouldn't we rather disable hinting?
1559c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod       */
156727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_Err_Ok;
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1609c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    /* scan each style in a Unicode charmap */
1619c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ )
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1639c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      AF_StyleClass       style_class =
1649c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                            AF_STYLE_CLASSES_GET[ss];
1659c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      AF_ScriptClass      script_class =
1669c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                            AF_SCRIPT_CLASSES_GET[style_class->script];
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      AF_Script_UniRange  range;
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
170ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      if ( script_class->script_uni_ranges == NULL )
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        continue;
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*
174727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       *  Scan all Unicode points in the range and set the corresponding
1759c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod       *  glyph style index.
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       */
1779c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      if ( style_class->coverage == AF_COVERAGE_DEFAULT )
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1799c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        if ( (FT_UInt)style_class->script ==
1809c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod             globals->module->default_script )
1819c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          dflt = ss;
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1839c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        for ( range = script_class->script_uni_ranges;
1849c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod              range->first != 0;
1859c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod              range++ )
1869c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        {
1879c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          FT_ULong  charcode = range->first;
1889c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          FT_UInt   gindex;
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1919c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          gindex = FT_Get_Char_Index( face, charcode );
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1939c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          if ( gindex != 0                             &&
1949c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod               gindex < (FT_ULong)globals->glyph_count &&
1959c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod               gstyles[gindex] == AF_STYLE_UNASSIGNED  )
1969c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            gstyles[gindex] = (FT_Byte)ss;
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1989c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          for (;;)
1999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          {
2009c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            charcode = FT_Get_Next_Char( face, charcode, &gindex );
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            if ( gindex == 0 || charcode > range->last )
2039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod              break;
2049c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2059c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            if ( gindex < (FT_ULong)globals->glyph_count &&
2069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                 gstyles[gindex] == AF_STYLE_UNASSIGNED  )
2079c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod              gstyles[gindex] = (FT_Byte)ss;
2089c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          }
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2119c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      else
2129c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      {
2139c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        /* get glyphs not directly addressable by cmap */
2149c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        af_get_coverage( globals, style_class, gstyles );
2159c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      }
2169c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    }
2179c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2189c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    /* handle the default OpenType features of the default script ... */
2199c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    af_get_coverage( globals, AF_STYLE_CLASSES_GET[dflt], gstyles );
2209c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2219c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    /* ... and the remaining default OpenType features */
2229c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ )
2239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    {
2249c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      AF_StyleClass  style_class = AF_STYLE_CLASSES_GET[ss];
2259c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2269c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2279c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      if ( ss != dflt && style_class->coverage == AF_COVERAGE_DEFAULT )
2289c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        af_get_coverage( globals, style_class, gstyles );
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
231295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* mark ASCII digits */
232295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    for ( i = 0x30; i <= 0x39; i++ )
233295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
234295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_UInt  gindex = FT_Get_Char_Index( face, i );
235295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
236295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
237295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count )
2389c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        gstyles[gindex] |= AF_DIGIT;
239295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
240295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*
2439c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod     *  By default, all uncovered glyphs are set to the fallback style.
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     *  XXX: Shouldn't we disable hinting or do something similar?
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     */
2469c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    if ( globals->module->fallback_style != AF_STYLE_UNASSIGNED )
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
248295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_Long  nn;
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( nn = 0; nn < globals->glyph_count; nn++ )
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2539c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        if ( ( gstyles[nn] & ~AF_DIGIT ) == AF_STYLE_UNASSIGNED )
254aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        {
2559c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          gstyles[nn] &= ~AF_STYLE_UNASSIGNED;
2569c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          gstyles[nn] |= globals->module->fallback_style;
257aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        }
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2619c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#ifdef FT_DEBUG_LEVEL_TRACE
2629c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2639c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_TRACE4(( "\n"
2649c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                "style coverage\n"
2659c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                "==============\n"
2669c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                "\n" ));
2679c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2689c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ )
2699c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    {
2709c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      AF_StyleClass  style_class = AF_STYLE_CLASSES_GET[ss];
2719c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      FT_UInt        count       = 0;
2729c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      FT_Long        idx;
2739c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2749c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2759c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      FT_TRACE4(( "%s:\n", af_style_names[style_class->style] ));
2769c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2779c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      for ( idx = 0; idx < globals->glyph_count; idx++ )
2789c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      {
2799c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        if ( ( gstyles[idx] & ~AF_DIGIT ) == style_class->style )
2809c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        {
2819c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          if ( !( count % 10 ) )
2829c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            FT_TRACE4(( " " ));
2839c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2849c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          FT_TRACE4(( " %d", idx ));
2859c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          count++;
2869c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2879c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          if ( !( count % 10 ) )
2889c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            FT_TRACE4(( "\n" ));
2899c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        }
2909c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      }
2919c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2929c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      if ( !count )
2939c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        FT_TRACE4(( "  (none)\n" ));
2949c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      if ( count % 10 )
2959c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        FT_TRACE4(( "\n" ));
2969c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    }
2979c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
2989c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#endif /* FT_DEBUG_LEVEL_TRACE */
2999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Set_Charmap( face, old_charmap );
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  af_face_globals_new( FT_Face          face,
307727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       AF_FaceGlobals  *aglobals,
308727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       AF_Module        module )
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error        error;
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory       memory;
312aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    AF_FaceGlobals  globals = NULL;
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = face->memory;
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
317727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( FT_ALLOC( globals, sizeof ( *globals ) +
318727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                            face->num_glyphs * sizeof ( FT_Byte ) ) )
319727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3219c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    globals->face         = face;
3229c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    globals->glyph_count  = face->num_glyphs;
3239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    globals->glyph_styles = (FT_Byte*)( globals + 1 );
3249c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    globals->module       = module;
325727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
3269c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
3279c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    globals->hb_font = hb_ft_font_create( face, NULL );
3289c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#endif
3299c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
3309c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    error = af_face_globals_compute_style_coverage( globals );
331727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( error )
332727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
333727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      af_face_globals_free( globals );
334727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      globals = NULL;
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3369c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    else
3379c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      globals->increase_x_height = AF_PROP_INCREASE_X_HEIGHT_MAX;
338727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
339727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  Exit:
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *aglobals = globals;
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( void )
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  af_face_globals_free( AF_FaceGlobals  globals )
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( globals )
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory  memory = globals->face->memory;
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt    nn;
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3549c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      for ( nn = 0; nn < AF_STYLE_MAX; nn++ )
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( globals->metrics[nn] )
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
3589c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          AF_StyleClass          style_class =
3599c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            AF_STYLE_CLASSES_GET[nn];
360ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          AF_WritingSystemClass  writing_system_class =
3619c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system];
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3649c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          if ( writing_system_class->style_metrics_done )
3659c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            writing_system_class->style_metrics_done( globals->metrics[nn] );
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_FREE( globals->metrics[nn] );
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3719c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
3729c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      hb_font_destroy( globals->hb_font );
3739c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      globals->hb_font = NULL;
3749c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#endif
3759c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
3769c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      globals->glyph_count  = 0;
3779c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      globals->glyph_styles = NULL;  /* no need to free this one! */
3789c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      globals->face         = NULL;
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FREE( globals );
381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
3869c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  af_face_globals_get_metrics( AF_FaceGlobals    globals,
3879c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                               FT_UInt           gindex,
3889c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                               FT_UInt           options,
3899c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                               AF_StyleMetrics  *ametrics )
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3919c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_StyleMetrics  metrics = NULL;
392ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
3939c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_Style               style = (AF_Style)options;
394ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_WritingSystemClass  writing_system_class;
3959c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_StyleClass          style_class;
396ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
397ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_Error  error = FT_Err_Ok;
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
400295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( gindex >= (FT_ULong)globals->glyph_count )
401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
402727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Invalid_Argument );
403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    /* if we have a forced style (via `options'), use it, */
4079c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    /* otherwise look into `glyph_styles' array           */
4089c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    if ( style == AF_STYLE_NONE_DFLT || style + 1 >= AF_STYLE_MAX )
4099c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      style = (AF_Style)( globals->glyph_styles[gindex] &
4109c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                          AF_STYLE_UNASSIGNED           );
411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4129c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    style_class          = AF_STYLE_CLASSES_GET[style];
413ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    writing_system_class = AF_WRITING_SYSTEM_CLASSES_GET
4149c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                             [style_class->writing_system];
415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4169c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    metrics = globals->metrics[style];
417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( metrics == NULL )
418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
419727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* create the global metrics object if necessary */
420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory  memory = globals->face->memory;
421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      if ( FT_ALLOC( metrics, writing_system_class->style_metrics_size ) )
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4269c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      metrics->style_class = style_class;
4279c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      metrics->globals     = globals;
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4299c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      if ( writing_system_class->style_metrics_init )
430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4319c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        error = writing_system_class->style_metrics_init( metrics,
4329c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                                                          globals->face );
433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
4359c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          if ( writing_system_class->style_metrics_done )
4369c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod            writing_system_class->style_metrics_done( metrics );
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_FREE( metrics );
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4439c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      globals->metrics[style] = metrics;
444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *ametrics = metrics;
448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
453295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_LOCAL_DEF( FT_Bool )
454295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  af_face_globals_is_digit( AF_FaceGlobals  globals,
455295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                            FT_UInt         gindex )
456295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
457295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( gindex < (FT_ULong)globals->glyph_count )
4589c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      return (FT_Bool)( globals->glyph_styles[gindex] & AF_DIGIT );
459295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
460295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return (FT_Bool)0;
461295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
462295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
463295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
465