1 /****************************************************************************
5 * CFF character mapping table (cmap) support (body).
7 * Copyright (C) 2002-2023 by
8 * David Turner, Robert Wilhelm, and Werner Lemberg.
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.
19 #include <freetype/internal/ftdebug.h>
26 /*************************************************************************/
27 /*************************************************************************/
29 /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/
31 /*************************************************************************/
32 /*************************************************************************/
34 FT_CALLBACK_DEF( FT_Error )
35 cff_cmap_encoding_init( FT_CMap cmap,
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;
46 cffcmap->gids = encoding->codes;
52 FT_CALLBACK_DEF( void )
53 cff_cmap_encoding_done( FT_CMap cmap )
55 CFF_CMapStd cffcmap = (CFF_CMapStd)cmap;
62 FT_CALLBACK_DEF( FT_UInt )
63 cff_cmap_encoding_char_index( FT_CMap cmap,
66 CFF_CMapStd cffcmap = (CFF_CMapStd)cmap;
70 if ( char_code < 256 )
71 result = cffcmap->gids[char_code];
77 FT_CALLBACK_DEF( FT_UInt )
78 cff_cmap_encoding_char_next( FT_CMap cmap,
79 FT_UInt32 *pchar_code )
81 CFF_CMapStd cffcmap = (CFF_CMapStd)cmap;
83 FT_UInt32 char_code = *pchar_code;
86 while ( char_code < 255 )
88 result = cffcmap->gids[++char_code];
91 *pchar_code = char_code;
100 FT_DEFINE_CMAP_CLASS(
101 cff_cmap_encoding_class_rec,
103 sizeof ( CFF_CMapStdRec ),
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 */
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 */
118 /*************************************************************************/
119 /*************************************************************************/
121 /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/
123 /*************************************************************************/
124 /*************************************************************************/
126 FT_CALLBACK_DEF( const char* )
127 cff_sid_to_glyph_name( void* face_, /* TT_Face */
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];
136 return cff_index_get_sid_string( cff, sid );
140 FT_CALLBACK_DEF( FT_Error )
141 cff_cmap_unicode_init( FT_CMap cmap, /* PS_Unicodes */
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;
151 FT_UNUSED( pointer );
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 );
159 if ( !psnames->unicodes_init )
160 return FT_THROW( Unimplemented_Feature );
162 return psnames->unicodes_init( memory,
165 &cff_sid_to_glyph_name,
166 (PS_FreeGlyphNameFunc)NULL,
171 FT_CALLBACK_DEF( void )
172 cff_cmap_unicode_done( FT_CMap cmap ) /* PS_Unicodes */
174 PS_Unicodes unicodes = (PS_Unicodes)cmap;
175 FT_Face face = FT_CMAP_FACE( cmap );
176 FT_Memory memory = FT_FACE_MEMORY( face );
179 FT_FREE( unicodes->maps );
180 unicodes->num_maps = 0;
184 FT_CALLBACK_DEF( FT_UInt )
185 cff_cmap_unicode_char_index( FT_CMap cmap, /* PS_Unicodes */
186 FT_UInt32 char_code )
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;
194 return psnames->unicodes_char_index( unicodes, char_code );
198 FT_CALLBACK_DEF( FT_UInt )
199 cff_cmap_unicode_char_next( FT_CMap cmap, /* PS_Unicodes */
200 FT_UInt32 *pchar_code )
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;
208 return psnames->unicodes_char_next( unicodes, pchar_code );
212 FT_DEFINE_CMAP_CLASS(
213 cff_cmap_unicode_class_rec,
215 sizeof ( PS_UnicodesRec ),
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 */
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 */