ttobjs.c revision 41371e1e39c8528eb0c4bc40683c736e6683e60c
1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ttobjs.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Objects manager (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner/* Copyright 1996-2011 */ 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_STREAM_H 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_TAGS_H 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_SFNT_H 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttgload.h" 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttpload.h" 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "tterrors.h" 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttinterp.h" 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_UNPATENTED_H 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttgxvar.h" 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_ttobjs 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GLYPH ZONE FUNCTIONS */ 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_glyphzone_done */ 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Deallocate a glyph zone. */ 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* zone :: A pointer to the target glyph zone. */ 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_glyphzone_done( TT_GlyphZone zone ) 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = zone->memory; 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( memory ) 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->contours ); 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->tags ); 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->cur ); 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->org ); 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->orus ); 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->max_points = zone->n_points = 0; 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->max_contours = zone->n_contours = 0; 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->memory = NULL; 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_glyphzone_new */ 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Allocate a new glyph zone. */ 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* memory :: A handle to the current memory object. */ 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* maxPoints :: The capacity of glyph zone in points. */ 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* maxContours :: The capacity of glyph zone in contours. */ 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Output> */ 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* zone :: A pointer to the target glyph zone record. */ 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_glyphzone_new( FT_Memory memory, 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort maxPoints, 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short maxContours, 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphZone zone ) 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( zone, sizeof ( *zone ) ); 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->memory = memory; 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW_ARRAY( zone->org, maxPoints ) || 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( zone->cur, maxPoints ) || 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( zone->orus, maxPoints ) || 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( zone->tags, maxPoints ) || 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( zone->contours, maxContours ) ) 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_glyphzone_done( zone ); 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->max_points = maxPoints; 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->max_contours = maxContours; 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1450a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* Compare the face with a list of well-known `tricky' fonts. */ 1460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* This list shall be expanded as we find more of them. */ 1470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project static FT_Bool 1497f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner tt_check_trickyness_family( FT_String* name ) 1500a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 1517f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 152295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define TRICK_NAMES_MAX_CHARACTERS 16 1537f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner#define TRICK_NAMES_COUNT 8 1547f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 1557f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner static const char trick_names[TRICK_NAMES_COUNT] 1567f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner [TRICK_NAMES_MAX_CHARACTERS + 1] = 1570a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 1580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "DFKaiSho-SB", /* dfkaisb.ttf */ 1590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "DFKaiShu", 1600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "DFKai-SB", /* kaiu.ttf */ 1617f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner "HuaTianKaiTi?", /* htkt2.ttf */ 1620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "HuaTianSongTi?", /* htst3.ttf */ 1630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "MingLiU", /* mingliu.ttf & mingliu.ttc */ 1640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "PMingLiU", /* mingliu.ttc */ 1650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "MingLi43", /* mingli.ttf */ 1660a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project }; 1670a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1687f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner int nn; 1690a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 171295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ ) 1720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( ft_strstr( name, trick_names[nn] ) ) 1730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return TRUE; 1740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return FALSE; 1760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 1770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1797f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* XXX: This function should be in the `sfnt' module. */ 1807f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 1817f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* Some PDF generators clear the checksums in the TrueType header table. */ 1827f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF */ 1837f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* Printer clears the entries for subsetted subtables. We thus have to */ 1847f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* recalculate the checksums where necessary. */ 1857f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 1867f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner static FT_UInt32 1877f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner tt_synth_sfnt_checksum( FT_Stream stream, 1887f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_ULong length ) 1897f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 1907f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_Error error; 1917f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_UInt32 checksum = 0; 1927f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner int i; 1937f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 1947f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 1957f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( FT_FRAME_ENTER( length ) ) 1967f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return 0; 1977f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 1987f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner for ( ; length > 3; length -= 4 ) 1997f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner checksum += (FT_UInt32)FT_GET_ULONG(); 2007f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2017f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner for ( i = 3; length > 0; length --, i-- ) 2027f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) ); 2037f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2047f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_FRAME_EXIT(); 2057f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2067f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return checksum; 2077f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 2087f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2097f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2107f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* XXX: This function should be in the `sfnt' module. */ 2117f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2127f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner static FT_ULong 2137f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner tt_get_sfnt_checksum( TT_Face face, 2147f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_UShort i ) 2157f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 216aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#if 0 /* if we believe the written value, use following part. */ 2177f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( face->dir_tables[i].CheckSum ) 2187f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return face->dir_tables[i].CheckSum; 219aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif 2207f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 221aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( !face->goto_table ) 2227f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return 0; 2237f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 224aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( face->goto_table( face, 225aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner face->dir_tables[i].Tag, 226aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner face->root.stream, 227aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner NULL ) ) 2287f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return 0; 2297f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2307f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream, 2317f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner face->dir_tables[i].Length ); 2327f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 2337f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2347f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2357f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner typedef struct tt_sfnt_id_rec_ 2367f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 2377f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_ULong CheckSum; 2387f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_ULong Length; 2397f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2407f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } tt_sfnt_id_rec; 2417f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2427f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2437f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner static FT_Bool 2447f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner tt_check_trickyness_sfnt_ids( TT_Face face ) 2457f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 2467f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner#define TRICK_SFNT_IDS_PER_FACE 3 247aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#define TRICK_SFNT_IDS_NUM_FACES 13 2487f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2497f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES] 2507f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner [TRICK_SFNT_IDS_PER_FACE] = { 2517f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2527f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner#define TRICK_SFNT_ID_cvt 0 2537f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner#define TRICK_SFNT_ID_fpgm 1 2547f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner#define TRICK_SFNT_ID_prep 2 2557f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 2567f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { /* MingLiU 1995 */ 2577f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x05bcf058, 0x000002e4 }, /* cvt */ 2587f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x28233bf1, 0x000087c4 }, /* fpgm */ 2597f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0xa344a1ea, 0x000001e1 } /* prep */ 2607f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner }, 2617f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { /* MingLiU 1996- */ 2627f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x05bcf058, 0x000002e4 }, /* cvt */ 2637f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x28233bf1, 0x000087c4 }, /* fpgm */ 2647f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0xa344a1eb, 0x000001e1 } /* prep */ 2657f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner }, 2667f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { /* DFKaiShu */ 2677f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x11e5ead4, 0x00000350 }, /* cvt */ 2687f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x5a30ca3b, 0x00009063 }, /* fpgm */ 2697f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x13a42602, 0x0000007e } /* prep */ 2707f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner }, 2717f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { /* HuaTianKaiTi */ 2727f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0xfffbfffc, 0x00000008 }, /* cvt */ 2737f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x9c9e48b8, 0x0000bea2 }, /* fpgm */ 2747f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x70020112, 0x00000008 } /* prep */ 2757f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner }, 2767f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { /* HuaTianSongTi */ 2777f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0xfffbfffc, 0x00000008 }, /* cvt */ 2787f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x0a5a0483, 0x00017c39 }, /* fpgm */ 2797f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 0x70020112, 0x00000008 } /* prep */ 280aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner }, 281aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { /* NEC fadpop7.ttf */ 282aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 283aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x40c92555, 0x000000e5 }, /* fpgm */ 284aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0xa39b58e3, 0x0000117c } /* prep */ 285aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner }, 286aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { /* NEC fadrei5.ttf */ 287aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 288aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x33c41652, 0x000000e5 }, /* fpgm */ 289aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x26d6c52a, 0x00000f6a } /* prep */ 290aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner }, 291aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { /* NEC fangot7.ttf */ 292aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 293aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x6db1651d, 0x0000019d }, /* fpgm */ 294aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x6c6e4b03, 0x00002492 } /* prep */ 295aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner }, 296aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { /* NEC fangyo5.ttf */ 297aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 298aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x40c92555, 0x000000e5 }, /* fpgm */ 299aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0xde51fad0, 0x0000117c } /* prep */ 300aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner }, 301aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { /* NEC fankyo5.ttf */ 302aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 303aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x85e47664, 0x000000e5 }, /* fpgm */ 304aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0xa6c62831, 0x00001caa } /* prep */ 305aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner }, 306aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { /* NEC fanrgo5.ttf */ 307aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 308aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x2d891cfd, 0x0000019d }, /* fpgm */ 309aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0xa0604633, 0x00001de8 } /* prep */ 310aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner }, 311aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { /* NEC fangot5.ttc */ 312aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 313aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x40aa774c, 0x000001cb }, /* fpgm */ 314aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x9b5caa96, 0x00001f9a } /* prep */ 315aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner }, 316aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { /* NEC fanmin3.ttc */ 317aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 318aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0x0d3de9cb, 0x00000141 }, /* fpgm */ 319aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 0xd4127766, 0x00002280 } /* prep */ 3207f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 3217f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner }; 3227f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 323aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_ULong checksum; 324aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner int num_matched_ids[TRICK_SFNT_IDS_NUM_FACES]; 325aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Bool has_cvt, has_fpgm, has_prep; 326aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_UShort i; 327aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner int j, k; 3287f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3297f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3307f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_MEM_SET( num_matched_ids, 0, 33141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES ); 332aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner has_cvt = FALSE; 333aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner has_fpgm = FALSE; 334aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner has_prep = FALSE; 3357f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3367f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner for ( i = 0; i < face->num_tables; i++ ) 3377f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 3387f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner checksum = 0; 3397f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3407f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner switch( face->dir_tables[i].Tag ) 3417f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 3427f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner case TTAG_cvt: 3437f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner k = TRICK_SFNT_ID_cvt; 344aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner has_cvt = TRUE; 3457f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner break; 3467f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3477f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner case TTAG_fpgm: 3487f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner k = TRICK_SFNT_ID_fpgm; 349aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner has_fpgm = TRUE; 3507f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner break; 3517f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3527f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner case TTAG_prep: 3537f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner k = TRICK_SFNT_ID_prep; 354aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner has_prep = TRUE; 3557f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner break; 3567f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3577f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner default: 3587f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner continue; 3597f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 3607f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3617f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) 3627f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( face->dir_tables[i].Length == sfnt_id[j][k].Length ) 3637f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 3647f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( !checksum ) 3657f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner checksum = tt_get_sfnt_checksum( face, i ); 3667f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3677f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( sfnt_id[j][k].CheckSum == checksum ) 3687f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner num_matched_ids[j]++; 3697f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3707f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) 3717f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return TRUE; 3727f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 3737f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 3747f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 375aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) 376aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 377aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( !has_cvt && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length ) 378aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner num_matched_ids[j] ++; 379aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length ) 380aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner num_matched_ids[j] ++; 381aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length ) 382aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner num_matched_ids[j] ++; 383aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) 384aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner return TRUE; 385aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 386aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 3877f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return FALSE; 3887f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 3897f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3907f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 3917f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner static FT_Bool 3927f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner tt_check_trickyness( FT_Face face ) 3937f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 3947f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( !face ) 3957f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return FALSE; 3967f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 397aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* For first, check the face name for quick check. */ 398aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( face->family_name && 399aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner tt_check_trickyness_family( face->family_name ) ) 400aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner return TRUE; 4017f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 4027f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* Type42 fonts may lack `name' tables, we thus try to identify */ 4037f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* tricky fonts by checking the checksums of Type42-persistent */ 4047f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* sfnt tables (`cvt', `fpgm', and `prep'). */ 4057f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) ) 4067f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return TRUE; 4077f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 4087f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner return FALSE; 4097f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 4107f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 4117f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 412aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Check whether `.notdef' is the only glyph in the `loca' table. */ 413aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner static FT_Bool 414aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner tt_check_single_notdef( FT_Face ttface ) 415aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 416aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Bool result = FALSE; 417aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 418aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner TT_Face face = (TT_Face)ttface; 419aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_UInt asize; 420aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_ULong i; 421aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_ULong glyph_index = 0; 422aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_UInt count = 0; 423aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 424aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 425aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner for( i = 0; i < face->num_locations; i++ ) 426aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 427aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner tt_face_get_location( face, i, &asize ); 428aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( asize > 0 ) 429aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 430aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner count += 1; 431aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( count > 1 ) 432aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner break; 433aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner glyph_index = i; 434aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 435aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 436aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 437aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Only have a single outline. */ 438aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( count == 1 ) 439aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 440aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( glyph_index == 0 ) 441aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner result = TRUE; 442aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner else 443aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 444aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* FIXME: Need to test glyphname == .notdef ? */ 445aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Error error; 446aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner char buf[8]; 447aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 448aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 449aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 ); 450aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( !error && 451aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) ) 452aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner result = TRUE; 453aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 454aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 455aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 456aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner return result; 457aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 458aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 459aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_face_init */ 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize a given TrueType face object. */ 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* stream :: The source font stream. */ 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* face_index :: The index of the font face in the resource. */ 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* num_params :: Number of additional generic parameters. Ignored. */ 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* params :: Additional generic parameters. Ignored. */ 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* face :: The newly built face object. */ 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_face_init( FT_Stream stream, 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Face ttface, /* TT_Face */ 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int face_index, 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int num_params, 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Parameter* params ) 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library; 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SFNT_Service sfnt; 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)ttface; 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 49641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_TRACE2(( "TTF driver\n" )); 49741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 4980a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project library = ttface->driver->root.library; 49941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 50041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !sfnt ) 50241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier { 50341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" )); 50441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier error = TT_Err_Missing_Module; 50541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Exit; 50641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier } 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create input stream from resource */ 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SEEK( 0 ) ) 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check that we have a valid TrueType file */ 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = sfnt->init_face( stream, face, face_index, num_params, params ); 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We must also be able to accept Mac/GX fonts, as well as OT ones. */ 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The 0x00020000 tag is completely undocumented; some fonts from */ 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Arphic made for Chinese Windows 3.1 have this. */ 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->format_tag != 0x00010000L && /* MS fonts */ 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */ 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->format_tag != TTAG_true ) /* Mac fonts */ 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 52441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_TRACE2(( " not a TTF font\n" )); 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad_Format; 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 5290a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project ttface->face_flags |= FT_FACE_FLAG_HINTER; 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* If we are performing a simple font format check, exit immediately. */ 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face_index < 0 ) 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return TT_Err_Ok; 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Load font directory */ 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = sfnt->load_face( stream, face, face_index, num_params, params ); 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5417f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( tt_check_trickyness( ttface ) ) 5420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project ttface->face_flags |= FT_FACE_FLAG_TRICKY; 5430a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_hdmx( face, stream ); 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( FT_IS_SCALABLE( ttface ) ) 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_INCREMENTAL 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( !ttface->internal->incremental_interface ) 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_loca( face, stream ); 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_cvt( face, stream ); 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_fpgm( face, stream ); 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_prep( face, stream ); 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 562aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Check the scalable flag based on `loca'. */ 563aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( !ttface->internal->incremental_interface && 564aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner ttface->num_fixed_sizes && 565aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner face->glyph_locations && 566aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner tt_check_single_notdef( ttface ) ) 567aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 568aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_TRACE5(( "tt_face_init:" 569aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner " Only the `.notdef' glyph has an outline.\n" 570aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner " " 571aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner " Resetting scalable flag to FALSE.\n" )); 572aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 573aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; 574aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 575aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_loca( face, stream ); 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_cvt( face, stream ); 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_fpgm( face, stream ); 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_prep( face, stream ); 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 587aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Check the scalable flag based on `loca'. */ 588aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( ttface->num_fixed_sizes && 589aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner face->glyph_locations && 590aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner tt_check_single_notdef( ttface ) ) 591aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 592aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_TRACE5(( "tt_face_init:" 593aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner " Only the `.notdef' glyph has an outline.\n" 594aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner " " 595aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner " Resetting scalable flag to FALSE.\n" )); 596aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 597aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; 598aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 599aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER ) 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool unpatented_hinting; 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int i; 610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Determine whether unpatented hinting is to be used for this face. */ 613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unpatented_hinting = FT_BOOL 614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL ); 615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < num_params && !face->unpatented_hinting; i++ ) 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING ) 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unpatented_hinting = TRUE; 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !unpatented_hinting ) 6210a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project ttface->internal->ignore_unpatented_hinter = TRUE; 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING && 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* initialize standard glyph loading routines */ 628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Init_Glyph_Loading( face ); 629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Bad_Format: 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = TT_Err_Unknown_File_Format; 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_face_done */ 643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Finalize a given face object. */ 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* face :: A pointer to the face object to destroy. */ 649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_face_done( FT_Face ttface ) /* TT_Face */ 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project TT_Face face = (TT_Face)ttface; 6540a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Memory memory; 6550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Stream stream; 6560a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project SFNT_Service sfnt; 6570a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( !face ) 6600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return; 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project memory = ttface->memory; 6630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project stream = ttface->stream; 6640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sfnt = (SFNT_Service)face->sfnt; 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* for `extended TrueType formats' (i.e. compressed versions) */ 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->extra.finalizer ) 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->extra.finalizer( face->extra.data ); 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( sfnt ) 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sfnt->done_face( face ); 672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* freeing the locations table */ 674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_face_done_loca( face ); 675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_face_free_hdmx( face ); 677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* freeing the CVT */ 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( face->cvt ); 680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->cvt_size = 0; 681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* freeing the programs */ 683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FRAME_RELEASE( face->font_program ); 684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FRAME_RELEASE( face->cvt_program ); 685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->font_program_size = 0; 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->cvt_program_size = 0; 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_done_blend( memory, face->blend ); 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->blend = NULL; 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SIZE FUNCTIONS */ 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_run_fpgm */ 707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Run the font program. */ 710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 712aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* size :: A handle to the size object. */ 713aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 714aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* pedantic :: Set if bytecode execution should be pedantic. */ 715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 720aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner tt_size_run_fpgm( TT_Size size, 721aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Bool pedantic ) 722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)size->root.face; 724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_ExecContext exec; 725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* debugging instances have their own context */ 729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size->debug ) 730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec = size->context; 731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; 733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !exec ) 735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return TT_Err_Could_Not_Find_Context; 736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Load_Context( exec, face, size ); 738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 739aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner exec->callTop = 0; 740aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner exec->top = 0; 741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->period = 64; 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->phase = 0; 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->threshold = 0; 745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->instruction_trap = FALSE; 747aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner exec->F_dot_P = 0x10000L; 748aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 749aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner exec->pedantic_hinting = pedantic; 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Size_Metrics* metrics = &exec->metrics; 753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size_Metrics* tt_metrics = &exec->tt_metrics; 754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_ppem = 0; 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->y_ppem = 0; 758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_scale = 0; 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->y_scale = 0; 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_metrics->ppem = 0; 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_metrics->scale = 0; 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_metrics->ratio = 0x10000L; 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* allow font program execution */ 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Set_CodeRange( exec, 768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_coderange_font, 769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->font_program, 770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->font_program_size ); 771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* disable CVT and glyph programs coderange */ 773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Clear_CodeRange( exec, tt_coderange_cvt ); 774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Clear_CodeRange( exec, tt_coderange_glyph ); 775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->font_program_size > 0 ) 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); 779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 7817f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 7827f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_TRACE4(( "Executing `fpgm' table.\n" )); 7837f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->interpreter( exec ); 7857f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = TT_Err_Ok; 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Save_Context( exec, size ); 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_run_prep */ 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Run the control value program. */ 804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 806aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* size :: A handle to the size object. */ 807aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 808aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* pedantic :: Set if bytecode execution should be pedantic. */ 809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 814aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner tt_size_run_prep( TT_Size size, 815aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Bool pedantic ) 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)size->root.face; 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_ExecContext exec; 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* debugging instances have their own context */ 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size->debug ) 824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec = size->context; 825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; 827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !exec ) 829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return TT_Err_Could_Not_Find_Context; 830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Load_Context( exec, face, size ); 832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->callTop = 0; 834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->top = 0; 835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->instruction_trap = FALSE; 837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 838aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner exec->pedantic_hinting = pedantic; 839aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Set_CodeRange( exec, 841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_coderange_cvt, 842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->cvt_program, 843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->cvt_program_size ); 844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Clear_CodeRange( exec, tt_coderange_glyph ); 846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->cvt_program_size > 0 ) 848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); 850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error && !size->debug ) 8527f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 8537f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_TRACE4(( "Executing `prep' table.\n" )); 8547f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->interpreter( exec ); 8567f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = TT_Err_Ok; 860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* save as default graphics state */ 862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->GS = exec->GS; 863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Save_Context( exec, size ); 865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_done_bytecode( FT_Size ftsize ) 876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size = (TT_Size)ftsize; 878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)ftsize->face; 879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = face->root.memory; 880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size->debug ) 883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the debug context must be deleted by the debugger itself */ 885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->context = NULL; 886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->debug = FALSE; 887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( size->cvt ); 890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_size = 0; 891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* free storage area */ 893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( size->storage ); 894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->storage_size = 0; 895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* twilight zone */ 897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_glyphzone_done( &size->twilight ); 898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( size->function_defs ); 900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( size->instruction_defs ); 901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_function_defs = 0; 903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_function_defs = 0; 904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_instruction_defs = 0; 905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_instruction_defs = 0; 906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_func = 0; 908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_ins = 0; 909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->bytecode_ready = 0; 911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 0; 912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize bytecode-related fields in the size object. */ 916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We do this only if bytecode interpretation is really needed. */ 917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 918aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner tt_size_init_bytecode( FT_Size ftsize, 919aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Bool pedantic ) 920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size = (TT_Size)ftsize; 923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)ftsize->face; 924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = face->root.memory; 925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int i; 926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort n_twilight; 928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_MaxProfile* maxp = &face->max_profile; 929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->bytecode_ready = 1; 932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 0; 933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_function_defs = maxp->maxFunctionDefs; 935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_instruction_defs = maxp->maxInstructionDefs; 936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_function_defs = 0; 938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_instruction_defs = 0; 939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_func = 0; 941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_ins = 0; 942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_size = face->cvt_size; 944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->storage_size = maxp->maxStorage; 945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Set default metrics */ 947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 948295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner TT_Size_Metrics* metrics = &size->ttmetrics; 949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 951295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner metrics->rotated = FALSE; 952295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner metrics->stretched = FALSE; 953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set default compensation (all 0) */ 955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < 4; i++ ) 956295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner metrics->compensations[i] = 0; 957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* allocate function defs, instruction defs, cvt, and storage area */ 960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) || 961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) || 962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( size->cvt, size->cvt_size ) || 963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( size->storage, size->storage_size ) ) 964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reserve twilight zone */ 967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_twilight = maxp->maxTwilightPoints; 968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* there are 4 phantom points (do we need this?) */ 970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_twilight += 4; 971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); 973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.n_points = n_twilight; 977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->GS = tt_default_graphics_state; 979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set `face->interpreter' according to the debug hook present */ 981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = face->root.driver->root.library; 983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->interpreter = (TT_Interpreter) 986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; 987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !face->interpreter ) 988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->interpreter = (TT_Interpreter)TT_RunIns; 989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Fine, now run the font program! */ 992aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner error = tt_size_run_fpgm( size, pedantic ); 993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_done_bytecode( ftsize ); 997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1003aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner tt_size_ready_bytecode( TT_Size size, 1004aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Bool pedantic ) 1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = TT_Err_Ok; 1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !size->bytecode_ready ) 1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1011aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner error = tt_size_init_bytecode( (FT_Size)size, pedantic ); 1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* rescale CVT when needed */ 1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !size->cvt_ready ) 1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 10200a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project TT_Face face = (TT_Face)size->root.face; 1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Scale the cvt values to the new ppem. */ 1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We use by default the y ppem to scale the CVT. */ 1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < size->cvt_size; i++ ) 1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); 1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* all twilight points are originally zero */ 1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ ) 1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.org[i].x = 0; 1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.org[i].y = 0; 1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.cur[i].x = 0; 1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.cur[i].y = 0; 1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* clear storage area */ 1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < (FT_UInt)size->storage_size; i++ ) 1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->storage[i] = 0; 1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->GS = tt_default_graphics_state; 1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1043aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner error = tt_size_run_prep( size, pedantic ); 1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 1; 1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_init */ 1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize a new TrueType size object. */ 1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: A handle to the size object. */ 1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_init( FT_Size ttsize ) /* TT_Size */ 1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size = (TT_Size)ttsize; 1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = TT_Err_Ok; 1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->bytecode_ready = 0; 1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 0; 1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.valid = FALSE; 1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->strike_index = 0xFFFFFFFFUL; 1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_done */ 1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The TrueType size object finalizer. */ 1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: A handle to the target size object. */ 1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_done( FT_Size ttsize ) /* TT_Size */ 1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size = (TT_Size)ttsize; 1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size->bytecode_ready ) 1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_done_bytecode( ttsize ); 1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.valid = FALSE; 1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_reset */ 1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Reset a TrueType size when resolutions and character dimensions */ 1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* have been changed. */ 1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: A handle to the target size object. */ 1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_reset( TT_Size size ) 1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face; 1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = TT_Err_Ok; 1130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Size_Metrics* metrics; 1131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.valid = FALSE; 1134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face = (TT_Face)size->root.face; 1136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics = &size->metrics; 1138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* copy the result from base layer */ 1140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *metrics = size->root.metrics; 1141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) 1143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return TT_Err_Invalid_PPem; 1144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This bit flag, if set, indicates that the ppems must be */ 1146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* rounded to integers. Nearly all TrueType fonts have this bit */ 1147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set, as hinting won't work really well otherwise. */ 1148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->header.Flags & 8 ) 1150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_scale = FT_DivFix( metrics->x_ppem << 6, 1152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->root.units_per_EM ); 1153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->y_scale = FT_DivFix( metrics->y_ppem << 6, 1154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->root.units_per_EM ); 1155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->ascender = 1157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); 1158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->descender = 1159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); 1160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->height = 1161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); 1162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->max_advance = 1163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, 1164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_scale ) ); 1165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute new transformation */ 1168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( metrics->x_ppem >= metrics->y_ppem ) 1169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.scale = metrics->x_scale; 1171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.ppem = metrics->x_ppem; 1172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.x_ratio = 0x10000L; 1173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.y_ratio = FT_MulDiv( metrics->y_ppem, 1174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0x10000L, 1175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_ppem ); 1176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.scale = metrics->y_scale; 1180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.ppem = metrics->y_ppem; 1181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.x_ratio = FT_MulDiv( metrics->x_ppem, 1182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0x10000L, 1183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->y_ppem ); 1184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.y_ratio = 0x10000L; 1185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 0; 1189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 1190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 1192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.valid = TRUE; 1193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_driver_init */ 1202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize a given TrueType driver object. */ 1205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* driver :: A handle to the target driver object. */ 1208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 1211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_driver_init( FT_Module ttdriver ) /* TT_Driver */ 1214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Driver driver = (TT_Driver)ttdriver; 1219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !TT_New_Context( driver ) ) 1222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return TT_Err_Could_Not_Find_Context; 1223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 1225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( ttdriver ); 1227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return TT_Err_Ok; 1231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_driver_done */ 1238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Finalize a given TrueType driver. */ 1241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* driver :: A handle to the target TrueType driver. */ 1244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_driver_done( FT_Module ttdriver ) /* TT_Driver */ 1247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Driver driver = (TT_Driver)ttdriver; 1250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* destroy the execution context */ 1253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( driver->context ) 1254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Done_Context( driver->context ); 1256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project driver->context = NULL; 1257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 1259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( ttdriver ); 1260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_slot_init */ 1269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize a new slot object. */ 1272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 1274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* slot :: A handle to the slot object. */ 1275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 1278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_slot_init( FT_GlyphSlot slot ) 1281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_GlyphLoader_CreateExtra( slot->internal->loader ); 1283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 1287