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