sfdriver.c revision ee451cb395940862dad63c85adfe8f2fd55e864c
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* sfdriver.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* High-level SFNT driver interface (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 1996-2007, 2009-2013 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 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h" 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftdebug.h" 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/sfnt.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftobjs.h" 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sfdriver.h" 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttload.h" 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sfobjs.h" 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sfntpic.h" 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sferrors.h" 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttsbit.h" 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttpost.h" 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_BDF 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttbdf.h" 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svbdf.h" 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttcmap.h" 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttkern.h" 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttmtx.h" 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svgldict.h" 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svpostnm.h" 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svsfnt.h" 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svttcmap.h" 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_sfdriver 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * SFNT TABLE SERVICE 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void* 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov get_sfnt_table( TT_Face face, 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Sfnt_Tag tag ) 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* table; 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch ( tag ) 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case ft_sfnt_head: 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table = &face->header; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case ft_sfnt_hhea: 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table = &face->horizontal; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case ft_sfnt_vhea: 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table = face->vertical_info ? &face->vertical : 0; 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case ft_sfnt_os2: 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table = face->os2.version == 0xFFFFU ? 0 : &face->os2; 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case ft_sfnt_post: 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table = &face->postscript; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case ft_sfnt_maxp: 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table = &face->max_profile; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case ft_sfnt_pclt: 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table = face->pclt.Version ? &face->pclt : 0; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table = 0; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return table; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_table_info( TT_Face face, 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt idx, 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong *tag, 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong *offset, 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong *length ) 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !offset || !length ) 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Argument ); 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !tag ) 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *length = face->num_tables; 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx >= face->num_tables ) 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Table_Missing ); 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *tag = face->dir_tables[idx].Tag; 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *offset = face->dir_tables[idx].Offset; 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *length = face->dir_tables[idx].Length; 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_SFNT_TABLEREC( 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_service_sfnt_table, 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_SFNT_TableLoadFunc)tt_face_load_any, 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_SFNT_TableGetFunc) get_sfnt_table, 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_SFNT_TableInfoFunc)sfnt_table_info ) 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * GLYPH DICT SERVICE 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_get_glyph_name( TT_Face face, 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt glyph_index, 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Pointer buffer, 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt buffer_max ) 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_String* gname; 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = tt_face_get_ps_name( face, glyph_index, &gname ); 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_STRCPYN( buffer, gname, buffer_max ); 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_UInt 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_get_name_index( TT_Face face, 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_String* glyph_name ) 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Face root = &face->root; 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt i, max_gid = FT_UINT_MAX; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( root->num_glyphs < 0 ) 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX ) 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov max_gid = (FT_UInt)root->num_glyphs; 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n", 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UINT_MAX, root->num_glyphs )); 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < max_gid; i++ ) 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_String* gname; 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = tt_face_get_ps_name( face, i, &gname ); 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !ft_strcmp( glyph_name, gname ) ) 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return i; 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_GLYPHDICTREC( 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_service_glyph_dict, 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index ) 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSTSCRIPT NAME SERVICE 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const char* 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_get_ps_name( TT_Face face ) 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int n, found_win, found_apple; 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* result = NULL; 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* shouldn't happen, but just in case to avoid memory leaks */ 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face->postscript_name ) 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return face->postscript_name; 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* scan the name table to see whether we have a Postscript name here, */ 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* either in Macintosh or Windows platform encodings */ 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov found_win = -1; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov found_apple = -1; 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( n = 0; n < face->num_names; n++ ) 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_NameEntryRec* name = face->name_table.names + n; 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( name->nameID == 6 && name->stringLength > 0 ) 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( name->platformID == 3 && 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name->encodingID == 1 && 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name->languageID == 0x409 ) 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov found_win = n; 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( name->platformID == 1 && 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name->encodingID == 0 && 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name->languageID == 0 ) 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov found_apple = n; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( found_win != -1 ) 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory = face->root.memory; 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_NameEntryRec* name = face->name_table.names + found_win; 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt len = name->stringLength / 2; 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( error ); 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !FT_ALLOC( result, name->stringLength + 1 ) ) 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream = face->name_table.stream; 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_String* r = (FT_String*)result; 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* p = (FT_Byte*)name->string; 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_STREAM_SEEK( name->stringOffset ) || 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_ENTER( name->stringLength ) ) 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( result ); 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name->stringLength = 0; 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name->stringOffset = 0; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( name->string ); 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = (FT_Byte*)stream->cursor; 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( ; len > 0; len--, p += 2 ) 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 ) 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *r++ = p[1]; 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *r = '\0'; 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_EXIT(); 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( found_apple != -1 ) 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory = face->root.memory; 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_NameEntryRec* name = face->name_table.names + found_apple; 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt len = name->stringLength; 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( error ); 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !FT_ALLOC( result, len + 1 ) ) 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream = face->name_table.stream; 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_STREAM_SEEK( name->stringOffset ) || 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_STREAM_READ( result, len ) ) 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name->stringOffset = 0; 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name->stringLength = 0; 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( name->string ); 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( result ); 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((char*)result)[len] = '\0'; 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Exit: 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->postscript_name = result; 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_PSFONTNAMEREC( 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_service_ps_name, 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_PsName_GetFunc)sfnt_get_ps_name ) 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * TT CMAP INFO 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_TTCMAPSREC( 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_service_get_cmap_info, 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (TT_CMap_Info_GetFunc)tt_get_cmap_info ) 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_BDF 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_get_charset_id( TT_Face face, 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* *acharset_encoding, 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* *acharset_registry ) 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov BDF_PropertyRec encoding, registry; 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* XXX: I don't know whether this is correct, since 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * tt_face_find_bdf_prop only returns something correct if we have 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * previously selected a size that is listed in the BDF table. 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Should we change the BDF table format to include single offsets 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding ); 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( registry.type == BDF_PROPERTY_TYPE_ATOM && 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov encoding.type == BDF_PROPERTY_TYPE_ATOM ) 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *acharset_encoding = encoding.u.atom; 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *acharset_registry = registry.u.atom; 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Invalid_Argument ); 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_BDFRec( 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_service_bdf, 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id, 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop ) 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_BDF */ 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * SERVICE LIST 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICEDESCREC5( 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_services, 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET, 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET, 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICEDESCREC4( 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_services, 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET, 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined TT_CONFIG_OPTION_BDF 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICEDESCREC4( 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_services, 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET, 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICEDESCREC3( 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_services, 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Module_Interface ) 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_get_interface( FT_Module module, 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* module_interface ) 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* SFNT_SERVICES_GET derefers `library' in PIC mode */ 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_PIC 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Library library; 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !module ) 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov library = module->library; 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !library ) 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( module ); 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface ); 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PUT_EMBEDDED_BITMAPS( a ) a 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PUT_EMBEDDED_BITMAPS( a ) NULL 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PUT_PS_NAMES( a ) a 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PUT_PS_NAMES( a ) NULL 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SFNT_INTERFACE( 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_interface, 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_goto_table, 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_init_face, 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_load_face, 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_done_face, 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_get_interface, 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_any, 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_head, 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_hhea, 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_cmap, 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_maxp, 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_os2, 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_post, 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_name, 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_free_name, 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_kern, 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_gasp, 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_pclt, 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* see `ttload.h' */ 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ), 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ), 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* see `ttpost.h' */ 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PUT_PS_NAMES( tt_face_get_ps_name ), 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PUT_PS_NAMES( tt_face_free_ps_names ), 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* since version 2.1.8 */ 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_get_kerning, 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* since version 2.2 */ 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_font_dir, 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_hmtx, 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* see `ttsbit.h' and `sfnt.h' */ 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PUT_EMBEDDED_BITMAPS( tt_face_load_eblc ), 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PUT_EMBEDDED_BITMAPS( tt_face_free_eblc ), 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike ), 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ), 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_get_metrics 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_MODULE( 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt_module_class, 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* not a font driver or renderer */ 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( FT_ModuleRec ), 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "sfnt", /* driver name */ 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x10000L, /* driver version 1.0 */ 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x20000L, /* driver requires FreeType 2.0 or higher */ 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (const void*)&SFNT_INTERFACE_GET, /* module specific interface */ 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Module_Constructor)0, 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Module_Destructor) 0, 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Module_Requester) sfnt_get_interface ) 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 530