1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* t1driver.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Type 1 driver interface (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> 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1driver.h" 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1gload.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1load.h" 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1errors.h" 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1afm.h" 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_DEBUG_H 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_STREAM_H 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_MULTIPLE_MASTERS_H 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_GLYPH_DICT_H 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include FT_SERVICE_FONT_FORMAT_H 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_NAME_H 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_CMAPS_H 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_INFO_H 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_KERNING_H 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_t1driver 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * GLYPH DICT SERVICE 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_get_glyph_name( T1_Face face, 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt glyph_index, 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Pointer buffer, 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt buffer_max ) 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max ); 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_UInt 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_get_name_index( T1_Face face, 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_String* glyph_name ) 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < face->type1.num_glyphs; i++ ) 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_String* gname = face->type1.glyph_names[i]; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !ft_strcmp( glyph_name, gname ) ) 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (FT_UInt)i; 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Service_GlyphDictRec t1_service_glyph_dict = 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_GlyphDict_GetNameFunc) t1_get_glyph_name, 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_GlyphDict_NameIndexFunc)t1_get_name_index 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSTSCRIPT NAME SERVICE 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const char* 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_get_ps_name( T1_Face face ) 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (const char*) face->type1.font_name; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Service_PsFontNameRec t1_service_ps_name = 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_PsName_GetFunc)t1_get_ps_name 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * MULTIPLE MASTERS SERVICE 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Service_MultiMastersRec t1_service_multi_masters = 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Get_MM_Func) T1_Get_Multi_Master, 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Set_MM_Design_Func) T1_Set_MM_Design, 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Set_MM_Blend_Func) T1_Set_MM_Blend, 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Get_MM_Var_Func) T1_Get_MM_Var, 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Set_Var_Design_Func)T1_Set_Var_Design 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSTSCRIPT INFO SERVICE 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_ps_get_font_info( FT_Face face, 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontInfoRec* afont_info ) 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *afont_info = ((T1_Face)face)->type1.font_info; 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_ps_get_font_extra( FT_Face face, 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontExtraRec* afont_extra ) 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *afont_extra = ((T1_Face)face)->type1.font_extra; 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Int 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_ps_has_glyph_names( FT_Face face ) 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( face ); 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_ps_get_font_private( FT_Face face, 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_PrivateRec* afont_private ) 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *afont_private = ((T1_Face)face)->type1.private_dict; 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Long 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_ps_get_font_value( FT_Face face, 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_Dict_Keys key, 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt idx, 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void *value, 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_Long value_len_ ) 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_ULong retval = 0; /* always >= 1 if valid */ 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_ULong value_len = value_len_ < 0 ? 0 : (FT_ULong)value_len_; 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face t1face = (T1_Face)face; 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Font type1 = &t1face->type1; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch ( key ) 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FONT_TYPE: 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->font_type ); 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Byte *)value) = type1->font_type; 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FONT_MATRIX: 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < sizeof ( type1->font_matrix ) / 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( type1->font_matrix.xx ) ) 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Fixed val = 0; 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( val ); 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch ( idx ) 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val = type1->font_matrix.xx; 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val = type1->font_matrix.xy; 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val = type1->font_matrix.yx; 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 3: 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val = type1->font_matrix.yy; 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Fixed *)value) = val; 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FONT_BBOX: 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < sizeof ( type1->font_bbox ) / 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( type1->font_bbox.xMin ) ) 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_Fixed val = 0; 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( val ); 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch ( idx ) 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 0: 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val = type1->font_bbox.xMin; 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val = type1->font_bbox.yMin; 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val = type1->font_bbox.xMax; 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 3: 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val = type1->font_bbox.yMax; 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Fixed *)value) = val; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_PAINT_TYPE: 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->paint_type ); 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Byte *)value) = type1->paint_type; 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FONT_NAME: 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = ft_strlen( type1->font_name ) + 1; 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->font_name ), retval ); 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_UNIQUE_ID: 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.unique_id ); 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Int *)value) = type1->private_dict.unique_id; 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_NUM_CHAR_STRINGS: 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->num_glyphs ); 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Int *)value) = type1->num_glyphs; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_CHAR_STRING_KEY: 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < (FT_UInt)type1->num_glyphs ) 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = ft_strlen( type1->glyph_names[idx] ) + 1; 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval ); 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_CHAR_STRING: 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < (FT_UInt)type1->num_glyphs ) 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = type1->charstrings_len[idx] + 1; 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->charstrings[idx] ), 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval - 1 ); 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_ENCODING_TYPE: 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->encoding_type ); 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((T1_EncodingType *)value) = type1->encoding_type; 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_ENCODING_ENTRY: 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY && 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov idx < (FT_UInt)type1->encoding.num_chars ) 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = ft_strlen( type1->encoding.char_name[idx] ) + 1; 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ), 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval - 1 ); 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_NUM_SUBRS: 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->num_subrs ); 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Int *)value) = type1->num_subrs; 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_SUBR: 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < (FT_UInt)type1->num_subrs ) 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = type1->subrs_len[idx] + 1; 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 ); 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_STD_HW: 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.standard_width[0] ); 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_UShort *)value) = type1->private_dict.standard_width[0]; 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_STD_VW: 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.standard_height[0] ); 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_UShort *)value) = type1->private_dict.standard_height[0]; 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_NUM_BLUE_VALUES: 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.num_blue_values ); 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Byte *)value) = type1->private_dict.num_blue_values; 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_BLUE_VALUE: 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < type1->private_dict.num_blue_values ) 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.blue_values[idx] ); 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Short *)value) = type1->private_dict.blue_values[idx]; 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_BLUE_SCALE: 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.blue_scale ); 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Fixed *)value) = type1->private_dict.blue_scale; 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_BLUE_FUZZ: 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.blue_fuzz ); 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Int *)value) = type1->private_dict.blue_fuzz; 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_BLUE_SHIFT: 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.blue_shift ); 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Int *)value) = type1->private_dict.blue_shift; 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_NUM_OTHER_BLUES: 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.num_other_blues ); 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Byte *)value) = type1->private_dict.num_other_blues; 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_OTHER_BLUE: 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < type1->private_dict.num_other_blues ) 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.other_blues[idx] ); 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Short *)value) = type1->private_dict.other_blues[idx]; 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_NUM_FAMILY_BLUES: 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.num_family_blues ); 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Byte *)value) = type1->private_dict.num_family_blues; 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FAMILY_BLUE: 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < type1->private_dict.num_family_blues ) 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.family_blues[idx] ); 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Short *)value) = type1->private_dict.family_blues[idx]; 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_NUM_FAMILY_OTHER_BLUES: 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.num_family_other_blues ); 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Byte *)value) = type1->private_dict.num_family_other_blues; 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FAMILY_OTHER_BLUE: 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < type1->private_dict.num_family_other_blues ) 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.family_other_blues[idx] ); 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Short *)value) = type1->private_dict.family_other_blues[idx]; 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_NUM_STEM_SNAP_H: 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.num_snap_widths ); 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Byte *)value) = type1->private_dict.num_snap_widths; 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_STEM_SNAP_H: 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < type1->private_dict.num_snap_widths ) 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.snap_widths[idx] ); 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Short *)value) = type1->private_dict.snap_widths[idx]; 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_NUM_STEM_SNAP_V: 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.num_snap_heights ); 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Byte *)value) = type1->private_dict.num_snap_heights; 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_STEM_SNAP_V: 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < type1->private_dict.num_snap_heights ) 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.snap_heights[idx] ); 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Short *)value) = type1->private_dict.snap_heights[idx]; 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_RND_STEM_UP: 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.round_stem_up ); 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Bool *)value) = type1->private_dict.round_stem_up; 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FORCE_BOLD: 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.force_bold ); 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Bool *)value) = type1->private_dict.force_bold; 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_MIN_FEATURE: 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( idx < sizeof ( type1->private_dict.min_feature ) / 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( type1->private_dict.min_feature[0] ) ) 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.min_feature[idx] ); 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Short *)value) = type1->private_dict.min_feature[idx]; 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_LEN_IV: 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.lenIV ); 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Int *)value) = type1->private_dict.lenIV; 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_PASSWORD: 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.password ); 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Long *)value) = type1->private_dict.password; 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_LANGUAGE_GROUP: 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->private_dict.language_group ); 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Long *)value) = type1->private_dict.language_group; 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_IS_FIXED_PITCH: 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->font_info.is_fixed_pitch ); 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Bool *)value) = type1->font_info.is_fixed_pitch; 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_UNDERLINE_POSITION: 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->font_info.underline_position ); 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Short *)value) = type1->font_info.underline_position; 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_UNDERLINE_THICKNESS: 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->font_info.underline_thickness ); 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_UShort *)value) = type1->font_info.underline_thickness; 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FS_TYPE: 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->font_extra.fs_type ); 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_UShort *)value) = type1->font_extra.fs_type; 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_VERSION: 528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = ft_strlen( type1->font_info.version ) + 1; 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->font_info.version ), retval ); 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_NOTICE: 534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = ft_strlen( type1->font_info.notice ) + 1; 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->font_info.notice ), retval ); 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FULL_NAME: 540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = ft_strlen( type1->font_info.full_name ) + 1; 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->font_info.full_name ), retval ); 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_FAMILY_NAME: 546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = ft_strlen( type1->font_info.family_name ) + 1; 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->font_info.family_name ), retval ); 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_WEIGHT: 552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann retval = ft_strlen( type1->font_info.weight ) + 1; 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_memcpy( value, (void *)( type1->font_info.weight ), retval ); 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case PS_DICT_ITALIC_ANGLE: 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov retval = sizeof ( type1->font_info.italic_angle ); 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( value && value_len >= retval ) 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *((FT_Long *)value) = type1->font_info.italic_angle; 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return retval == 0 ? -1 : (FT_Long)retval; 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Service_PsInfoRec t1_service_ps_info = 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontInfoFunc) t1_ps_get_font_info, 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontExtraFunc) t1_ps_get_font_extra, 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names, 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontPrivateFunc)t1_ps_get_font_private, 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontValueFunc) t1_ps_get_font_value, 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Service_KerningRec t1_service_kerning = 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Get_Track_Kerning, 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * SERVICE LIST 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_ServiceDescRec t1_services[] = 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name }, 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict }, 595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TYPE_1 }, 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info }, 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { FT_SERVICE_ID_KERNING, &t1_service_kerning }, 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters }, 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { NULL, NULL } 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Module_Interface ) 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Get_Interface( FT_Module module, 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const FT_String* t1_interface ) 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( module ); 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ft_service_list_lookup( t1_services, t1_interface ); 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Get_Kerning */ 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A driver method used to return the kerning vector between two */ 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* glyphs of the same face. */ 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face :: A handle to the source face object. */ 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* left_glyph :: The index of the left glyph in the kern pair. */ 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* right_glyph :: The index of the right glyph in the kern pair. */ 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Output> */ 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* kerning :: The kerning vector. This is in font units for */ 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* scalable formats, and in pixels for fixed-sizes */ 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* formats. */ 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Note> */ 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Only horizontal layouts (left-to-right & right-to-left) are */ 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* supported by this function. Other layouts, or more sophisticated */ 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* kernings are out of scope of this method (the basic driver */ 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* interface is meant to be simple). */ 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* They can be implemented by format-specific interfaces. */ 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Get_Kerning( FT_Face t1face, /* T1_Face */ 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt left_glyph, 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt right_glyph, 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Vector* kerning ) 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)t1face; 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kerning->x = 0; 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kerning->y = 0; 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face->afm_data ) 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Get_Kerning( (AFM_FontInfo)face->afm_data, 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov left_glyph, 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov right_glyph, 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kerning ); 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* T1_CONFIG_OPTION_NO_AFM */ 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_TABLE_DEF 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const FT_Driver_ClassRec t1_driver_class = 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_FONT_DRIVER | 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_DRIVER_SCALABLE | 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_DRIVER_HAS_HINTER, 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( FT_DriverRec ), 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "type1", 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x10000L, 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x20000L, 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* format interface */ 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Driver_Init, 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Driver_Done, 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Get_Interface, 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }, 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( T1_FaceRec ), 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( T1_SizeRec ), 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( T1_GlyphSlotRec ), 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face_Init, 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face_Done, 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size_Init, 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size_Done, 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_GlyphSlot_Init, 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_GlyphSlot_Done, 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Load_Glyph, 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef T1_CONFIG_OPTION_NO_AFM 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* FT_Face_GetKerningFunc */ 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* FT_Face_AttachFunc */ 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Get_Kerning, 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Read_Metrics, 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Get_Advances, 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size_Request, 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0 /* FT_Size_SelectFunc */ 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 726