1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ttdriver.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* TrueType font driver implementation (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* Copyright 1996-2015 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h> 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_DEBUG_H 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_STREAM_H 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_SFNT_H 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include FT_SERVICE_FONT_FORMAT_H 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_MULTIPLE_MASTERS_H 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_MULTIPLE_MASTERS_H 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_TRUETYPE_ENGINE_H 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_TRUETYPE_GLYF_H 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_PROPERTIES_H 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_TRUETYPE_DRIVER_H 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttdriver.h" 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttgload.h" 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttpload.h" 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttgxvar.h" 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "tterrors.h" 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttpic.h" 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_ttdriver 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * PROPERTY SERVICE 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_property_set( FT_Module module, /* TT_Driver */ 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* property_name, 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const void* value ) 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Driver driver = (TT_Driver)module; 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !ft_strcmp( property_name, "interpreter-version" ) ) 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt* interpreter_version = (FT_UInt*)value; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef TT_CONFIG_OPTION_SUBPIXEL_HINTING 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( *interpreter_version != TT_INTERPRETER_VERSION_35 ) 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_ERR( Unimplemented_Feature ); 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov driver->interpreter_version = *interpreter_version; 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE0(( "tt_property_set: missing property `%s'\n", 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov property_name )); 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Missing_Property ); 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_property_get( FT_Module module, /* TT_Driver */ 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* property_name, 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const void* value ) 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Driver driver = (TT_Driver)module; 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt interpreter_version = driver->interpreter_version; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !ft_strcmp( property_name, "interpreter-version" ) ) 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt* val = (FT_UInt*)value; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *val = interpreter_version; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE0(( "tt_property_get: missing property `%s'\n", 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov property_name )); 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Missing_Property ); 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_PROPERTIESREC( 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_service_properties, 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Properties_SetFunc)tt_property_set, 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Properties_GetFunc)tt_property_get ) 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** F A C E S ****/ 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* tt_get_kerning */ 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A driver method used to return the kerning vector between two */ 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* glyphs of the same face. */ 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face :: A handle to the source face object. */ 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* left_glyph :: The index of the left glyph in the kern pair. */ 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* right_glyph :: The index of the right glyph in the kern pair. */ 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Output> */ 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* kerning :: The kerning vector. This is in font units for */ 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* scalable formats, and in pixels for fixed-sizes */ 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* formats. */ 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Note> */ 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Only horizontal layouts (left-to-right & right-to-left) are */ 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* supported by this function. Other layouts, or more sophisticated */ 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* kernings, are out of scope of this method (the basic driver */ 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* interface is meant to be simple). */ 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* They can be implemented by format-specific interfaces. */ 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_get_kerning( FT_Face ttface, /* TT_Face */ 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt left_glyph, 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt right_glyph, 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Vector* kerning ) 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Face face = (TT_Face)ttface; 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SFNT_Service sfnt = (SFNT_Service)face->sfnt; 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kerning->x = 0; 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kerning->y = 0; 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( sfnt ) 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_get_advances( FT_Face ttface, 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt start, 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt count, 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 flags, 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Fixed *advances ) 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt nn; 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Face face = (TT_Face) ttface; 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* XXX: TODO: check for sbits */ 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( flags & FT_LOAD_VERTICAL_LAYOUT ) 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( nn = 0; nn < count; nn++ ) 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Short tsb; 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UShort ah; 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* since we don't need `tsb', we use zero for `yMax' parameter */ 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov TT_Get_VMetrics( face, start + nn, 0, &tsb, &ah ); 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov advances[nn] = ah; 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( nn = 0; nn < count; nn++ ) 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Short lsb; 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UShort aw; 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Get_HMetrics( face, start + nn, &lsb, &aw ); 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov advances[nn] = aw; 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** S I Z E S ****/ 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_size_select( FT_Size size, 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong strike_index ) 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Face ttface = (TT_Face)size->face; 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Size ttsize = (TT_Size)size; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ttsize->strike_index = strike_index; 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_IS_SCALABLE( size->face ) ) 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* use the scaled metrics, even when tt_size_reset fails */ 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Select_Metrics( size->face, strike_index ); 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov tt_size_reset( ttsize ); /* ignore return value */ 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Size_Metrics* metrics = &size->metrics; 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = sfnt->load_strike_metrics( ttface, strike_index, metrics ); 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ttsize->strike_index = 0xFFFFFFFFUL; 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_size_request( FT_Size size, 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Size_Request req ) 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Size ttsize = (TT_Size)size; 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_HAS_FIXED_SIZES( size->face ) ) 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Face ttface = (TT_Face)size->face; 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong strike_index; 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = sfnt->set_sbit_strike( ttface, req, &strike_index ); 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ttsize->strike_index = 0xFFFFFFFFUL; 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return tt_size_select( size, strike_index ); 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Request_Metrics( size->face, req ); 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_IS_SCALABLE( size->face ) ) 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = tt_size_reset( ttsize ); 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ttsize->root.metrics = ttsize->metrics; 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* tt_glyph_load */ 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A driver method used to load a glyph within a given glyph slot. */ 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* slot :: A handle to the target slot object where the glyph */ 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* will be loaded. */ 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* size :: A handle to the source face size at which the glyph */ 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* must be scaled, loaded, etc. */ 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* glyph_index :: The index of the glyph in the font file. */ 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* load_flags :: A flag indicating what to load for this glyph. The */ 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_LOAD_XXX constants can be used to control the */ 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* glyph loading process (e.g., whether the outline */ 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* should be scaled, whether to load bitmaps or not, */ 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* whether to hint the outline, etc). */ 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_glyph_load( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Size ttsize, /* TT_Size */ 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt glyph_index, 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 load_flags ) 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Size size = (TT_Size)ttsize; 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Face face = ttslot->face; 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !slot ) 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Slot_Handle ); 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !size ) 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Size_Handle ); 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !face ) 365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FT_THROW( Invalid_Face_Handle ); 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_INCREMENTAL 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( glyph_index >= (FT_UInt)face->num_glyphs && 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !face->internal->incremental_interface ) 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( glyph_index >= (FT_UInt)face->num_glyphs ) 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Argument ); 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( load_flags & FT_LOAD_NO_HINTING ) 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */ 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* are necessary to disable hinting for tricky fonts */ 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_IS_TRICKY( face ) ) 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov load_flags &= ~FT_LOAD_NO_HINTING; 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( load_flags & FT_LOAD_NO_AUTOHINT ) 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov load_flags |= FT_LOAD_NO_HINTING; 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) ) 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE; 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !FT_IS_TRICKY( face ) ) 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov load_flags |= FT_LOAD_NO_HINTING; 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* now load the glyph outline if necessary */ 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* force drop-out mode to 2 - irrelevant now */ 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* slot->outline.dropout_mode = 2; */ 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** D R I V E R I N T E R F A C E ****/ 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_MULTIMASTERSREC( 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_service_gx_multi_masters, 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Get_MM_Func) NULL, 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Set_MM_Design_Func) NULL, 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Get_MM_Var_Func) TT_Get_MM_Var, 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Set_Var_Design_Func)TT_Set_Var_Design ) 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine = 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_USE_BYTECODE_INTERPRETER 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRUETYPE_ENGINE_TYPE_UNPATENTED 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRUETYPE_ENGINE_TYPE_PATENTED 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else /* !TT_USE_BYTECODE_INTERPRETER */ 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRUETYPE_ENGINE_TYPE_NONE 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_USE_BYTECODE_INTERPRETER */ 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_TTGLYFREC( 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_service_truetype_glyf, 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (TT_Glyf_GetLocationFunc)tt_face_get_location ) 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICEDESCREC5( 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_services, 451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_MULTI_MASTERS, &TT_SERVICE_GX_MULTI_MASTERS_GET, 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET, 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET ) 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICEDESCREC4( 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_services, 459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET, 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET ) 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Module_Interface ) 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_get_interface( FT_Module driver, /* TT_Driver */ 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* tt_interface ) 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Library library; 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Module_Interface result; 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Module sfntd; 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SFNT_Service sfnt; 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* TT_SERVICES_GET dereferences `library' in PIC mode */ 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_PIC 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !driver ) 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov library = driver->library; 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !library ) 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface ); 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( result != NULL ) 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CONFIG_OPTION_PIC 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !driver ) 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov library = driver->library; 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !library ) 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* only return the default interface from the SFNT module */ 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfntd = FT_Get_Module( library, "sfnt" ); 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( sfntd ) 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( sfnt ) 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return sfnt->get_interface( driver, tt_interface ); 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The FT_DriverInterface structure is defined in ftdriver.h. */ 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_USE_BYTECODE_INTERPRETER 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TT_HINTER_FLAG 0 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TT_SIZE_SELECT tt_size_select 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TT_SIZE_SELECT 0 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_DRIVER( 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_driver_class, 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_FONT_DRIVER | 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_DRIVER_SCALABLE | 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_HINTER_FLAG, 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( TT_DriverRec ), 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "truetype", /* driver name */ 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x10000L, /* driver version == 1.0 */ 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x20000L, /* driver requires FreeType 2.0 or above */ 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void*)0, /* driver specific interface */ 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_driver_init, 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_driver_done, 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_get_interface, 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( TT_FaceRec ), 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( TT_SizeRec ), 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( FT_GlyphSlotRec ), 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_init, 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_done, 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_size_init, 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_size_done, 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_slot_init, 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* FT_Slot_DoneFunc */ 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_glyph_load, 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_get_kerning, 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* FT_Face_AttachFunc */ 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_get_advances, 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_size_request, 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_SIZE_SELECT 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 566