1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ttgload.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* TrueType Glyph Loader (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin/* Copyright 1996-2017 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_CALC_H 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_STREAM_H 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_SFNT_H 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_TAGS_H 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_OUTLINE_H 26727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_TRUETYPE_DRIVER_H 27055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#include FT_LIST_H 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttgload.h" 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttpload.h" 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttgxvar.h" 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "tterrors.h" 37727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "ttsubpix.h" 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_ttgload 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 52aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Composite glyph flags. */ 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ARGS_ARE_WORDS 0x0001 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ARGS_ARE_XY_VALUES 0x0002 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ROUND_XY_TO_GRID 0x0004 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define WE_HAVE_A_SCALE 0x0008 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* reserved 0x0010 */ 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define MORE_COMPONENTS 0x0020 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define WE_HAVE_AN_XY_SCALE 0x0040 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define WE_HAVE_A_2X2 0x0080 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define WE_HAVE_INSTR 0x0100 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define USE_MY_METRICS 0x0200 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define OVERLAP_COMPOUND 0x0400 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SCALED_COMPONENT_OFFSET 0x0800 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define UNSCALED_COMPONENT_OFFSET 0x1000 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 71aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Return the horizontal metrics in font units for a given glyph. */ 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 73295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_LOCAL_DEF( void ) 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Get_HMetrics( TT_Face face, 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt idx, 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short* lsb, 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort* aw ) 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw ); 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 81295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE5(( " advance width (font units): %d\n", *aw )); 82295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE5(( " left side bearing (font units): %d\n", *lsb )); 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 88aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Return the vertical metrics in font units for a given glyph. */ 89ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* See macro `TT_LOADER_SET_PP' below for explanations. */ 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 91295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_LOCAL_DEF( void ) 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Get_VMetrics( TT_Face face, 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt idx, 94ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Pos yMax, 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short* tsb, 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort* ah ) 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->vertical_info ) 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah ); 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( face->os2.version != 0xFFFFU ) 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod *tsb = (FT_Short)( face->os2.sTypoAscender - yMax ); 104fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki *ah = (FT_UShort)FT_ABS( face->os2.sTypoAscender - 105fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki face->os2.sTypoDescender ); 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 107ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1109c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod *tsb = (FT_Short)( face->horizontal.Ascender - yMax ); 111fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki *ah = (FT_UShort)FT_ABS( face->horizontal.Ascender - 112fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki face->horizontal.Descender ); 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 115295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE5(( " advance height (font units): %d\n", *ah )); 116295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE5(( " top side bearing (font units): %d\n", *tsb )); 117295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 118295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 119295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 120ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_Error 121295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner tt_get_metrics( TT_Loader loader, 122295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_UInt glyph_index ) 123295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 124055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin TT_Face face = loader->face; 125055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 126727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); 127727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 128295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 129ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error; 130ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream stream = loader->stream; 131ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 132295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Short left_bearing = 0, top_bearing = 0; 133295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_UShort advance_width = 0, advance_height = 0; 134295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 135ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* we must preserve the stream position */ 136ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* (which gets altered by the metrics functions) */ 137ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong pos = FT_STREAM_POS(); 138ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 139295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 140295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner TT_Get_HMetrics( face, glyph_index, 141295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner &left_bearing, 142295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner &advance_width ); 143295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner TT_Get_VMetrics( face, glyph_index, 144ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease loader->bbox.yMax, 145295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner &top_bearing, 146295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner &advance_height ); 147295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 148ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( FT_STREAM_SEEK( pos ) ) 149ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return error; 150ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 151aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->left_bearing = left_bearing; 152aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->advance = advance_width; 153aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->top_bearing = top_bearing; 154aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->vadvance = advance_height; 155aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 156055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 157fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && 158fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->exec ) 159727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 160fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->exec->sph_tweak_flags = 0; 161727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 162fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* This may not be the right place for this, but it works... */ 163fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* Note that we have to unconditionally load the tweaks since */ 164fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* it is possible that glyphs individually switch ClearType's */ 165fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* backwards compatibility mode on and off. */ 166fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki sph_set_tweaks( loader, glyph_index ); 167727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 168055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ 169727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 170aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( !loader->linear_def ) 171aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 172aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->linear_def = 1; 173aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->linear = advance_width; 174aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 175ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 176ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_Err_Ok; 177aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 178aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 179aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 180295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef FT_CONFIG_OPTION_INCREMENTAL 181295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 182aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich static void 183aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich tt_get_metrics_incr_overrides( TT_Loader loader, 184aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_UInt glyph_index ) 185aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 186055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin TT_Face face = loader->face; 187aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 188aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Short left_bearing = 0, top_bearing = 0; 189aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_UShort advance_width = 0, advance_height = 0; 190aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 191aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 192295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* If this is an incrementally loaded font check whether there are */ 193295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* overriding metrics for this glyph. */ 194295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( face->root.internal->incremental_interface && 195295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner face->root.internal->incremental_interface->funcs->get_glyph_metrics ) 196295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 197295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Incremental_MetricsRec metrics; 198295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Error error; 199295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 200295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich metrics.bearing_x = loader->left_bearing; 202295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner metrics.bearing_y = 0; 203aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich metrics.advance = loader->advance; 204295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner metrics.advance_v = 0; 205295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 206295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( 207295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner face->root.internal->incremental_interface->object, 208295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner glyph_index, FALSE, &metrics ); 209295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( error ) 210295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner goto Exit; 211295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 212295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner left_bearing = (FT_Short)metrics.bearing_x; 213295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner advance_width = (FT_UShort)metrics.advance; 214295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 215295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#if 0 216295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 217295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* GWW: Do I do the same for vertical metrics? */ 218295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner metrics.bearing_x = 0; 219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich metrics.bearing_y = loader->top_bearing; 220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich metrics.advance = loader->vadvance; 221295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 222295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( 223295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner face->root.internal->incremental_interface->object, 224295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner glyph_index, TRUE, &metrics ); 225295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( error ) 226295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner goto Exit; 227295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 228295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner top_bearing = (FT_Short)metrics.bearing_y; 229295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner advance_height = (FT_UShort)metrics.advance; 230295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 231295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* 0 */ 232295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->left_bearing = left_bearing; 234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->advance = advance_width; 235aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->top_bearing = top_bearing; 236aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->vadvance = advance_height; 237aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 238aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( !loader->linear_def ) 239aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 240aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->linear_def = 1; 241aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->linear = advance_width; 242aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 243295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 244295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 245295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner Exit: 246aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return; 247aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 248295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 249295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* FT_CONFIG_OPTION_INCREMENTAL */ 250295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The following functions are used by default with TrueType fonts. */ 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* However, they can be replaced by alternatives if we need to support */ 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TrueType-compressed formats (like MicroType) in the future. */ 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Access_Glyph_Frame( TT_Loader loader, 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt glyph_index, 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong offset, 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt byte_count ) 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream = loader->stream; 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* for non-debug mode */ 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( glyph_index ); 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 273aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_TRACE4(( "Glyph %ld\n", glyph_index )); 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the following line sets the `error' variable through macros! */ 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) ) 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->cursor = stream->cursor; 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->limit = stream->limit; 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 282727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Forget_Glyph_Frame( TT_Loader loader ) 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream = loader->stream; 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FRAME_EXIT(); 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Load_Glyph_Header( TT_Loader loader ) 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* p = loader->cursor; 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* limit = loader->limit; 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + 10 > limit ) 304727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Invalid_Outline ); 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->n_contours = FT_NEXT_SHORT( p ); 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.xMin = FT_NEXT_SHORT( p ); 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.yMin = FT_NEXT_SHORT( p ); 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.xMax = FT_NEXT_SHORT( p ); 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.yMax = FT_NEXT_SHORT( p ); 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_TRACE5(( " # of contours: %d\n", loader->n_contours )); 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.xMax )); 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.yMax )); 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->cursor = p; 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 320727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Load_Simple_Glyph( TT_Loader load ) 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* p = load->cursor; 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* limit = load->limit; 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader gloader = load->gloader; 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int n_contours = load->n_contours; 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* outline; 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort n_ins; 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int n_points; 335ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong tmp; 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte *flag, *flag_limit; 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte c, count; 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector *vec, *vec_limit; 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos x; 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short *cont, *cont_limit, prev_cont; 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int xy_size = 0; 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check that we can add the contours to the glyph */ 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours ); 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reading the contours' endpoints & number of points */ 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cont = gloader->current.outline.contours; 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cont_limit = cont + n_contours; 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check space for contours array + instructions count */ 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 35841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier prev_cont = FT_NEXT_SHORT( p ); 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n_contours > 0 ) 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cont[0] = prev_cont; 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 36341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( prev_cont < 0 ) 36441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Invalid_Outline; 36541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( cont++; cont < cont_limit; cont++ ) 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 36841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier cont[0] = FT_NEXT_SHORT( p ); 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cont[0] <= prev_cont ) 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* unordered contours: this is invalid */ 37241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Invalid_Outline; 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project prev_cont = cont[0]; 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_points = 0; 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n_contours > 0 ) 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_points = cont[-1] + 1; 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n_points < 0 ) 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* note that we will add four phantom points later */ 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reading the bytecode instructions */ 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project load->glyph->control_len = 0; 392fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki load->glyph->control_data = NULL; 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + 2 > limit ) 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_ins = FT_NEXT_USHORT( p ); 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_TRACE5(( " Instructions size: %u\n", n_ins )); 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( IS_HINTED( load->load_flags ) ) 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 405a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin /* check instructions size */ 406a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( ( limit - p ) < n_ins ) 407a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin { 408a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin FT_TRACE1(( "TT_Load_Simple_Glyph: instruction count mismatch\n" )); 409a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin error = FT_THROW( Too_Many_Hints ); 410a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin goto Fail; 411a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin } 412a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 413ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* we don't trust `maxSizeOfInstructions' in the `maxp' table */ 414ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* and thus update the bytecode array size by ourselves */ 415ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 416ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease tmp = load->exec->glyphSize; 417ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = Update_Max( load->exec->memory, 418ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease &tmp, 419ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease sizeof ( FT_Byte ), 420ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease (void*)&load->exec->glyphIns, 421ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease n_ins ); 422ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 423ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease load->exec->glyphSize = (FT_UShort)tmp; 424ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 425ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return error; 426ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project load->glyph->control_len = n_ins; 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project load->glyph->control_data = load->exec->glyphIns; 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 430055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( n_ins ) 431055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p += n_ins; 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 43841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier outline = &gloader->current.outline; 43941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reading the point tags */ 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flag = (FT_Byte*)outline->tags; 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flag_limit = flag + n_points; 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 444a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin FT_ASSERT( flag ); 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( flag < flag_limit ) 447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + 1 > limit ) 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *flag++ = c = FT_NEXT_BYTE( p ); 452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( c & 8 ) 453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + 1 > limit ) 455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = FT_NEXT_BYTE( p ); 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( flag + (FT_Int)count > flag_limit ) 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; count > 0; count-- ) 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *flag++ = c; 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reading the X coordinates */ 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec = outline->points; 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec_limit = vec + n_points; 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flag = (FT_Byte*)outline->tags; 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = 0; 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + xy_size > limit ) 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; vec < vec_limit; vec++, flag++ ) 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Pos y = 0; 4790a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Byte f = *flag; 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( f & 2 ) 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + 1 > limit ) 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = (FT_Pos)FT_NEXT_BYTE( p ); 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( f & 16 ) == 0 ) 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = -y; 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( ( f & 16 ) == 0 ) 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + 2 > limit ) 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = (FT_Pos)FT_NEXT_SHORT( p ); 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x += y; 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec->x = x; 5010a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* the cast is for stupid compilers */ 5020a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project *flag = (FT_Byte)( f & ~( 2 | 16 ) ); 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reading the Y coordinates */ 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec = gloader->current.outline.points; 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec_limit = vec + n_points; 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flag = (FT_Byte*)outline->tags; 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = 0; 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; vec < vec_limit; vec++, flag++ ) 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Pos y = 0; 5150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Byte f = *flag; 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( f & 4 ) 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + 1 > limit ) 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = (FT_Pos)FT_NEXT_BYTE( p ); 524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( f & 32 ) == 0 ) 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = -y; 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( ( f & 32 ) == 0 ) 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + 2 > limit ) 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Outline; 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = (FT_Pos)FT_NEXT_SHORT( p ); 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x += y; 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vec->y = x; 5370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* the cast is for stupid compilers */ 5380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project *flag = (FT_Byte)( f & FT_CURVE_TAG_ON ); 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 541fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline->n_points = (FT_Short)n_points; 542fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline->n_contours = (FT_Short)n_contours; 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project load->cursor = p; 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Invalid_Outline: 550727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Outline ); 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Load_Composite_Glyph( TT_Loader loader ) 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* p = loader->cursor; 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* limit = loader->limit; 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader gloader = loader->gloader; 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_SubGlyph subglyph; 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt num_subglyphs; 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_subglyphs = 0; 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed xx, xy, yy, yx; 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count; 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check that we can load a new subglyph */ 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 ); 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check space */ 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + 4 > limit ) 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Composite; 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph = gloader->current.subglyphs + num_subglyphs; 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph->arg1 = subglyph->arg2 = 0; 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph->flags = FT_NEXT_USHORT( p ); 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph->index = FT_NEXT_USHORT( p ); 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check space */ 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = 2; 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( subglyph->flags & ARGS_ARE_WORDS ) 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count += 2; 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( subglyph->flags & WE_HAVE_A_SCALE ) 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count += 2; 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count += 4; 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( subglyph->flags & WE_HAVE_A_2X2 ) 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count += 8; 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p + count > limit ) 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Invalid_Composite; 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* read arguments */ 605fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( subglyph->flags & ARGS_ARE_XY_VALUES ) 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 607fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( subglyph->flags & ARGS_ARE_WORDS ) 608fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki { 609fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subglyph->arg1 = FT_NEXT_SHORT( p ); 610fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subglyph->arg2 = FT_NEXT_SHORT( p ); 611fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki } 612fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki else 613fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki { 614fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subglyph->arg1 = FT_NEXT_CHAR( p ); 615fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subglyph->arg2 = FT_NEXT_CHAR( p ); 616fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki } 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 620fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( subglyph->flags & ARGS_ARE_WORDS ) 621fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki { 622fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subglyph->arg1 = (FT_Int)FT_NEXT_USHORT( p ); 623fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subglyph->arg2 = (FT_Int)FT_NEXT_USHORT( p ); 624fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki } 625fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki else 626fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki { 627fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subglyph->arg1 = (FT_Int)FT_NEXT_BYTE( p ); 628fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subglyph->arg2 = (FT_Int)FT_NEXT_BYTE( p ); 629fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki } 630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* read transform */ 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xx = yy = 0x10000L; 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xy = yx = 0; 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( subglyph->flags & WE_HAVE_A_SCALE ) 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 638055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project yy = xx; 640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) 642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 643055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; 644055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( subglyph->flags & WE_HAVE_A_2X2 ) 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 648055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; 649055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin yx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; 650055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin xy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; 651055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph->transform.xx = xx; 655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph->transform.xy = xy; 656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph->transform.yx = yx; 657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph->transform.yy = yy; 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_subglyphs++; 660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while ( subglyph->flags & MORE_COMPONENTS ); 662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project gloader->current.num_subglyphs = num_subglyphs; 664055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_TRACE5(( " %d components\n", num_subglyphs )); 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream = loader->stream; 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* we must undo the FT_FRAME_ENTER in order to point */ 6730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* to the composite instructions, if we find some. */ 6740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* We will process them later. */ 6750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* */ 676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->ins_pos = (FT_ULong)( FT_STREAM_POS() + 677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p - limit ); 678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->cursor = p; 683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Invalid_Composite: 688727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Composite ); 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Init_Glyph_Loading( TT_Face face ) 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->access_glyph_frame = TT_Access_Glyph_Frame; 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->read_glyph_header = TT_Load_Glyph_Header; 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->read_simple_glyph = TT_Load_Simple_Glyph; 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->read_composite_glyph = TT_Load_Composite_Glyph; 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->forget_glyph_frame = TT_Forget_Glyph_Frame; 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_prepare_zone( TT_GlyphZone zone, 706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoad load, 707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt start_point, 708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt start_contour ) 709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 710fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki zone->n_points = (FT_UShort)load->outline.n_points - 711fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_UShort)start_point; 712fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki zone->n_contours = load->outline.n_contours - 713fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_Short)start_contour; 714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->org = load->extra_points + start_point; 715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->cur = load->outline.points + start_point; 716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->orus = load->extra_points2 + start_point; 717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->tags = (FT_Byte*)load->outline.tags + start_point; 718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->contours = (FT_UShort*)load->outline.contours + start_contour; 719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->first_point = (FT_UShort)start_point; 720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Hint_Glyph */ 727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Hint the glyph using the zone prepared by the caller. Note that */ 730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the zone is supposed to include four phantom points. */ 731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Hint_Glyph( TT_Loader loader, 734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool is_composite ) 735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 736055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ 737055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 738055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin TT_Face face = loader->face; 739727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); 740727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 741727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphZone zone = &loader->zone; 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 745fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_Long n_ins; 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( is_composite ); 748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 752295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( loader->glyph->control_len > 0xFFFFL ) 753295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 754ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_TRACE1(( "TT_Hint_Glyph: too long instructions" )); 755ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_TRACE1(( " (0x%lx byte) is truncated\n", 756295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner loader->glyph->control_len )); 757295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 758fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki n_ins = loader->glyph->control_len; 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* save original point position in org */ 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n_ins > 0 ) 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); 7630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Reset graphics state. */ 765055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->exec->GS = loader->size->GS; 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ 768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* completely refer to the (already) hinted subglyphs. */ 769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( is_composite ) 770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->exec->metrics.x_scale = 1 << 16; 772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->exec->metrics.y_scale = 1 << 16; 773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points ); 775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 778055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->exec->metrics.x_scale = loader->size->metrics.x_scale; 779055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->exec->metrics.y_scale = loader->size->metrics.y_scale; 780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 783ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* round phantom points */ 784ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zone->cur[zone->n_points - 4].x = 785ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_PIX_ROUND( zone->cur[zone->n_points - 4].x ); 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->cur[zone->n_points - 3].x = 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); 788ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zone->cur[zone->n_points - 2].y = 789ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_PIX_ROUND( zone->cur[zone->n_points - 2].y ); 790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->cur[zone->n_points - 1].y = 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n_ins > 0 ) 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 799295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_GlyphLoader gloader = loader->gloader; 800295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Outline current_outline = gloader->current.outline; 801295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 803fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki TT_Set_CodeRange( loader->exec, tt_coderange_glyph, 804fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->exec->glyphIns, n_ins ); 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->exec->is_composite = is_composite; 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->exec->pts = *zone; 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 809fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki error = TT_Run_Context( loader->exec ); 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error && loader->exec->pedantic_hinting ) 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 812295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 813295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* store drop-out mode in bits 5-7; set bit 2 also as a marker */ 814295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner current_outline.tags[0] |= 815295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE; 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 820055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 821055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* Save possibly modified glyph phantom points unless in v40 backwards */ 822055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* compatibility mode, where no movement on the x axis means no reason */ 823055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* to change bearings or advance widths. */ 824055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && 825055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin !loader->exec->backwards_compatibility ) ) 826055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 827055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 828055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp1 = zone->cur[zone->n_points - 4]; 829055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp2 = zone->cur[zone->n_points - 3]; 830055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp3 = zone->cur[zone->n_points - 2]; 831055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp4 = zone->cur[zone->n_points - 1]; 832055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 833055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 834055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 836055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 837727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) 838727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 839727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN ) 840727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 ); 841727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 842727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN ) 843727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 ); 844727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 845055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ 846727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 847727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Process_Simple_Glyph */ 855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Once a simple glyph has been loaded, it needs to be processed. */ 858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Usually, this means scaling and hinting through bytecode */ 859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* interpretation. */ 860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Process_Simple_Glyph( TT_Loader loader ) 863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader gloader = loader->gloader; 865727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* outline; 867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int n_points; 868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline = &gloader->current.outline; 871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_points = outline->n_points; 872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set phantom points */ 874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[n_points ] = loader->pp1; 876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[n_points + 1] = loader->pp2; 877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[n_points + 2] = loader->pp3; 878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[n_points + 3] = loader->pp4; 879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->tags[n_points ] = 0; 881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->tags[n_points + 1] = 0; 882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->tags[n_points + 2] = 0; 883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->tags[n_points + 3] = 0; 884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_points += 4; 886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 889a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( loader->face->doblend && !loader->face->is_default_instance ) 890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Deltas apply to the unscaled data. */ 892055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin error = TT_Vary_Apply_Glyph_Deltas( loader->face, 893055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->glyph_index, 894055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin outline, 895055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin (FT_UInt)n_points ); 896a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 897a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin /* recalculate linear horizontal and vertical advances */ 898a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin /* if we don't have HVAR and VVAR, respectively */ 899a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) 900a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin loader->linear = outline->points[n_points - 3].x - 901a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin outline->points[n_points - 4].x; 902a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) 903a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin loader->vadvance = outline->points[n_points - 1].x - 904a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin outline->points[n_points - 2].x; 905a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ 911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( IS_HINTED( loader->load_flags ) ) 913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 ); 915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur, 917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->zone.n_points + 4 ); 918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 921055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 922055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin TT_Face face = loader->face; 923727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); 924727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 925727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_String* family = face->root.family_name; 926fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_UInt ppem = loader->size->metrics.x_ppem; 927727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_String* style = face->root.style_name; 928fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_UInt x_scale_factor = 1000; 929727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 930727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 931727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Vector* vec = outline->points; 932727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Vector* limit = outline->points + n_points; 933727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 934727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Fixed x_scale = 0; /* pacify compiler */ 935727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Fixed y_scale = 0; 936727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 937727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool do_scale = FALSE; 938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 940055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 941727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 942727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) 943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 944727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* scale, but only if enabled and only if TT hinting is being used */ 945727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( IS_HINTED( loader->load_flags ) ) 946727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease x_scale_factor = sph_test_tweak_x_scaling( face, 947727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease family, 948727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ppem, 949727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease style, 950727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease loader->glyph_index ); 951727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* scale the glyph */ 952727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 || 953727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease x_scale_factor != 1000 ) 954727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 955055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin x_scale = FT_MulDiv( loader->size->metrics.x_scale, 956fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_Long)x_scale_factor, 1000 ); 957055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin y_scale = loader->size->metrics.y_scale; 958727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 959727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* compensate for any scaling by de/emboldening; */ 960727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* the amount was determined via experimentation */ 961727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( x_scale_factor != 1000 && ppem > 11 ) 962727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Outline_EmboldenXY( outline, 963727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_MulFix( 1280 * ppem, 964727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 1000 - x_scale_factor ), 965727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0 ); 966727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease do_scale = TRUE; 967727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 969727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 970727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 971055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ 972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 973727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 974727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* scale the glyph */ 975727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) 976727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 977055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin x_scale = loader->size->metrics.x_scale; 978055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin y_scale = loader->size->metrics.y_scale; 979727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 980727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease do_scale = TRUE; 981727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 982727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 983727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 984727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( do_scale ) 985727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 986727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease for ( ; vec < limit; vec++ ) 987727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 988727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec->x = FT_MulFix( vec->x, x_scale ); 989727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec->y = FT_MulFix( vec->y, y_scale ); 990727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 991727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 992727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease loader->pp1 = outline->points[n_points - 4]; 993727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease loader->pp2 = outline->points[n_points - 3]; 994727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease loader->pp3 = outline->points[n_points - 2]; 995727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease loader->pp4 = outline->points[n_points - 1]; 996727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( IS_HINTED( loader->load_flags ) ) 1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->zone.n_points += 4; 1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = TT_Hint_Glyph( loader, 0 ); 1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Process_Composite_Component */ 1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Once a composite component has been loaded, it needs to be */ 1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* processed. Usually, this means transforming and translating. */ 1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Process_Composite_Component( TT_Loader loader, 1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_SubGlyph subglyph, 1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt start_point, 1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt num_base_points ) 1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1025055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_GlyphLoader gloader = loader->gloader; 1026055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Outline current; 1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool have_scale; 1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos x, y; 1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1031055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin current.points = gloader->base.outline.points + 1032055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin num_base_points; 1033055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin current.n_points = gloader->base.outline.n_points - 1034055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin (short)num_base_points; 1035055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE | 1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WE_HAVE_AN_XY_SCALE | 1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WE_HAVE_A_2X2 ) ); 1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* perform the transform required for this subglyph */ 1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( have_scale ) 1042055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Outline_Transform( ¤t, &subglyph->transform ); 1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* get offset */ 1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) ) 1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1047055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_UInt num_points = (FT_UInt)gloader->base.outline.n_points; 1048fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_UInt k = (FT_UInt)subglyph->arg1; 1049fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_UInt l = (FT_UInt)subglyph->arg2; 1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* p1; 1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* p2; 1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* match l-th point of the newly loaded component to the k-th point */ 1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* of the previously loaded components. */ 1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* change to the point numbers used by our outline */ 1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project k += start_point; 1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project l += num_base_points; 1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( k >= num_base_points || 1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project l >= num_points ) 1062727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Invalid_Composite ); 1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p1 = gloader->base.outline.points + k; 1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p2 = gloader->base.outline.points + l; 1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = p1->x - p2->x; 1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = p1->y - p2->y; 1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = subglyph->arg1; 1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = subglyph->arg2; 1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !x && !y ) 1076727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1078ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Use a default value dependent on */ 1079ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old */ 1080ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* TT fonts which don't set the xxx_COMPONENT_OFFSET bit. */ 1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( have_scale && 1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED 1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) ) 1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( subglyph->flags & SCALED_COMPONENT_OFFSET ) ) 1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1092ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /*******************************************************************/ 1093ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* */ 1094ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* This algorithm is what Apple documents. But it doesn't work. */ 1095ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* */ 1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int a = subglyph->transform.xx > 0 ? subglyph->transform.xx 1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : -subglyph->transform.xx; 1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int b = subglyph->transform.yx > 0 ? subglyph->transform.yx 1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : -subglyph->transform.yx; 1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int c = subglyph->transform.xy > 0 ? subglyph->transform.xy 1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : -subglyph->transform.xy; 1102055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin int d = subglyph->transform.yy > 0 ? subglyph->transform.yy 1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : -subglyph->transform.yy; 1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int m = a > b ? a : b; 1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int n = c > d ? c : d; 1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a - b <= 33 && a - b >= -33 ) 1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project m *= 2; 1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( c - d <= 33 && c - d >= -33 ) 1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n *= 2; 1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = FT_MulFix( x, m ); 1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = FT_MulFix( y, n ); 1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1115ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#else /* 1 */ 1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1117ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /*******************************************************************/ 1118ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* */ 1119ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* This algorithm is a guess and works much better than the above. */ 1120ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* */ 1121727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Fixed mac_xscale = FT_Hypot( subglyph->transform.xx, 1122727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease subglyph->transform.xy ); 1123727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Fixed mac_yscale = FT_Hypot( subglyph->transform.yy, 1124727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease subglyph->transform.yx ); 1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = FT_MulFix( x, mac_xscale ); 1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = FT_MulFix( y, mac_yscale ); 1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1130ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* 1 */ 1131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) 1135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1136055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Fixed x_scale = loader->size->metrics.x_scale; 1137055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Fixed y_scale = loader->size->metrics.y_scale; 1138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = FT_MulFix( x, x_scale ); 1141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = FT_MulFix( y, y_scale ); 1142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( subglyph->flags & ROUND_XY_TO_GRID ) 1144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = FT_PIX_ROUND( x ); 1146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = FT_PIX_ROUND( y ); 1147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( x || y ) 1152055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Outline_Translate( ¤t, x, y ); 1153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1154727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 1155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Process_Composite_Glyph */ 1162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This is slightly different from TT_Process_Simple_Glyph, in that */ 1165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* its sole purpose is to hint the glyph. Thus this function is */ 1166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* only available when bytecode interpreter is enabled. */ 1167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 1169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Process_Composite_Glyph( TT_Loader loader, 1170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt start_point, 1171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt start_contour ) 1172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 1174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* outline; 1175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 1176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline = &loader->gloader->base.outline; 1179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* make room for phantom points */ 1181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader, 1182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->n_points + 4, 1183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0 ); 1184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[outline->n_points ] = loader->pp1; 1188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[outline->n_points + 1] = loader->pp2; 1189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[outline->n_points + 2] = loader->pp3; 1190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->points[outline->n_points + 3] = loader->pp4; 1191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->tags[outline->n_points ] = 0; 1193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->tags[outline->n_points + 1] = 0; 1194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->tags[outline->n_points + 2] = 0; 1195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outline->tags[outline->n_points + 3] = 0; 1196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream = loader->stream; 1201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_UShort n_ins, max_ins; 1202aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_ULong tmp; 1203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Load_Composite_Glyph only gives us the offset of instructions */ 1206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* so we read them here */ 1207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SEEK( loader->ins_pos ) || 1208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_READ_USHORT( n_ins ) ) 1209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_TRACE5(( " Instructions size = %d\n", n_ins )); 1212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check it */ 1214055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin max_ins = loader->face->max_profile.maxSizeOfInstructions; 1215aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( n_ins > max_ins ) 1216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1217ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* don't trust `maxSizeOfInstructions'; */ 1218ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* only do a rough safety check */ 1219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( (FT_Int)n_ins > loader->byte_len ) 1220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 1221ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_TRACE1(( "TT_Process_Composite_Glyph:" 1222ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease " too many instructions (%d) for glyph with length %d\n", 1223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich n_ins, loader->byte_len )); 1224727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Too_Many_Hints ); 1225aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 1226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1227ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease tmp = loader->exec->glyphSize; 1228aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich error = Update_Max( loader->exec->memory, 1229aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich &tmp, 1230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich sizeof ( FT_Byte ), 1231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich (void*)&loader->exec->glyphIns, 1232aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich n_ins ); 1233ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->exec->glyphSize = (FT_UShort)tmp; 1235aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( error ) 1236aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return error; 1237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( n_ins == 0 ) 1239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 1240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) ) 1242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->glyph->control_data = loader->exec->glyphIns; 1245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->glyph->control_len = n_ins; 1246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_prepare_zone( &loader->zone, &loader->gloader->base, 1251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project start_point, start_contour ); 1252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Some points are likely touched during execution of */ 1254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* instructions on components. So let's untouch them. */ 1255ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for ( i = 0; i < loader->zone.n_points; i++ ) 1256295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH; 1257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->zone.n_points += 4; 1259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return TT_Hint_Glyph( loader, 1 ); 1261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1264ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* 1265ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * Calculate the phantom points 1266ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1267ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * Defining the right side bearing (rsb) as 1268ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1269ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * rsb = aw - (lsb + xmax - xmin) 1270ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1271ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * (with `aw' the advance width, `lsb' the left side bearing, and `xmin' 1272ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * and `xmax' the glyph's minimum and maximum x value), the OpenType 1273ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * specification defines the initial position of horizontal phantom points 1274ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * as 1275ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1276ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * pp1 = (round(xmin - lsb), 0) , 1277ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * pp2 = (round(pp1 + aw), 0) . 1278ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1279ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * Note that the rounding to the grid (in the device space) is not 1280ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * documented currently in the specification. 1281ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1282ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * However, the specification lacks the precise definition of vertical 1283ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * phantom points. Greg Hitchcock provided the following explanation. 1284ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1285ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * - a `vmtx' table is present 1286ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1287ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * For any glyph, the minimum and maximum y values (`ymin' and `ymax') 1288ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * are given in the `glyf' table, the top side bearing (tsb) and advance 1289ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * height (ah) are given in the `vmtx' table. The bottom side bearing 1290ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * (bsb) is then calculated as 1291ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1292ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * bsb = ah - (tsb + ymax - ymin) , 1293ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1294ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * and the initial position of vertical phantom points is 1295ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1296ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * pp3 = (x, round(ymax + tsb)) , 1297ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * pp4 = (x, round(pp3 - ah)) . 1298ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1299ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * See below for value `x'. 1300ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1301ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * - no `vmtx' table in the font 1302ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1303ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * If there is an `OS/2' table, we set 1304ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1305ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * DefaultAscender = sTypoAscender , 1306ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * DefaultDescender = sTypoDescender , 1307ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1308ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * otherwise we use data from the `hhea' table: 1309ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1310ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * DefaultAscender = Ascender , 1311ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * DefaultDescender = Descender . 1312ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1313ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * With these two variables we can now set 1314ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1315ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * ah = DefaultAscender - sDefaultDescender , 1316ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * tsb = DefaultAscender - yMax , 1317ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1318ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * and proceed as if a `vmtx' table was present. 1319ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1320ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * Usually we have 1321ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1322ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * x = aw / 2 , (1) 1323ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1324ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * but there is one compatibility case where it can be set to 1325ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1326ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * x = -DefaultDescender - 1327ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * ((DefaultAscender - DefaultDescender - aw) / 2) . (2) 1328ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1329ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * and another one with 1330ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1331ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * x = 0 . (3) 1332ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1333ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * In Windows, the history of those values is quite complicated, 1334ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * depending on the hinting engine (that is, the graphics framework). 1335ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1336ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * framework from to formula 1337ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * ---------------------------------------------------------- 1338ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * GDI Windows 98 current (1) 1339ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * (Windows 2000 for NT) 1340ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * GDI+ Windows XP Windows 7 (2) 1341ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * GDI+ Windows 8 current (3) 1342ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * DWrite Windows 7 current (3) 1343ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1344ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * For simplicity, FreeType uses (1) for grayscale subpixel hinting and 1345ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * (3) for everything else. 1346ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * 1347ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 1348055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin static void 1349055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin tt_loader_set_pp( TT_Loader loader ) 1350055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 1351055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Bool subpixel_hinting = 0; 1352055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Bool grayscale = 0; 1353055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Bool use_aw_2 = 0; 1354055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1355ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 1356055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face ); 1357055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 1358ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1359055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 1360055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) 1361055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 1362055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting 1363055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin : 0; 1364055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin grayscale = loader->exec ? loader->exec->grayscale 1365055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin : 0; 1366055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 1367055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 1368055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 1369055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) 1370055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 1371055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting_lean 1372055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin : 0; 1373055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin grayscale = loader->exec ? loader->exec->grayscale_cleartype 1374055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin : 0; 1375055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 1376055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 1377055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1378055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin use_aw_2 = (FT_Bool)( subpixel_hinting && grayscale ); 1379055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1380055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp1.x = loader->bbox.xMin - loader->left_bearing; 1381055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp1.y = 0; 1382055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp2.x = loader->pp1.x + loader->advance; 1383055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp2.y = 0; 1384055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1385055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp3.x = use_aw_2 ? loader->advance / 2 : 0; 1386055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp3.y = loader->bbox.yMax + loader->top_bearing; 1387055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp4.x = use_aw_2 ? loader->advance / 2 : 0; 1388055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->pp4.y = loader->pp3.y - loader->vadvance; 1389055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 1390055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1391055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1392055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* a utility function to retrieve i-th node from given FT_List */ 1393055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin static FT_ListNode 1394055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin ft_list_get_node_at( FT_List list, 1395055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_UInt index ) 1396055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 1397055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_ListNode cur; 1398055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1399055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1400055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( !list ) 1401055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin return NULL; 1402055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1403055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin for ( cur = list->head; cur; cur = cur->next ) 1404055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 1405055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( !index ) 1406055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin return cur; 1407055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1408055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin index--; 1409055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 1410055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1411055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin return NULL; 1412055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 1413ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* load_truetype_glyph */ 1419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Loads a given truetype glyph. Handles composites and uses a */ 1422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Loader object. */ 1423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 1425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project load_truetype_glyph( TT_Loader loader, 1426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt glyph_index, 1427295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_UInt recurse_count, 1428295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Bool header_only ) 1429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1430727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 1431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed x_scale, y_scale; 1432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong offset; 1433055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin TT_Face face = loader->face; 1434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader gloader = loader->gloader; 1435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool opened_frame = 0; 1436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_INCREMENTAL 1438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_StreamRec inc_stream; 1439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Data glyph_data; 1440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool glyph_data_loaded = 0; 1441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1444055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef FT_DEBUG_LEVEL_TRACE 1445055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( recurse_count ) 1446055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_TRACE5(( " nesting level: %d\n", recurse_count )); 1447055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 1448055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1449055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* some fonts have an incorrect value of `maxComponentDepth' */ 1450055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( recurse_count > face->max_profile.maxComponentDepth ) 1451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1452055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_TRACE1(( "load_truetype_glyph: maxComponentDepth set to %d\n", 1453055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin recurse_count )); 1454055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin face->max_profile.maxComponentDepth = (FT_UShort)recurse_count; 1455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1457fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#ifndef FT_CONFIG_OPTION_INCREMENTAL 1458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check glyph index */ 1459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) 1460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1461727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Glyph_Index ); 1462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1464fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#endif 1465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->glyph_index = glyph_index; 1467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) 1469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1470055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin x_scale = loader->size->metrics.x_scale; 1471055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin y_scale = loader->size->metrics.y_scale; 1472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale = 0x10000L; 1476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = 0x10000L; 1477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Set `offset' to the start of the glyph relative to the start of */ 1480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the `glyf' table, and `byte_len' to the length of the glyph in */ 1481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* bytes. */ 1482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_INCREMENTAL 1484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* If we are loading glyph data via the incremental interface, set */ 1486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the loader stream to a memory stream reading the data returned */ 1487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* by the interface. */ 1488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->root.internal->incremental_interface ) 1489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->root.internal->incremental_interface->funcs->get_glyph_data( 1491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->root.internal->incremental_interface->object, 1492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph_index, &glyph_data ); 1493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph_data_loaded = 1; 1497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project offset = 0; 1498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->byte_len = glyph_data.length; 1499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1500a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin FT_ZERO( &inc_stream ); 1501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream_OpenMemory( &inc_stream, 1502fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki glyph_data.pointer, 1503fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_ULong)glyph_data.length ); 1504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->stream = &inc_stream; 1506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* FT_CONFIG_OPTION_INCREMENTAL */ 1510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project offset = tt_face_get_location( face, glyph_index, 1512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_UInt*)&loader->byte_len ); 1513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( loader->byte_len > 0 ) 1515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1516295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef FT_CONFIG_OPTION_INCREMENTAL 1517295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* for the incremental interface, `glyf_offset' is always zero */ 1518a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( !face->glyf_offset && 1519295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner !face->root.internal->incremental_interface ) 1520295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else 1521a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( !face->glyf_offset ) 1522295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* FT_CONFIG_OPTION_INCREMENTAL */ 15230a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 1524295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" )); 1525727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Table ); 15260a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project goto Exit; 15270a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 15280a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->access_glyph_frame( loader, glyph_index, 1530a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin face->glyf_offset + offset, 1531fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_UInt)loader->byte_len ); 1532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project opened_frame = 1; 1536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1537295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* read glyph header first */ 1538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->read_glyph_header( loader ); 1539ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 1540ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 1541ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1542ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* the metrics must be computed after loading the glyph header */ 1543ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* since we need the glyph's `yMax' value in case the vertical */ 1544ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* metrics must be emulated */ 1545ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = tt_get_metrics( loader, glyph_index ); 1546ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 1547ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 1548ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1549ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( header_only ) 1550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( loader->byte_len == 0 || loader->n_contours == 0 ) 1554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.xMin = 0; 1556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.xMax = 0; 1557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.yMin = 0; 1558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->bbox.yMax = 0; 1559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1560ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = tt_get_metrics( loader, glyph_index ); 1561ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 1562ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 1563ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1564295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( header_only ) 1565295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner goto Exit; 1566295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 1567aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* must initialize points before (possibly) overriding */ 1568aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* glyph metrics from the incremental interface */ 1569055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin tt_loader_set_pp( loader ); 1570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1571aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_CONFIG_OPTION_INCREMENTAL 1572aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich tt_get_metrics_incr_overrides( loader, glyph_index ); 1573aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif 1574aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 1576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1577a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( loader->face->doblend && !loader->face->is_default_instance ) 1578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1579fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* a small outline structure with four elements for */ 1580fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* communication with `TT_Vary_Apply_Glyph_Deltas' */ 1581fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_Vector points[4]; 1582fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki char tags[4] = { 1, 1, 1, 1 }; 1583fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki short contours[4] = { 0, 1, 2, 3 }; 1584fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_Outline outline; 1585fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1586fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1587fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[0].x = loader->pp1.x; 1588fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[0].y = loader->pp1.y; 1589fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[1].x = loader->pp2.x; 1590fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[1].y = loader->pp2.y; 1591fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1592fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[2].x = loader->pp3.x; 1593fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[2].y = loader->pp3.y; 1594fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[3].x = loader->pp4.x; 1595fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[3].y = loader->pp4.y; 1596fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1597fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline.n_points = 4; 1598fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline.n_contours = 4; 1599fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline.points = points; 1600fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline.tags = tags; 1601fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline.contours = contours; 1602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1603fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* this must be done before scaling */ 1604055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin error = TT_Vary_Apply_Glyph_Deltas( loader->face, 1605055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph_index, 1606055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin &outline, 1607055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin (FT_UInt)outline.n_points ); 1608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1611fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp1.x = points[0].x; 1612fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp1.y = points[0].y; 1613fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp2.x = points[1].x; 1614fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp2.y = points[1].y; 1615ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1616fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp3.x = points[2].x; 1617fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp3.y = points[2].y; 1618fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp4.x = points[3].x; 1619fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp4.y = points[3].y; 1620a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 1621a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 1622a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin /* recalculate linear horizontal and vertical advances */ 1623a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin /* if we don't have HVAR and VVAR, respectively */ 1624a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) 1625a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin loader->linear = loader->pp2.x - loader->pp1.x; 1626a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) 1627a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin loader->vadvance = loader->pp4.x - loader->pp3.x; 1628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1630ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ 1631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1632ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* scale phantom points, if necessary; */ 1633ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* they get rounded in `TT_Hint_Glyph' */ 1634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) 1635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); 1637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); 1638ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* pp1.y and pp2.y are always zero */ 1639ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1640ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); 1641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); 1642ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); 1643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); 1644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1646727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_Err_Ok; 1647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1650ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* must initialize phantom points before (possibly) overriding */ 1651ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* glyph metrics from the incremental interface */ 1652055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin tt_loader_set_pp( loader ); 1653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1654aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_CONFIG_OPTION_INCREMENTAL 1655aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich tt_get_metrics_incr_overrides( loader, glyph_index ); 1656aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif 1657aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***********************************************************************/ 1659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***********************************************************************/ 1660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***********************************************************************/ 1661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if it is a simple glyph, load it */ 1663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( loader->n_contours > 0 ) 1665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->read_simple_glyph( loader ); 1667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* all data have been read */ 1671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->forget_glyph_frame( loader ); 1672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project opened_frame = 0; 1673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = TT_Process_Simple_Glyph( loader ); 1675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Add( gloader ); 1679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***********************************************************************/ 1682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***********************************************************************/ 1683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***********************************************************************/ 1684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* otherwise, load a composite! */ 1686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( loader->n_contours == -1 ) 1687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1688055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Memory memory = face->root.memory; 1689055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt start_point; 1691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt start_contour; 1692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong ins_pos; /* position of composite instructions, if any */ 1693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1694055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_ListNode node, node2; 1695055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1696055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1697055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* 1698055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin * We store the glyph index directly in the `node->data' pointer, 1699055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin * following the glib solution (cf. macro `GUINT_TO_POINTER') with a 1700055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin * double cast to make this portable. Note, however, that this needs 1701055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin * pointers with a width of at least 32 bits. 1702055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin */ 1703055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1704055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1705055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* clear the nodes filled by sibling chains */ 1706055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin node = ft_list_get_node_at( &loader->composites, recurse_count ); 1707055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin for ( node2 = node; node2; node2 = node2->next ) 1708055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin node2->data = (void*)ULONG_MAX; 1709055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1710055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* check whether we already have a composite glyph with this index */ 1711055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( FT_List_Find( &loader->composites, 1712055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin (void*)(unsigned long)glyph_index ) ) 1713055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 1714055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_TRACE1(( "TT_Load_Composite_Glyph:" 1715055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin " infinite recursion detected\n" )); 1716055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin error = FT_THROW( Invalid_Composite ); 1717055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin goto Exit; 1718055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 1719055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1720055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin else if ( node ) 1721055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin node->data = (void*)(unsigned long)glyph_index; 1722055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1723055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin else 1724055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 1725055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( FT_NEW( node ) ) 1726055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin goto Exit; 1727055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin node->data = (void*)(unsigned long)glyph_index; 1728055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_List_Add( &loader->composites, node ); 1729055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 1730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1731fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki start_point = (FT_UInt)gloader->base.outline.n_points; 1732fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki start_contour = (FT_UInt)gloader->base.outline.n_contours; 1733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* for each subglyph, read composite header */ 1735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->read_composite_glyph( loader ); 1736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* store the offset of instructions */ 1740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ins_pos = loader->ins_pos; 1741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* all data we need are read */ 1743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->forget_glyph_frame( loader ); 1744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project opened_frame = 0; 1745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 1747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1748a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( face->doblend && !face->is_default_instance ) 1749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1750055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin short i, limit; 1751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_SubGlyph subglyph; 1752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1753fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_Outline outline; 1754fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_Vector* points = NULL; 1755fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki char* tags = NULL; 1756fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki short* contours = NULL; 1757fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1759055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin limit = (short)gloader->current.num_subglyphs; 1760fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1761fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* construct an outline structure for */ 1762fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* communication with `TT_Vary_Apply_Glyph_Deltas' */ 1763055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin outline.n_points = (short)( gloader->current.num_subglyphs + 4 ); 1764fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline.n_contours = outline.n_points; 1765fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1766055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin outline.points = NULL; 1767055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin outline.tags = NULL; 1768055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin outline.contours = NULL; 1769055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 1770fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( FT_NEW_ARRAY( points, outline.n_points ) || 1771fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_NEW_ARRAY( tags, outline.n_points ) || 1772fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_NEW_ARRAY( contours, outline.n_points ) ) 1773fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki goto Exit1; 1774fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1775055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin subglyph = gloader->current.subglyphs; 1776fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1777fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki for ( i = 0; i < limit; i++, subglyph++ ) 1778fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki { 1779fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* applying deltas for anchor points doesn't make sense, */ 1780fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* but we don't have to specially check this since */ 1781fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* unused delta values are zero anyways */ 1782fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].x = subglyph->arg1; 1783fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].y = subglyph->arg2; 1784fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki tags[i] = 1; 1785fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki contours[i] = i; 1786fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki } 1787fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1788fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].x = loader->pp1.x; 1789fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].y = loader->pp1.y; 1790fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki tags[i] = 1; 1791fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki contours[i] = i; 1792fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1793fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki i++; 1794fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].x = loader->pp2.x; 1795fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].y = loader->pp2.y; 1796fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki tags[i] = 1; 1797fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki contours[i] = i; 1798fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1799fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki i++; 1800fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].x = loader->pp3.x; 1801fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].y = loader->pp3.y; 1802fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki tags[i] = 1; 1803fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki contours[i] = i; 1804fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1805fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki i++; 1806fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].x = loader->pp4.x; 1807fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki points[i].y = loader->pp4.y; 1808fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki tags[i] = 1; 1809fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki contours[i] = i; 1810fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1811fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline.points = points; 1812fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline.tags = tags; 1813fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki outline.contours = contours; 1814fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1815fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* this call provides additional offsets */ 1816fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* for each component's translation */ 1817a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas( 1818a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin face, 1819a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin glyph_index, 1820a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin &outline, 1821a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin (FT_UInt)outline.n_points ) ) ) 1822fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki goto Exit1; 1823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1824055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin subglyph = gloader->current.subglyphs; 1825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1826fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki for ( i = 0; i < limit; i++, subglyph++ ) 1827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1828055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( subglyph->flags & ARGS_ARE_XY_VALUES ) 1829055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 1830055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin subglyph->arg1 = (FT_Int16)points[i].x; 1831055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin subglyph->arg2 = (FT_Int16)points[i].y; 1832055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 1833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1835fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp1.x = points[i + 0].x; 1836fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp1.y = points[i + 0].y; 1837fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp2.x = points[i + 1].x; 1838fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp2.y = points[i + 1].y; 1839ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1840fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp3.x = points[i + 2].x; 1841fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp3.y = points[i + 2].y; 1842fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp4.x = points[i + 3].x; 1843fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->pp4.y = points[i + 3].y; 1844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1845a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin /* recalculate linear horizontal and vertical advances */ 1846a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin /* if we don't have HVAR and VVAR, respectively */ 1847a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) 1848a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin loader->linear = loader->pp2.x - loader->pp1.x; 1849a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) 1850a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin loader->vadvance = loader->pp4.x - loader->pp3.x; 1851a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 1852fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki Exit1: 1853fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_FREE( outline.points ); 1854fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_FREE( outline.tags ); 1855fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_FREE( outline.contours ); 1856fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 1857fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( error ) 1858fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki goto Exit; 1859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ 1862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1863ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* scale phantom points, if necessary; */ 1864ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* they get rounded in `TT_Hint_Glyph' */ 1865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) 1866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); 1868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); 1869ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* pp1.y and pp2.y are always zero */ 1870ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1871ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); 1872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); 1873ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); 1874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); 1875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */ 1878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* `as is' in the glyph slot (the client application will be */ 1879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* responsible for interpreting these data)... */ 1880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( loader->load_flags & FT_LOAD_NO_RECURSE ) 1881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Add( gloader ); 1883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE; 1884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*********************************************************************/ 1889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*********************************************************************/ 1890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*********************************************************************/ 1891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt n, num_base_points; 1894fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_SubGlyph subglyph = NULL; 1895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt num_points = start_point; 1897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt num_subglyphs = gloader->current.num_subglyphs; 1898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt num_base_subgs = gloader->base.num_subglyphs; 1899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream old_stream = loader->stream; 1901aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Int old_byte_len = loader->byte_len; 1902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Add( gloader ); 1905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* read each subglyph independently */ 1907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < num_subglyphs; n++ ) 1908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector pp[4]; 1910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1911a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin FT_Int linear_hadvance; 1912a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin FT_Int linear_vadvance; 1913a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 1914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Each time we call load_truetype_glyph in this loop, the */ 1916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* value of `gloader.base.subglyphs' can change due to table */ 1917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reallocations. We thus need to recompute the subglyph */ 1918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* pointer on each iteration. */ 1919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph = gloader->base.subglyphs + num_base_subgs + n; 1920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pp[0] = loader->pp1; 1922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pp[1] = loader->pp2; 1923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pp[2] = loader->pp3; 1924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pp[3] = loader->pp4; 1925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1926a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin linear_hadvance = loader->linear; 1927a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin linear_vadvance = loader->vadvance; 1928a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 1929fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki num_base_points = (FT_UInt)gloader->base.outline.n_points; 1930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1931fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki error = load_truetype_glyph( loader, 1932fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_UInt)subglyph->index, 1933fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki recurse_count + 1, 1934fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FALSE ); 1935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* restore subglyph pointer */ 1939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph = gloader->base.subglyphs + num_base_subgs + n; 1940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1941ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* restore phantom points if necessary */ 1942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !( subglyph->flags & USE_MY_METRICS ) ) 1943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp1 = pp[0]; 1945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp2 = pp[1]; 1946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp3 = pp[2]; 1947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->pp4 = pp[3]; 1948a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 1949a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin loader->linear = linear_hadvance; 1950a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin loader->vadvance = linear_vadvance; 1951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1953fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki num_points = (FT_UInt)gloader->base.outline.n_points; 1954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( num_points == num_base_points ) 1956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* gloader->base.outline consists of three parts: */ 1959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */ 1960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* (1): exists from the beginning */ 1962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* (2): components that have been loaded so far */ 1963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* (3): the newly loaded component */ 1964fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki error = TT_Process_Composite_Component( loader, 1965fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subglyph, 1966fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki start_point, 1967fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki num_base_points ); 1968fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( error ) 1969fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki goto Exit; 1970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1972aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->stream = old_stream; 1973aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich loader->byte_len = old_byte_len; 1974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* process the glyph */ 1976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->ins_pos = ins_pos; 1977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( IS_HINTED( loader->load_flags ) && 1978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subglyph->flags & WE_HAVE_INSTR && 1980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_points > start_point ) 1982fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki { 1983fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki error = TT_Process_Composite_Glyph( loader, 1984fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki start_point, 1985fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki start_contour ); 1986fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( error ) 1987fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki goto Exit; 1988fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki } 1989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* invalid composite count (negative but not -1) */ 1994727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Outline ); 1995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***********************************************************************/ 1999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***********************************************************************/ 2000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***********************************************************************/ 2001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 2003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( opened_frame ) 2005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->forget_glyph_frame( loader ); 2006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_INCREMENTAL 2008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( glyph_data_loaded ) 2010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->root.internal->incremental_interface->funcs->free_glyph_data( 2011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->root.internal->incremental_interface->object, 2012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &glyph_data ); 2013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 2015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 2017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 2021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project compute_glyph_metrics( TT_Loader loader, 2022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt glyph_index ) 2023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2024055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin TT_Face face = loader->face; 2025055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ 2026055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 2027727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); 2028727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 2029727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BBox bbox; 2031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed y_scale; 2032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphSlot glyph = loader->glyph; 2033055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin TT_Size size = loader->size; 2034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = 0x10000L; 2037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) 2038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = size->root.metrics.y_scale; 2039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE ) 2041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Get_CBox( &glyph->outline, &bbox ); 2042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bbox = loader->bbox; 2044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* get the device-independent horizontal advance; it is scaled later */ 2046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* by the base layer. */ 2047aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner glyph->linearHoriAdvance = loader->linear; 2048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->metrics.horiBearingX = bbox.xMin; 2050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->metrics.horiBearingY = bbox.yMax; 2051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; 2052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2053055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* Adjust advance width to the value contained in the hdmx table */ 2054055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* unless FT_LOAD_COMPUTE_METRICS is set or backwards compatibility */ 2055055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* mode of the v40 interpreter is active. See `ttinterp.h' for */ 2056055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* details on backwards compatibility mode. */ 2057055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( 2058055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 2059055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && 2060055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin ( loader->exec && loader->exec->backwards_compatibility ) ) && 2061055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 2062055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin !face->postscript.isFixedPitch && 2063055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin IS_HINTED( loader->load_flags ) && 2064055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin !( loader->load_flags & FT_LOAD_COMPUTE_METRICS ) ) 2065295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 2066295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Byte* widthp; 2067295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 2068295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 2069295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner widthp = tt_face_get_device_metrics( face, 2070295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner size->root.metrics.x_ppem, 2071295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner glyph_index ); 2072295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 2073055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 2074727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2075727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) 2076727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2077727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool ignore_x_mode; 2078727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2079727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2080727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) != 2081727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_RENDER_MODE_MONO ); 2082727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2083727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( widthp && 2084727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( ( ignore_x_mode && loader->exec->compatible_widths ) || 2085727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease !ignore_x_mode || 2086727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease SPH_OPTION_BITMAP_WIDTHS ) ) 2087055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.horiAdvance = *widthp * 64; 2088727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 2089727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 2090727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2091055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ 2092727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2093727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2094727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( widthp ) 2095055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.horiAdvance = *widthp * 64; 2096727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 2097295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 2098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2099295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* set glyph dimensions */ 2100295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner glyph->metrics.width = bbox.xMax - bbox.xMin; 2101295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner glyph->metrics.height = bbox.yMax - bbox.yMin; 2102295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 2103295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* Now take care of vertical metrics. In the case where there is */ 2104295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* no vertical information within the font (relatively common), */ 2105295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* create some metrics manually */ 2106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos top; /* scaled vertical top side bearing */ 2108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos advance; /* scaled vertical advance height */ 2109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Get the unscaled top bearing and advance height. */ 2112295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( face->vertical_info && 2113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->vertical.number_Of_VMetrics > 0 ) 2114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax, 2116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale ); 2117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( loader->pp3.y <= loader->pp4.y ) 2119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project advance = 0; 2120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y, 2122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale ); 2123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos height; 2127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX Compute top side bearing and advance height in */ 2130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Get_VMetrics instead of here. */ 2131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NOTE: The OS/2 values are the only `portable' ones, */ 2133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* which is why we use them, if there is an OS/2 */ 2134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* table in the font. Otherwise, we use the */ 2135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* values defined in the horizontal header. */ 2136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin, 2138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale ); 2139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->os2.version != 0xFFFFU ) 2140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project advance = (FT_Pos)( face->os2.sTypoAscender - 2141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->os2.sTypoDescender ); 2142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project advance = (FT_Pos)( face->horizontal.Ascender - 2144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->horizontal.Descender ); 2145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project top = ( advance - height ) / 2; 2147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_INCREMENTAL 2150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Incremental_InterfaceRec* incr; 2152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Incremental_MetricsRec metrics; 2153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 2154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project incr = face->root.internal->incremental_interface; 2157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* If this is an incrementally loaded font see if there are */ 2159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* overriding metrics for this glyph. */ 2160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( incr && incr->funcs->get_glyph_metrics ) 2161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics.bearing_x = 0; 2163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics.bearing_y = top; 2164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics.advance = advance; 2165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = incr->funcs->get_glyph_metrics( incr->object, 2167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph_index, 2168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TRUE, 2169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &metrics ); 2170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 2171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 2172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project top = metrics.bearing_y; 2174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project advance = metrics.advance; 2175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GWW: Do vertical metrics get loaded incrementally too? */ 2179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* FT_CONFIG_OPTION_INCREMENTAL */ 2181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->linearVertAdvance = advance; 2183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* scale the metrics */ 2185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) 2186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2187295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner top = FT_MulFix( top, y_scale ); 2188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project advance = FT_MulFix( advance, y_scale ); 2189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: for now, we have no better algorithm for the lsb, but it */ 2192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* should work fine. */ 2193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2194295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner glyph->metrics.vertBearingX = glyph->metrics.horiBearingX - 2195295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner glyph->metrics.horiAdvance / 2; 2196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->metrics.vertBearingY = top; 2197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->metrics.vertAdvance = advance; 2198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 2201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 2205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 2207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project load_sbit_image( TT_Size size, 2208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphSlot glyph, 2209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt glyph_index, 2210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 load_flags ) 2211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face; 2213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SFNT_Service sfnt; 2214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream; 2215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 2216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_SBit_MetricsRec metrics; 2217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face = (TT_Face)glyph->face; 2220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sfnt = (SFNT_Service)face->sfnt; 2221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project stream = face->root.stream; 2222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = sfnt->load_sbit_image( face, 2224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->strike_index, 2225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph_index, 2226fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki (FT_UInt)load_flags, 2227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project stream, 2228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &glyph->bitmap, 2229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &metrics ); 2230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 2231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->outline.n_points = 0; 2233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->outline.n_contours = 0; 2234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2235055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.width = (FT_Pos)metrics.width * 64; 2236055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.height = (FT_Pos)metrics.height * 64; 2237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2238055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX * 64; 2239055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY * 64; 2240055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance * 64; 2241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2242055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX * 64; 2243055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY * 64; 2244055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance * 64; 2245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->format = FT_GLYPH_FORMAT_BITMAP; 2247295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 2248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) 2249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->bitmap_left = metrics.vertBearingX; 2251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->bitmap_top = metrics.vertBearingY; 2252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->bitmap_left = metrics.horiBearingX; 2256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->bitmap_top = metrics.horiBearingY; 2257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 2261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ 2264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 2267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_loader_init( TT_Loader loader, 2268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size, 2269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphSlot glyph, 2270295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Int32 load_flags, 2271295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Bool glyf_table_only ) 2272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2273fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_Error error; 2274fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 2275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face; 2276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream; 2277727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_USE_BYTECODE_INTERPRETER 2278aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); 2279727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 2280055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ 2281055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 2282055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( (TT_Face)glyph->face ); 2283055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 2284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face = (TT_Face)glyph->face; 2287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project stream = face->root.stream; 2288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2289a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin FT_ZERO( loader ); 2290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 2292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* load execution context */ 2294295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( IS_HINTED( load_flags ) && !glyf_table_only ) 2295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_ExecContext exec; 2297055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Bool grayscale = TRUE; 2298055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 2299055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Bool subpixel_hinting_lean; 2300055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_Bool grayscale_cleartype; 2301055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 2302727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2303055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 2304fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_Bool subpixel_hinting = FALSE; 2305727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#if 0 2307727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* not used yet */ 2308727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool compatible_widths; 2309727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool symmetrical_smoothing; 2310727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool bgr; 2311fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_Bool vertical_lcd; 2312727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool subpixel_positioned; 2313fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_Bool gray_cleartype; 2314727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 2315055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ 2316727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2317727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool reexecute = FALSE; 2318727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 23209c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod if ( size->bytecode_ready < 0 || size->cvt_ready < 0 ) 2321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2322fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki error = tt_size_ready_bytecode( size, pedantic ); 2323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 2324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 2325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 23269c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod else if ( size->bytecode_ready ) 23279c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod return size->bytecode_ready; 23289c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod else if ( size->cvt_ready ) 23299c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod return size->cvt_ready; 2330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* query new execution context */ 2332fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki exec = size->context; 2333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !exec ) 2334727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Could_Not_Find_Context ); 2335727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2336055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 2337055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) 2338055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 2339055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin subpixel_hinting_lean = TRUE; 2340055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin grayscale_cleartype = !FT_BOOL( load_flags & 2341055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_LOAD_TARGET_LCD || 2342055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin load_flags & 2343055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_LOAD_TARGET_LCD_V ); 2344055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin exec->vertical_lcd_lean = FT_BOOL( load_flags & 2345055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_LOAD_TARGET_LCD_V ); 2346055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 2347055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin else 2348055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 2349055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin subpixel_hinting_lean = FALSE; 2350055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin grayscale_cleartype = FALSE; 2351055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin exec->vertical_lcd_lean = FALSE; 2352055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 2353055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 2354055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2355055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 2356727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2357727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) 2358727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2359fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags ) != 2360fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_RENDER_MODE_MONO ) && 2361fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki SPH_OPTION_SET_SUBPIXEL ); 2362727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2363fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( subpixel_hinting ) 2364ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease grayscale = FALSE; 2365727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( SPH_OPTION_SET_GRAYSCALE ) 2366727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2367fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki grayscale = TRUE; 2368fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subpixel_hinting = FALSE; 2369727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 2370727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 2371ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease grayscale = FALSE; 2372727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2373727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( FT_IS_TRICKY( glyph->face ) ) 2374fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki subpixel_hinting = FALSE; 2375727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2376fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki exec->ignore_x_mode = subpixel_hinting || grayscale; 2377727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; 2378727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 ) 2379727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->rasterizer_version = TT_INTERPRETER_VERSION_35; 2380727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2381727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#if 1 2382727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->compatible_widths = SPH_OPTION_SET_COMPATIBLE_WIDTHS; 2383fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki exec->symmetrical_smoothing = TRUE; 2384727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->bgr = FALSE; 2385fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki exec->vertical_lcd = FALSE; 2386727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->subpixel_positioned = TRUE; 2387fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki exec->gray_cleartype = FALSE; 2388727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else /* 0 */ 2389727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->compatible_widths = 2390727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != 2391727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease TT_LOAD_COMPATIBLE_WIDTHS ); 2392727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->symmetrical_smoothing = 2393727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != 2394727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease TT_LOAD_SYMMETRICAL_SMOOTHING ); 2395727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->bgr = 2396727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != 2397727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease TT_LOAD_BGR ); 2398fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki exec->vertical_lcd = 2399fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != 2400fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki TT_LOAD_VERTICAL_LCD ); 2401727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->subpixel_positioned = 2402727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != 2403727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease TT_LOAD_SUBPIXEL_POSITIONED ); 2404fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki exec->gray_cleartype = 2405fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != 2406fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki TT_LOAD_GRAY_CLEARTYPE ); 2407727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* 0 */ 2408727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2409727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 2410727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 2411727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2412055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ 2413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2414055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 2415055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) 2416055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin grayscale = FT_BOOL( !subpixel_hinting_lean && 2417055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_LOAD_TARGET_MODE( load_flags ) != 2418055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_RENDER_MODE_MONO ); 2419055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin else 2420055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 2421727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != 2422055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_RENDER_MODE_MONO ); 2423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2424fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki error = TT_Load_Context( exec, face, size ); 2425fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( error ) 2426fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki return error; 2427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2428055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 2429727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2430727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) 2431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2432727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* a change from mono to subpixel rendering (and vice versa) */ 2433727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* requires a re-execution of the CVT program */ 2434fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( subpixel_hinting != exec->subpixel_hinting ) 2435727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2436727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_TRACE4(( "tt_loader_init: subpixel hinting change," 2437727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease " re-executing `prep' table\n" )); 2438727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2439fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki exec->subpixel_hinting = subpixel_hinting; 2440fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki reexecute = TRUE; 2441727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 2442727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2443727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* a change from mono to grayscale rendering (and vice versa) */ 2444727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* requires a re-execution of the CVT program */ 2445ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( grayscale != exec->grayscale ) 2446727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2447727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_TRACE4(( "tt_loader_init: grayscale hinting change," 2448727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease " re-executing `prep' table\n" )); 2449727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2450ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease exec->grayscale = grayscale; 2451ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease reexecute = TRUE; 2452727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 2453727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 2454727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 2455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2456055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ 2457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2458727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2459055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2460055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL 2461055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) 2462055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 2463055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* a change from mono to subpixel rendering (and vice versa) */ 2464055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* requires a re-execution of the CVT program */ 2465055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( subpixel_hinting_lean != exec->subpixel_hinting_lean ) 2466055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 2467055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_TRACE4(( "tt_loader_init: subpixel hinting change," 2468055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin " re-executing `prep' table\n" )); 2469055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2470055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin exec->subpixel_hinting_lean = subpixel_hinting_lean; 2471055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin reexecute = TRUE; 2472055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 2473055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2474055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* a change from colored to grayscale subpixel rendering (and */ 2475055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin /* vice versa) requires a re-execution of the CVT program */ 2476055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( grayscale_cleartype != exec->grayscale_cleartype ) 2477055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 2478055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_TRACE4(( "tt_loader_init: grayscale subpixel hinting change," 2479055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin " re-executing `prep' table\n" )); 2480055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2481055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin exec->grayscale_cleartype = grayscale_cleartype; 2482055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin reexecute = TRUE; 2483055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 2484055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 2485055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#endif 2486055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2487727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* a change from mono to grayscale rendering (and vice versa) */ 2488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* requires a re-execution of the CVT program */ 2489727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( grayscale != exec->grayscale ) 2490727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2491fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_TRACE4(( "tt_loader_init: grayscale hinting change," 2492727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease " re-executing `prep' table\n" )); 2493727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2494727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease exec->grayscale = grayscale; 2495727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease reexecute = TRUE; 2496727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 2497727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 2498727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2499727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( reexecute ) 2500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2501fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_UInt i; 25027f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < size->cvt_size; i++ ) 2505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); 25069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod error = tt_size_run_prep( size, pedantic ); 25079c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod if ( error ) 25089c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod return error; 2509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2511fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* check whether the cvt program has disabled hinting */ 2512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( exec->GS.instruct_control & 1 ) 2513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project load_flags |= FT_LOAD_NO_HINTING; 2514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* load default graphics state -- if needed */ 2516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( exec->GS.instruct_control & 2 ) 2517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS = tt_default_graphics_state; 2518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2519055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY 2520fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* check whether we have a font hinted for ClearType -- */ 2521fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* note that this flag can also be modified in a glyph's bytecode */ 2522055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && 2523055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin exec->GS.instruct_control & 4 ) 2524fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki exec->ignore_x_mode = 0; 2525fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#endif 2526fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki 2527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); 2528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->exec = exec; 2529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->instructions = exec->glyphIns; 2530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 2533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* get face's glyph loader */ 2535295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( !glyf_table_only ) 2536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader gloader = glyph->internal->loader; 2538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphLoader_Rewind( gloader ); 2541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->gloader = gloader; 2542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2544fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki loader->load_flags = (FT_ULong)load_flags; 2545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2546055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->face = face; 2547055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->size = size; 2548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->glyph = (FT_GlyphSlot)glyph; 2549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loader->stream = stream; 2550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2551055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->composites.head = NULL; 2552055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->composites.tail = NULL; 2553055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2554727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 2555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2558055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin static void 2559055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin tt_loader_done( TT_Loader loader ) 2560055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin { 2561055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin FT_List_Finalize( &loader->composites, 2562055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin NULL, 2563055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin loader->face->root.memory, 2564055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin NULL ); 2565055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin } 2566055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2567055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Load_Glyph */ 2572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* A function used to load a single glyph within a given glyph slot, */ 2575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* for a given size. */ 2576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* glyph :: A handle to a target slot object where the glyph */ 2579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* will be loaded. */ 2580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: A handle to the source face size at which the glyph */ 2582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* must be scaled/loaded. */ 2583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* glyph_index :: The index of the glyph in the font file. */ 2585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* load_flags :: A flag indicating what to load for this glyph. The */ 2587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FT_LOAD_XXX constants can be used to control the */ 2588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* glyph loading process (e.g., whether the outline */ 2589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* should be scaled, whether to load bitmaps or not, */ 2590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* whether to hint the outline, etc). */ 2591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 2594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 2596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Load_Glyph( TT_Size size, 2597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphSlot glyph, 2598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt glyph_index, 2599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 load_flags ) 2600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 2602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_LoaderRec loader; 2603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2604a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 2605a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin#define IS_DEFAULT_INSTANCE ( ( (TT_Face)glyph->face )->is_default_instance ) 2606a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin#else 2607a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin#define IS_DEFAULT_INSTANCE 1 2608a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin#endif 2609a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 2610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2611ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index )); 2612ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 2613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 2614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2615a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin /* try to load embedded bitmap (if any) */ 2616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size->strike_index != 0xFFFFFFFFUL && 2617a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin ( load_flags & FT_LOAD_NO_BITMAP ) == 0 && 2618a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin IS_DEFAULT_INSTANCE ) 2619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = load_sbit_image( size, glyph, glyph_index, load_flags ); 2621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 2622295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 2623727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( FT_IS_SCALABLE( glyph->face ) ) 2624295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 2625295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* for the bbox we need the header only */ 2626295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE ); 2627295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE ); 2628055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin tt_loader_done( &loader ); 2629295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner glyph->linearHoriAdvance = loader.linear; 2630fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki glyph->linearVertAdvance = loader.vadvance; 2631727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 2632fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* sanity checks: if `xxxAdvance' in the sbit metric */ 2633fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki /* structure isn't set, use `linearXXXAdvance' */ 2634727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance ) 2635727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease glyph->metrics.horiAdvance = 2636727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_MulFix( glyph->linearHoriAdvance, 2637727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease size->root.metrics.x_scale ); 2638fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki if ( !glyph->metrics.vertAdvance && glyph->linearVertAdvance ) 2639fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki glyph->metrics.vertAdvance = 2640fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki FT_MulFix( glyph->linearVertAdvance, 2641fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki size->root.metrics.y_scale ); 2642295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 2643295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 2644727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 2645295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 2646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ 2649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ 2651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid ) 2652a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin { 2653a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin error = FT_THROW( Invalid_Size_Handle ); 2654a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin goto Exit; 2655a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin } 2656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( load_flags & FT_LOAD_SBITS_ONLY ) 2658a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin { 2659a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin error = FT_THROW( Invalid_Argument ); 2660a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin goto Exit; 2661a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin } 2662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2663295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner error = tt_loader_init( &loader, size, glyph, load_flags, FALSE ); 2664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 2665a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin goto Exit; 2666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->format = FT_GLYPH_FORMAT_OUTLINE; 2668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->num_subglyphs = 0; 2669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->outline.flags = 0; 2670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* main loading loop */ 2672295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner error = load_truetype_glyph( &loader, glyph_index, 0, FALSE ); 2673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 2674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE ) 2676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->num_subglyphs = loader.gloader->base.num_subglyphs; 2678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->subglyphs = loader.gloader->base.subglyphs; 2679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->outline = loader.gloader->base.outline; 2683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS; 2684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2685aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* Translate array so that (0,0) is the glyph's origin. Note */ 2686aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* that this behaviour is independent on the value of bit 1 of */ 2687aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* the `flags' field in the `head' table -- at least major */ 2688aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* applications like Acroread indicate that. */ 2689aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( loader.pp1.x ) 2690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 ); 2691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 26930a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 26940a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 26950a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( IS_HINTED( load_flags ) ) 26960a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 26970a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( loader.exec->GS.scan_control ) 26980a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 26990a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* convert scan conversion mode to FT_OUTLINE_XXX flags */ 27000a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project switch ( loader.exec->GS.scan_type ) 27010a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 27020a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project case 0: /* simple drop-outs including stubs */ 27030a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS; 27040a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project break; 27050a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project case 1: /* simple drop-outs excluding stubs */ 27060a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* nothing; it's the default rendering mode */ 27070a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project break; 27080a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project case 4: /* smart drop-outs including stubs */ 27090a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS | 27100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_OUTLINE_INCLUDE_STUBS; 27110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project break; 27120a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project case 5: /* smart drop-outs excluding stubs */ 27130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS; 27140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project break; 27150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 27160a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project default: /* no drop-out control */ 27170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; 27180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project break; 27190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 27200a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 2721295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner else 27220a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; 27230a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 27240a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 27250a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 27260a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 2727fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki error = compute_glyph_metrics( &loader, glyph_index ); 2728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2730055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin tt_loader_done( &loader ); 2731055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin 2732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Set the `high precision' bit flag. */ 2733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This is _critical_ to get correct output for monochrome */ 2734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TrueType glyphs at all sizes using the bytecode interpreter. */ 2735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !( load_flags & FT_LOAD_NO_SCALE ) && 2737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->root.metrics.y_ppem < 24 ) 2738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; 2739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2740a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin Exit: 2741a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin#ifdef FT_DEBUG_LEVEL_TRACE 2742a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin if ( error ) 2743a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin FT_TRACE1(( " failed (error code 0x%x)\n", 2744a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin error )); 2745a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin#endif 2746a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin 2747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 2748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 2752