1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* t1cmap.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Type 1 character map support (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 2002, 2003, 2006, 2007, 2012 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 "t1cmap.h" 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftdebug.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "psauxerr.h" 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_std_init( T1_CMapStd cmap, 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int is_expert ) 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->num_glyphs = face->type1.num_glyphs; 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->glyph_names = (const char* const*)face->type1.glyph_names; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->sid_to_string = psnames->adobe_std_strings; 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : psnames->adobe_std_encoding; 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSERT( cmap->code_to_sid != NULL ); 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( void ) 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_std_done( T1_CMapStd cmap ) 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->num_glyphs = 0; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->glyph_names = NULL; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->sid_to_string = NULL; 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->code_to_sid = NULL; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt ) 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_std_char_index( T1_CMapStd cmap, 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 char_code ) 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt result = 0; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( char_code < 256 ) 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt code, n; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* glyph_name; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* convert character code to Adobe SID string */ 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code = cmap->code_to_sid[char_code]; 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov glyph_name = cmap->sid_to_string( code ); 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* look for the corresponding glyph name */ 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( n = 0; n < cmap->num_glyphs; n++ ) 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* gname = cmap->glyph_names[n]; 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( gname && gname[0] == glyph_name[0] && 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_strcmp( gname, glyph_name ) == 0 ) 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result = n; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt32 ) 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_std_char_next( T1_CMapStd cmap, 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 *pchar_code ) 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt result = 0; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 char_code = *pchar_code + 1; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while ( char_code < 256 ) 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result = t1_cmap_std_char_index( cmap, char_code ); 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( result != 0 ) 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char_code++; 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char_code = 0; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Exit: 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pchar_code = char_code; 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Error ) 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_standard_init( T1_CMapStd cmap ) 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_std_init( cmap, 0 ); 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_standard_class_rec = 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( T1_CMapStdRec ), 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_InitFunc) t1_cmap_standard_init, 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_DoneFunc) t1_cmap_std_done, 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharNextFunc) t1_cmap_std_char_next, 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, NULL, NULL, NULL 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Error ) 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_expert_init( T1_CMapStd cmap ) 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_std_init( cmap, 1 ); 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_expert_class_rec = 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( T1_CMapStdRec ), 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_InitFunc) t1_cmap_expert_init, 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_DoneFunc) t1_cmap_std_done, 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharNextFunc) t1_cmap_std_char_next, 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, NULL, NULL, NULL 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** TYPE1 CUSTOM ENCODING CMAP *****/ 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Error ) 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_custom_init( T1_CMapCustom cmap ) 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Encoding encoding = &face->type1.encoding; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->first = encoding->code_first; 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->count = (FT_UInt)( encoding->code_last - cmap->first ); 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->indices = encoding->char_index; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSERT( cmap->indices != NULL ); 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSERT( encoding->code_first <= encoding->code_last ); 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( void ) 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_custom_done( T1_CMapCustom cmap ) 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->indices = NULL; 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->first = 0; 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->count = 0; 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt ) 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_custom_char_index( T1_CMapCustom cmap, 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 char_code ) 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt result = 0; 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ( char_code >= cmap->first ) && 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( char_code < ( cmap->first + cmap->count ) ) ) 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result = cmap->indices[char_code]; 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt32 ) 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_custom_char_next( T1_CMapCustom cmap, 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 *pchar_code ) 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt result = 0; 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 char_code = *pchar_code; 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++char_code; 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( char_code < cmap->first ) 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char_code = cmap->first; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( ; char_code < ( cmap->first + cmap->count ); char_code++ ) 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result = cmap->indices[char_code]; 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( result != 0 ) 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char_code = 0; 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Exit: 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pchar_code = char_code; 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_custom_class_rec = 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( T1_CMapCustomRec ), 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_InitFunc) t1_cmap_custom_init, 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_DoneFunc) t1_cmap_custom_done, 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, NULL, NULL, NULL 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( const char * ) 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov psaux_get_glyph_name( T1_Face face, 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt idx ) 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return face->type1.glyph_names[idx]; 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Error ) 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_unicode_init( PS_Unicodes unicodes ) 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory = FT_FACE_MEMORY( face ); 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return psnames->unicodes_init( memory, 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unicodes, 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->type1.num_glyphs, 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetGlyphNameFunc)&psaux_get_glyph_name, 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_FreeGlyphNameFunc)NULL, 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Pointer)face ); 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( void ) 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_unicode_done( PS_Unicodes unicodes ) 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Face face = FT_CMAP_FACE( unicodes ); 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory = FT_FACE_MEMORY( face ); 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( unicodes->maps ); 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unicodes->num_maps = 0; 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt ) 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_unicode_char_index( PS_Unicodes unicodes, 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 char_code ) 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return psnames->unicodes_char_index( unicodes, char_code ); 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt32 ) 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_unicode_char_next( PS_Unicodes unicodes, 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 *pchar_code ) 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return psnames->unicodes_char_next( unicodes, pchar_code ); 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t1_cmap_unicode_class_rec = 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( PS_UnicodesRec ), 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_InitFunc) t1_cmap_unicode_init, 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_DoneFunc) t1_cmap_unicode_done, 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, NULL, NULL, NULL 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 342