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/* */ 7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/* Copyright 1996-2013 */ 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 24a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include FT_TRUETYPE_DRIVER_H 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttgload.h" 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttpload.h" 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "tterrors.h" 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttinterp.h" 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_UNPATENTED_H 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttgxvar.h" 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_ttobjs 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GLYPH ZONE FUNCTIONS */ 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 /* */ 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_glyphzone_done */ 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Deallocate a glyph zone. */ 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* zone :: A pointer to the target glyph zone. */ 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_glyphzone_done( TT_GlyphZone zone ) 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = zone->memory; 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( memory ) 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->contours ); 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->tags ); 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->cur ); 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->org ); 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( zone->orus ); 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->max_points = zone->n_points = 0; 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->max_contours = zone->n_contours = 0; 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->memory = NULL; 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 /* */ 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_glyphzone_new */ 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Allocate a new glyph zone. */ 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* memory :: A handle to the current memory object. */ 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* maxPoints :: The capacity of glyph zone in points. */ 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* maxContours :: The capacity of glyph zone in contours. */ 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Output> */ 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* zone :: A pointer to the target glyph zone record. */ 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_glyphzone_new( FT_Memory memory, 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort maxPoints, 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short maxContours, 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphZone zone ) 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( zone, sizeof ( *zone ) ); 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->memory = memory; 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW_ARRAY( zone->org, maxPoints ) || 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( zone->cur, maxPoints ) || 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( zone->orus, maxPoints ) || 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( zone->tags, maxPoints ) || 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( zone->contours, maxContours ) ) 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_glyphzone_done( zone ); 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->max_points = maxPoints; 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->max_contours = maxContours; 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* Compare the face with a list of well-known `tricky' fonts. */ 1470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* This list shall be expanded as we find more of them. */ 1480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1490a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project static FT_Bool 1508583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner tt_check_trickyness_family( FT_String* name ) 1510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 1528583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 153295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define TRICK_NAMES_MAX_CHARACTERS 16 1548583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner#define TRICK_NAMES_COUNT 8 1558583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 1568583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner static const char trick_names[TRICK_NAMES_COUNT] 1578583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner [TRICK_NAMES_MAX_CHARACTERS + 1] = 1580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 1590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "DFKaiSho-SB", /* dfkaisb.ttf */ 1600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "DFKaiShu", 1610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "DFKai-SB", /* kaiu.ttf */ 1628583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner "HuaTianKaiTi?", /* htkt2.ttf */ 1630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "HuaTianSongTi?", /* htst3.ttf */ 1640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "MingLiU", /* mingliu.ttf & mingliu.ttc */ 1650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "PMingLiU", /* mingliu.ttc */ 1660a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project "MingLi43", /* mingli.ttf */ 1670a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project }; 1680a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1698583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner int nn; 1700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 172295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ ) 1730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( ft_strstr( name, trick_names[nn] ) ) 1740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return TRUE; 1750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return FALSE; 1770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 1780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1790a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1808583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner /* XXX: This function should be in the `sfnt' module. */ 1818583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 1828583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner /* Some PDF generators clear the checksums in the TrueType header table. */ 1838583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF */ 1848583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner /* Printer clears the entries for subsetted subtables. We thus have to */ 1858583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner /* recalculate the checksums where necessary. */ 1868583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 1878583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner static FT_UInt32 1888583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner tt_synth_sfnt_checksum( FT_Stream stream, 1898583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_ULong length ) 1908583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 1918583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_Error error; 1928583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_UInt32 checksum = 0; 1938583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner int i; 1948583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 1958583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 1968583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( FT_FRAME_ENTER( length ) ) 1978583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return 0; 1988583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 1998583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner for ( ; length > 3; length -= 4 ) 2008583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner checksum += (FT_UInt32)FT_GET_ULONG(); 2018583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2028583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner for ( i = 3; length > 0; length --, i-- ) 2038583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) ); 2048583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2058583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_FRAME_EXIT(); 2068583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2078583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return checksum; 2088583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 2098583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2108583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2118583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner /* XXX: This function should be in the `sfnt' module. */ 2128583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2138583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner static FT_ULong 2148583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner tt_get_sfnt_checksum( TT_Face face, 2158583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_UShort i ) 2168583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 217c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#if 0 /* if we believe the written value, use following part. */ 2188583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( face->dir_tables[i].CheckSum ) 2198583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return face->dir_tables[i].CheckSum; 220c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#endif 2218583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 222c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( !face->goto_table ) 2238583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return 0; 2248583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 225c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( face->goto_table( face, 226c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner face->dir_tables[i].Tag, 227c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner face->root.stream, 228c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner NULL ) ) 2298583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return 0; 2308583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2318583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream, 2328583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner face->dir_tables[i].Length ); 2338583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 2348583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2358583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2368583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner typedef struct tt_sfnt_id_rec_ 2378583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 2388583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_ULong CheckSum; 2398583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_ULong Length; 2408583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2418583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } tt_sfnt_id_rec; 2428583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2438583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2448583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner static FT_Bool 2458583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner tt_check_trickyness_sfnt_ids( TT_Face face ) 2468583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 2478583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner#define TRICK_SFNT_IDS_PER_FACE 3 248a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define TRICK_SFNT_IDS_NUM_FACES 17 2498583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2508583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES] 2518583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner [TRICK_SFNT_IDS_PER_FACE] = { 2528583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2538583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner#define TRICK_SFNT_ID_cvt 0 2548583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner#define TRICK_SFNT_ID_fpgm 1 2558583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner#define TRICK_SFNT_ID_prep 2 2568583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 2578583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { /* MingLiU 1995 */ 2588583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x05bcf058, 0x000002e4 }, /* cvt */ 2598583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x28233bf1, 0x000087c4 }, /* fpgm */ 2608583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0xa344a1ea, 0x000001e1 } /* prep */ 2618583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner }, 2628583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { /* MingLiU 1996- */ 2638583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x05bcf058, 0x000002e4 }, /* cvt */ 2648583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x28233bf1, 0x000087c4 }, /* fpgm */ 2658583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0xa344a1eb, 0x000001e1 } /* prep */ 2668583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner }, 2678583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { /* DFKaiShu */ 2688583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x11e5ead4, 0x00000350 }, /* cvt */ 2698583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x5a30ca3b, 0x00009063 }, /* fpgm */ 2708583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x13a42602, 0x0000007e } /* prep */ 2718583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner }, 2728583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { /* HuaTianKaiTi */ 2738583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0xfffbfffc, 0x00000008 }, /* cvt */ 2748583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x9c9e48b8, 0x0000bea2 }, /* fpgm */ 2758583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x70020112, 0x00000008 } /* prep */ 2768583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner }, 2778583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { /* HuaTianSongTi */ 2788583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0xfffbfffc, 0x00000008 }, /* cvt */ 2798583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x0a5a0483, 0x00017c39 }, /* fpgm */ 2808583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 0x70020112, 0x00000008 } /* prep */ 281c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }, 282c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { /* NEC fadpop7.ttf */ 283c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 284c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x40c92555, 0x000000e5 }, /* fpgm */ 285c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0xa39b58e3, 0x0000117c } /* prep */ 286c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }, 287c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { /* NEC fadrei5.ttf */ 288c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 289c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x33c41652, 0x000000e5 }, /* fpgm */ 290c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x26d6c52a, 0x00000f6a } /* prep */ 291c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }, 292c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { /* NEC fangot7.ttf */ 293c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 294c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x6db1651d, 0x0000019d }, /* fpgm */ 295c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x6c6e4b03, 0x00002492 } /* prep */ 296c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }, 297c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { /* NEC fangyo5.ttf */ 298c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 299c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x40c92555, 0x000000e5 }, /* fpgm */ 300c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0xde51fad0, 0x0000117c } /* prep */ 301c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }, 302c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { /* NEC fankyo5.ttf */ 303c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 304c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x85e47664, 0x000000e5 }, /* fpgm */ 305c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0xa6c62831, 0x00001caa } /* prep */ 306c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }, 307c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { /* NEC fanrgo5.ttf */ 308c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 309c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x2d891cfd, 0x0000019d }, /* fpgm */ 310c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0xa0604633, 0x00001de8 } /* prep */ 311c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }, 312c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { /* NEC fangot5.ttc */ 313c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 314c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x40aa774c, 0x000001cb }, /* fpgm */ 315c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x9b5caa96, 0x00001f9a } /* prep */ 316c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }, 317c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { /* NEC fanmin3.ttc */ 318c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x00000000, 0x00000000 }, /* cvt */ 319c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0x0d3de9cb, 0x00000141 }, /* fpgm */ 320c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 0xd4127766, 0x00002280 } /* prep */ 321a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang }, 322a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { /* NEC FA-Gothic, 1996 */ 323a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x00000000, 0x00000000 }, /* cvt */ 324a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x4a692698, 0x000001f0 }, /* fpgm */ 325a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x340d4346, 0x00001fca } /* prep */ 326a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang }, 327a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { /* NEC FA-Minchou, 1996 */ 328a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x00000000, 0x00000000 }, /* cvt */ 329a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0xcd34c604, 0x00000166 }, /* fpgm */ 330a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x6cf31046, 0x000022b0 } /* prep */ 331a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang }, 332a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { /* NEC FA-RoundGothicB, 1996 */ 333a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x00000000, 0x00000000 }, /* cvt */ 334a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x5da75315, 0x0000019d }, /* fpgm */ 335a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x40745a5f, 0x000022e0 } /* prep */ 336a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang }, 337a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { /* NEC FA-RoundGothicM, 1996 */ 338a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x00000000, 0x00000000 }, /* cvt */ 339a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0xf055fc48, 0x000001c2 }, /* fpgm */ 340a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 0x3900ded3, 0x00001e18 } /* prep */ 3418583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 3428583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner }; 3438583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 344c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_ULong checksum; 345c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner int num_matched_ids[TRICK_SFNT_IDS_NUM_FACES]; 346c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Bool has_cvt, has_fpgm, has_prep; 347c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_UShort i; 348c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner int j, k; 3498583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3508583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3518583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_MEM_SET( num_matched_ids, 0, 352e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES ); 353c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner has_cvt = FALSE; 354c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner has_fpgm = FALSE; 355c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner has_prep = FALSE; 3568583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3578583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner for ( i = 0; i < face->num_tables; i++ ) 3588583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 3598583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner checksum = 0; 3608583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3618583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner switch( face->dir_tables[i].Tag ) 3628583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 3638583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner case TTAG_cvt: 3648583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner k = TRICK_SFNT_ID_cvt; 365c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner has_cvt = TRUE; 3668583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner break; 3678583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3688583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner case TTAG_fpgm: 3698583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner k = TRICK_SFNT_ID_fpgm; 370c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner has_fpgm = TRUE; 3718583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner break; 3728583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3738583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner case TTAG_prep: 3748583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner k = TRICK_SFNT_ID_prep; 375c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner has_prep = TRUE; 3768583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner break; 3778583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3788583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner default: 3798583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner continue; 3808583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 3818583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3828583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) 3838583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( face->dir_tables[i].Length == sfnt_id[j][k].Length ) 3848583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 3858583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( !checksum ) 3868583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner checksum = tt_get_sfnt_checksum( face, i ); 3878583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3888583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( sfnt_id[j][k].CheckSum == checksum ) 3898583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner num_matched_ids[j]++; 3908583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 3918583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) 3928583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return TRUE; 3938583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 3948583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 3958583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 396c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) 397c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 398c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( !has_cvt && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length ) 399c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner num_matched_ids[j] ++; 400c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length ) 401c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner num_matched_ids[j] ++; 402c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length ) 403c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner num_matched_ids[j] ++; 404c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) 405c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return TRUE; 406c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } 407c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 4088583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return FALSE; 4098583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 4108583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 4118583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 4128583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner static FT_Bool 4138583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner tt_check_trickyness( FT_Face face ) 4148583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 4158583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( !face ) 4168583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return FALSE; 4178583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 418c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* For first, check the face name for quick check. */ 419c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( face->family_name && 420c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner tt_check_trickyness_family( face->family_name ) ) 421c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return TRUE; 4228583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 4238583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner /* Type42 fonts may lack `name' tables, we thus try to identify */ 4248583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner /* tricky fonts by checking the checksums of Type42-persistent */ 4258583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner /* sfnt tables (`cvt', `fpgm', and `prep'). */ 4268583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) ) 4278583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return TRUE; 4288583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 4298583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return FALSE; 4308583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 4318583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 4328583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 433c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* Check whether `.notdef' is the only glyph in the `loca' table. */ 434c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner static FT_Bool 435c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner tt_check_single_notdef( FT_Face ttface ) 436c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 437c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Bool result = FALSE; 438c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 439c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner TT_Face face = (TT_Face)ttface; 440c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_UInt asize; 441c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_ULong i; 442c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_ULong glyph_index = 0; 443c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_UInt count = 0; 444c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 445c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 446c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner for( i = 0; i < face->num_locations; i++ ) 447c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 448c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner tt_face_get_location( face, i, &asize ); 449c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( asize > 0 ) 450c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 451c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner count += 1; 452c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( count > 1 ) 453c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner break; 454c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner glyph_index = i; 455c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } 456c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } 457c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 458c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* Only have a single outline. */ 459c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( count == 1 ) 460c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 461c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( glyph_index == 0 ) 462c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner result = TRUE; 463c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner else 464c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 465c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* FIXME: Need to test glyphname == .notdef ? */ 466c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Error error; 467c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner char buf[8]; 468c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 469c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 470c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 ); 471c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( !error && 472c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) ) 473c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner result = TRUE; 474c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } 475c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } 476c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 477c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return result; 478c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } 479c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 480c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_face_init */ 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize a given TrueType face object. */ 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* stream :: The source font stream. */ 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* face_index :: The index of the font face in the resource. */ 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* num_params :: Number of additional generic parameters. Ignored. */ 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* params :: Additional generic parameters. Ignored. */ 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* face :: The newly built face object. */ 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_face_init( FT_Stream stream, 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Face ttface, /* TT_Face */ 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int face_index, 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int num_params, 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Parameter* params ) 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library; 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SFNT_Service sfnt; 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)ttface; 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 517e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang FT_TRACE2(( "TTF driver\n" )); 518e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang 5190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project library = ttface->driver->root.library; 520e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang 521e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !sfnt ) 523e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang { 524e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" )); 525a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang error = FT_THROW( Missing_Module ); 526e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang goto Exit; 527e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang } 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create input stream from resource */ 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SEEK( 0 ) ) 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check that we have a valid TrueType file */ 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = sfnt->init_face( stream, face, face_index, num_params, params ); 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We must also be able to accept Mac/GX fonts, as well as OT ones. */ 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The 0x00020000 tag is completely undocumented; some fonts from */ 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Arphic made for Chinese Windows 3.1 have this. */ 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->format_tag != 0x00010000L && /* MS fonts */ 542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */ 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->format_tag != TTAG_true ) /* Mac fonts */ 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 545e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang FT_TRACE2(( " not a TTF font\n" )); 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad_Format; 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 5500a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project ttface->face_flags |= FT_FACE_FLAG_HINTER; 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* If we are performing a simple font format check, exit immediately. */ 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face_index < 0 ) 555a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_Err_Ok; 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Load font directory */ 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = sfnt->load_face( stream, face, face_index, num_params, params ); 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5628583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( tt_check_trickyness( ttface ) ) 5630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project ttface->face_flags |= FT_FACE_FLAG_TRICKY; 5640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_hdmx( face, stream ); 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5690a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( FT_IS_SCALABLE( ttface ) ) 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_INCREMENTAL 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( !ttface->internal->incremental_interface ) 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_loca( face, stream ); 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_cvt( face, stream ); 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_fpgm( face, stream ); 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_prep( face, stream ); 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 583c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* Check the scalable flag based on `loca'. */ 584c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( !ttface->internal->incremental_interface && 585c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner ttface->num_fixed_sizes && 586c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner face->glyph_locations && 587c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner tt_check_single_notdef( ttface ) ) 588c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 589c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_TRACE5(( "tt_face_init:" 590c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner " Only the `.notdef' glyph has an outline.\n" 591c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner " " 592c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner " Resetting scalable flag to FALSE.\n" )); 593c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 594c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; 595c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } 596c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_loca( face, stream ); 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_cvt( face, stream ); 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_fpgm( face, stream ); 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_face_load_prep( face, stream ); 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 608c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* Check the scalable flag based on `loca'. */ 609c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if ( ttface->num_fixed_sizes && 610c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner face->glyph_locations && 611c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner tt_check_single_notdef( ttface ) ) 612c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 613c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_TRACE5(( "tt_face_init:" 614c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner " Only the `.notdef' glyph has an outline.\n" 615c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner " " 616c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner " Resetting scalable flag to FALSE.\n" )); 617c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 618c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; 619c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } 620c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER ) 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool unpatented_hinting; 630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int i; 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Determine whether unpatented hinting is to be used for this face. */ 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unpatented_hinting = FT_BOOL 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL ); 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < num_params && !face->unpatented_hinting; i++ ) 638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING ) 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unpatented_hinting = TRUE; 640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !unpatented_hinting ) 6420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project ttface->internal->ignore_unpatented_hinter = TRUE; 643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING && 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* initialize standard glyph loading routines */ 649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Init_Glyph_Loading( face ); 650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Bad_Format: 655a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang error = FT_THROW( Unknown_File_Format ); 656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_face_done */ 664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Finalize a given face object. */ 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* face :: A pointer to the face object to destroy. */ 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_face_done( FT_Face ttface ) /* TT_Face */ 673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project TT_Face face = (TT_Face)ttface; 6750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Memory memory; 6760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Stream stream; 6770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project SFNT_Service sfnt; 6780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6800a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( !face ) 6810a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return; 682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6830a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project memory = ttface->memory; 6840a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project stream = ttface->stream; 6850a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sfnt = (SFNT_Service)face->sfnt; 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* for `extended TrueType formats' (i.e. compressed versions) */ 688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->extra.finalizer ) 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->extra.finalizer( face->extra.data ); 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( sfnt ) 692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sfnt->done_face( face ); 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* freeing the locations table */ 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_face_done_loca( face ); 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_face_free_hdmx( face ); 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* freeing the CVT */ 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( face->cvt ); 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->cvt_size = 0; 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* freeing the programs */ 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FRAME_RELEASE( face->font_program ); 705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FRAME_RELEASE( face->cvt_program ); 706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->font_program_size = 0; 707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->cvt_program_size = 0; 708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_done_blend( memory, face->blend ); 711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->blend = NULL; 712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SIZE FUNCTIONS */ 719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_run_fpgm */ 728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Run the font program. */ 731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 733c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* size :: A handle to the size object. */ 734c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* */ 735c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* pedantic :: Set if bytecode execution should be pedantic. */ 736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 741c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner tt_size_run_fpgm( TT_Size size, 742c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Bool pedantic ) 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)size->root.face; 745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_ExecContext exec; 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* debugging instances have their own context */ 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size->debug ) 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec = size->context; 752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; 754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !exec ) 756a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Could_Not_Find_Context ); 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Load_Context( exec, face, size ); 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 760c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner exec->callTop = 0; 761c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner exec->top = 0; 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->period = 64; 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->phase = 0; 765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->threshold = 0; 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->instruction_trap = FALSE; 768a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->F_dot_P = 0x4000L; 769c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 770c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner exec->pedantic_hinting = pedantic; 771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Size_Metrics* metrics = &exec->metrics; 774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size_Metrics* tt_metrics = &exec->tt_metrics; 775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_ppem = 0; 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->y_ppem = 0; 779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_scale = 0; 780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->y_scale = 0; 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_metrics->ppem = 0; 783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_metrics->scale = 0; 784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_metrics->ratio = 0x10000L; 785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* allow font program execution */ 788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Set_CodeRange( exec, 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_coderange_font, 790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->font_program, 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->font_program_size ); 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* disable CVT and glyph programs coderange */ 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Clear_CodeRange( exec, tt_coderange_cvt ); 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Clear_CodeRange( exec, tt_coderange_glyph ); 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->font_program_size > 0 ) 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 8028583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 8038583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_TRACE4(( "Executing `fpgm' table.\n" )); 8048583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->interpreter( exec ); 8068583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 809a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang error = FT_Err_Ok; 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Save_Context( exec, size ); 813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_run_prep */ 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Run the control value program. */ 825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 827c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* size :: A handle to the size object. */ 828c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* */ 829c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* pedantic :: Set if bytecode execution should be pedantic. */ 830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 835c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner tt_size_run_prep( TT_Size size, 836c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Bool pedantic ) 837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)size->root.face; 839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_ExecContext exec; 840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* debugging instances have their own context */ 844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size->debug ) 845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec = size->context; 846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; 848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !exec ) 850a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Could_Not_Find_Context ); 851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Load_Context( exec, face, size ); 853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->callTop = 0; 855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->top = 0; 856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->instruction_trap = FALSE; 858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 859c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner exec->pedantic_hinting = pedantic; 860c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Set_CodeRange( exec, 862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_coderange_cvt, 863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->cvt_program, 864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->cvt_program_size ); 865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Clear_CodeRange( exec, tt_coderange_glyph ); 867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->cvt_program_size > 0 ) 869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); 871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error && !size->debug ) 8738583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 8748583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_TRACE4(( "Executing `prep' table.\n" )); 8758583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->interpreter( exec ); 8778583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 880a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang error = FT_Err_Ok; 881a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 882a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang /* UNDOCUMENTED! The MS rasterizer doesn't allow the following */ 883a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang /* graphics state variables to be modified by the CVT program. */ 884a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 885a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.dualVector.x = 0x4000; 886a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.dualVector.y = 0; 887a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.projVector.x = 0x4000; 888a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.projVector.y = 0x0; 889a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.freeVector.x = 0x4000; 890a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.freeVector.y = 0x0; 891a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 892a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.rp0 = 0; 893a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.rp1 = 0; 894a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.rp2 = 0; 895a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 896a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.gep0 = 1; 897a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.gep1 = 1; 898a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.gep2 = 1; 899a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 900a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang exec->GS.loop = 1; 901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* save as default graphics state */ 903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->GS = exec->GS; 904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Save_Context( exec, size ); 906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_done_bytecode( FT_Size ftsize ) 917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size = (TT_Size)ftsize; 919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)ftsize->face; 920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = face->root.memory; 921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size->debug ) 924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the debug context must be deleted by the debugger itself */ 926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->context = NULL; 927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->debug = FALSE; 928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( size->cvt ); 931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_size = 0; 932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* free storage area */ 934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( size->storage ); 935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->storage_size = 0; 936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* twilight zone */ 938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_glyphzone_done( &size->twilight ); 939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( size->function_defs ); 941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( size->instruction_defs ); 942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_function_defs = 0; 944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_function_defs = 0; 945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_instruction_defs = 0; 946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_instruction_defs = 0; 947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_func = 0; 949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_ins = 0; 950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->bytecode_ready = 0; 952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 0; 953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize bytecode-related fields in the size object. */ 957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We do this only if bytecode interpretation is really needed. */ 958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 959c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner tt_size_init_bytecode( FT_Size ftsize, 960c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Bool pedantic ) 961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size = (TT_Size)ftsize; 964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)ftsize->face; 965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = face->root.memory; 966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int i; 967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort n_twilight; 969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_MaxProfile* maxp = &face->max_profile; 970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->bytecode_ready = 1; 973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 0; 974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_function_defs = maxp->maxFunctionDefs; 976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_instruction_defs = maxp->maxInstructionDefs; 977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_function_defs = 0; 979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_instruction_defs = 0; 980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_func = 0; 982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_ins = 0; 983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_size = face->cvt_size; 985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->storage_size = maxp->maxStorage; 986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Set default metrics */ 988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 989295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner TT_Size_Metrics* metrics = &size->ttmetrics; 990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 992295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner metrics->rotated = FALSE; 993295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner metrics->stretched = FALSE; 994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set default compensation (all 0) */ 996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < 4; i++ ) 997295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner metrics->compensations[i] = 0; 998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* allocate function defs, instruction defs, cvt, and storage area */ 1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) || 1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) || 1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( size->cvt, size->cvt_size ) || 1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_NEW_ARRAY( size->storage, size->storage_size ) ) 1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reserve twilight zone */ 1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_twilight = maxp->maxTwilightPoints; 1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* there are 4 phantom points (do we need this?) */ 1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n_twilight += 4; 1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); 1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.n_points = n_twilight; 1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->GS = tt_default_graphics_state; 1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set `face->interpreter' according to the debug hook present */ 1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = face->root.driver->root.library; 1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->interpreter = (TT_Interpreter) 1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; 1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !face->interpreter ) 1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->interpreter = (TT_Interpreter)TT_RunIns; 1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Fine, now run the font program! */ 1033c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner error = tt_size_run_fpgm( size, pedantic ); 1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_done_bytecode( ftsize ); 1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1044c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner tt_size_ready_bytecode( TT_Size size, 1045c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Bool pedantic ) 1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1047a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_Error error = FT_Err_Ok; 1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !size->bytecode_ready ) 1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1052c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner error = tt_size_init_bytecode( (FT_Size)size, pedantic ); 1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* rescale CVT when needed */ 1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !size->cvt_ready ) 1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 10610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project TT_Face face = (TT_Face)size->root.face; 1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Scale the cvt values to the new ppem. */ 1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We use by default the y ppem to scale the CVT. */ 1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < size->cvt_size; i++ ) 1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); 1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* all twilight points are originally zero */ 1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ ) 1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.org[i].x = 0; 1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.org[i].y = 0; 1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.cur[i].x = 0; 1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->twilight.cur[i].y = 0; 1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* clear storage area */ 1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < (FT_UInt)size->storage_size; i++ ) 1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->storage[i] = 0; 1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->GS = tt_default_graphics_state; 1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1084c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner error = tt_size_run_prep( size, pedantic ); 1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 1; 1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_init */ 1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize a new TrueType size object. */ 1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: A handle to the size object. */ 1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_init( FT_Size ttsize ) /* TT_Size */ 1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size = (TT_Size)ttsize; 1114a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_Error error = FT_Err_Ok; 1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->bytecode_ready = 0; 1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 0; 1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.valid = FALSE; 1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->strike_index = 0xFFFFFFFFUL; 1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_done */ 1132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The TrueType size object finalizer. */ 1135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: A handle to the target size object. */ 1138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_done( FT_Size ttsize ) /* TT_Size */ 1141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size = (TT_Size)ttsize; 1143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size->bytecode_ready ) 1147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_done_bytecode( ttsize ); 1148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.valid = FALSE; 1151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_size_reset */ 1158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Reset a TrueType size when resolutions and character dimensions */ 1161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* have been changed. */ 1162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: A handle to the target size object. */ 1165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_size_reset( TT_Size size ) 1168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face; 1170a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_Error error = FT_Err_Ok; 1171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Size_Metrics* metrics; 1172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.valid = FALSE; 1175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face = (TT_Face)size->root.face; 1177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics = &size->metrics; 1179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* copy the result from base layer */ 1181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *metrics = size->root.metrics; 1182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) 1184a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Invalid_PPem ); 1185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This bit flag, if set, indicates that the ppems must be */ 1187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* rounded to integers. Nearly all TrueType fonts have this bit */ 1188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set, as hinting won't work really well otherwise. */ 1189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->header.Flags & 8 ) 1191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_scale = FT_DivFix( metrics->x_ppem << 6, 1193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->root.units_per_EM ); 1194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->y_scale = FT_DivFix( metrics->y_ppem << 6, 1195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->root.units_per_EM ); 1196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->ascender = 1198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); 1199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->descender = 1200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); 1201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->height = 1202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); 1203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->max_advance = 1204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, 1205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_scale ) ); 1206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute new transformation */ 1209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( metrics->x_ppem >= metrics->y_ppem ) 1210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.scale = metrics->x_scale; 1212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.ppem = metrics->x_ppem; 1213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.x_ratio = 0x10000L; 1214a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem, 1215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->x_ppem ); 1216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.scale = metrics->y_scale; 1220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.ppem = metrics->y_ppem; 1221a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang size->ttmetrics.x_ratio = FT_DivFix( metrics->x_ppem, 1222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project metrics->y_ppem ); 1223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.y_ratio = 0x10000L; 1224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->cvt_ready = 0; 1228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 1229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 1231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->ttmetrics.valid = TRUE; 1232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_driver_init */ 1241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize a given TrueType driver object. */ 1244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* driver :: A handle to the target driver object. */ 1247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 1250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_driver_init( FT_Module ttdriver ) /* TT_Driver */ 1253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Driver driver = (TT_Driver)ttdriver; 1258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !TT_New_Context( driver ) ) 1261a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Could_Not_Find_Context ); 1262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1263a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 1264a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang driver->interpreter_version = TT_INTERPRETER_VERSION_38; 1265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 1266a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang driver->interpreter_version = TT_INTERPRETER_VERSION_35; 1267a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif 1268a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 1269a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#else /* !TT_USE_BYTECODE_INTERPRETER */ 1270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( ttdriver ); 1272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1273a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif /* !TT_USE_BYTECODE_INTERPRETER */ 1274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1275a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_Err_Ok; 1276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_driver_done */ 1283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Finalize a given TrueType driver. */ 1286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* driver :: A handle to the target TrueType driver. */ 1289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_driver_done( FT_Module ttdriver ) /* TT_Driver */ 1292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 1294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Driver driver = (TT_Driver)ttdriver; 1295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* destroy the execution context */ 1298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( driver->context ) 1299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Done_Context( driver->context ); 1301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project driver->context = NULL; 1302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 1304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( ttdriver ); 1305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* tt_slot_init */ 1314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initialize a new slot object. */ 1317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 1319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* slot :: A handle to the slot object. */ 1320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 1323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tt_slot_init( FT_GlyphSlot slot ) 1326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_GlyphLoader_CreateExtra( slot->internal->loader ); 1328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 1332