1 /**************************************************************************** 2 * 3 * cffcmap.c 4 * 5 * CFF character mapping table (cmap) support (body). 6 * 7 * Copyright (C) 2002-2023 by 8 * David Turner, Robert Wilhelm, and Werner Lemberg. 9 * 10 * This file is part of the FreeType project, and may only be used, 11 * modified, and distributed under the terms of the FreeType project 12 * license, LICENSE.TXT. By continuing to use, modify, or distribute 13 * this file you indicate that you have read the license and 14 * understand and accept it fully. 15 * 16 */ 17 18 19 #include <freetype/internal/ftdebug.h> 20 #include "cffcmap.h" 21 #include "cffload.h" 22 23 #include "cfferrs.h" 24 25 26 /*************************************************************************/ 27 /*************************************************************************/ 28 /***** *****/ 29 /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ 30 /***** *****/ 31 /*************************************************************************/ 32 /*************************************************************************/ 33 34 FT_CALLBACK_DEF( FT_Error ) cff_cmap_encoding_init(FT_CMap cmap,FT_Pointer pointer)35 cff_cmap_encoding_init( FT_CMap cmap, 36 FT_Pointer pointer ) 37 { 38 CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; 39 TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); 40 CFF_Font cff = (CFF_Font)face->extra.data; 41 CFF_Encoding encoding = &cff->encoding; 42 43 FT_UNUSED( pointer ); 44 45 46 cffcmap->gids = encoding->codes; 47 48 return 0; 49 } 50 51 52 FT_CALLBACK_DEF( void ) cff_cmap_encoding_done(FT_CMap cmap)53 cff_cmap_encoding_done( FT_CMap cmap ) 54 { 55 CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; 56 57 58 cffcmap->gids = NULL; 59 } 60 61 62 FT_CALLBACK_DEF( FT_UInt ) cff_cmap_encoding_char_index(FT_CMap cmap,FT_UInt32 char_code)63 cff_cmap_encoding_char_index( FT_CMap cmap, 64 FT_UInt32 char_code ) 65 { 66 CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; 67 FT_UInt result = 0; 68 69 70 if ( char_code < 256 ) 71 result = cffcmap->gids[char_code]; 72 73 return result; 74 } 75 76 77 FT_CALLBACK_DEF( FT_UInt ) cff_cmap_encoding_char_next(FT_CMap cmap,FT_UInt32 * pchar_code)78 cff_cmap_encoding_char_next( FT_CMap cmap, 79 FT_UInt32 *pchar_code ) 80 { 81 CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; 82 FT_UInt result = 0; 83 FT_UInt32 char_code = *pchar_code; 84 85 86 while ( char_code < 255 ) 87 { 88 result = cffcmap->gids[++char_code]; 89 if ( result ) 90 { 91 *pchar_code = char_code; 92 break; 93 } 94 } 95 96 return result; 97 } 98 99 100 FT_DEFINE_CMAP_CLASS( 101 cff_cmap_encoding_class_rec, 102 103 sizeof ( CFF_CMapStdRec ), 104 105 (FT_CMap_InitFunc) cff_cmap_encoding_init, /* init */ 106 (FT_CMap_DoneFunc) cff_cmap_encoding_done, /* done */ 107 (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, /* char_index */ 108 (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, /* char_next */ 109 110 (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ 111 (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ 112 (FT_CMap_VariantListFunc) NULL, /* variant_list */ 113 (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ 114 (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ 115 ) 116 117 118 /*************************************************************************/ 119 /*************************************************************************/ 120 /***** *****/ 121 /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ 122 /***** *****/ 123 /*************************************************************************/ 124 /*************************************************************************/ 125 FT_CALLBACK_DEF(const char *)126 FT_CALLBACK_DEF( const char* ) 127 cff_sid_to_glyph_name( void* face_, /* TT_Face */ 128 FT_UInt idx ) 129 { 130 TT_Face face = (TT_Face)face_; 131 CFF_Font cff = (CFF_Font)face->extra.data; 132 CFF_Charset charset = &cff->charset; 133 FT_UInt sid = charset->sids[idx]; 134 135 136 return cff_index_get_sid_string( cff, sid ); 137 } 138 139 140 FT_CALLBACK_DEF( FT_Error ) cff_cmap_unicode_init(FT_CMap cmap,FT_Pointer pointer)141 cff_cmap_unicode_init( FT_CMap cmap, /* PS_Unicodes */ 142 FT_Pointer pointer ) 143 { 144 PS_Unicodes unicodes = (PS_Unicodes)cmap; 145 TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); 146 FT_Memory memory = FT_FACE_MEMORY( face ); 147 CFF_Font cff = (CFF_Font)face->extra.data; 148 CFF_Charset charset = &cff->charset; 149 FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; 150 151 FT_UNUSED( pointer ); 152 153 154 /* can't build Unicode map for CID-keyed font */ 155 /* because we don't know glyph names. */ 156 if ( !charset->sids ) 157 return FT_THROW( No_Unicode_Glyph_Name ); 158 159 if ( !psnames->unicodes_init ) 160 return FT_THROW( Unimplemented_Feature ); 161 162 return psnames->unicodes_init( memory, 163 unicodes, 164 cff->num_glyphs, 165 &cff_sid_to_glyph_name, 166 (PS_FreeGlyphNameFunc)NULL, 167 (FT_Pointer)face ); 168 } 169 170 171 FT_CALLBACK_DEF( void ) cff_cmap_unicode_done(FT_CMap cmap)172 cff_cmap_unicode_done( FT_CMap cmap ) /* PS_Unicodes */ 173 { 174 PS_Unicodes unicodes = (PS_Unicodes)cmap; 175 FT_Face face = FT_CMAP_FACE( cmap ); 176 FT_Memory memory = FT_FACE_MEMORY( face ); 177 178 179 FT_FREE( unicodes->maps ); 180 unicodes->num_maps = 0; 181 } 182 183 184 FT_CALLBACK_DEF( FT_UInt ) cff_cmap_unicode_char_index(FT_CMap cmap,FT_UInt32 char_code)185 cff_cmap_unicode_char_index( FT_CMap cmap, /* PS_Unicodes */ 186 FT_UInt32 char_code ) 187 { 188 PS_Unicodes unicodes = (PS_Unicodes)cmap; 189 TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); 190 CFF_Font cff = (CFF_Font)face->extra.data; 191 FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; 192 193 194 return psnames->unicodes_char_index( unicodes, char_code ); 195 } 196 197 198 FT_CALLBACK_DEF( FT_UInt ) cff_cmap_unicode_char_next(FT_CMap cmap,FT_UInt32 * pchar_code)199 cff_cmap_unicode_char_next( FT_CMap cmap, /* PS_Unicodes */ 200 FT_UInt32 *pchar_code ) 201 { 202 PS_Unicodes unicodes = (PS_Unicodes)cmap; 203 TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); 204 CFF_Font cff = (CFF_Font)face->extra.data; 205 FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; 206 207 208 return psnames->unicodes_char_next( unicodes, pchar_code ); 209 } 210 211 212 FT_DEFINE_CMAP_CLASS( 213 cff_cmap_unicode_class_rec, 214 215 sizeof ( PS_UnicodesRec ), 216 217 (FT_CMap_InitFunc) cff_cmap_unicode_init, /* init */ 218 (FT_CMap_DoneFunc) cff_cmap_unicode_done, /* done */ 219 (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, /* char_index */ 220 (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, /* char_next */ 221 222 (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ 223 (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ 224 (FT_CMap_VariantListFunc) NULL, /* variant_list */ 225 (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ 226 (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ 227 ) 228 229 230 /* END */ 231