1 /***************************************************************************/
5 /* CFF character mapping table (cmap) support (body). */
7 /* Copyright 2002-2016 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. */
16 /***************************************************************************/
20 #include FT_INTERNAL_DEBUG_H
27 /*************************************************************************/
28 /*************************************************************************/
30 /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/
32 /*************************************************************************/
33 /*************************************************************************/
35 FT_CALLBACK_DEF( FT_Error
)
36 cff_cmap_encoding_init( 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 cmap
->gids
= encoding
->codes
;
52 FT_CALLBACK_DEF( void )
53 cff_cmap_encoding_done( CFF_CMapStd cmap
)
59 FT_CALLBACK_DEF( FT_UInt
)
60 cff_cmap_encoding_char_index( CFF_CMapStd cmap
,
66 if ( char_code
< 256 )
67 result
= cmap
->gids
[char_code
];
73 FT_CALLBACK_DEF( FT_UInt32
)
74 cff_cmap_encoding_char_next( CFF_CMapStd cmap
,
75 FT_UInt32
*pchar_code
)
78 FT_UInt32 char_code
= *pchar_code
;
83 if ( char_code
< 255 )
85 FT_UInt code
= (FT_UInt
)(char_code
+ 1);
93 result
= cmap
->gids
[code
];
107 FT_DEFINE_CMAP_CLASS(
108 cff_cmap_encoding_class_rec
,
110 sizeof ( CFF_CMapStdRec
),
112 (FT_CMap_InitFunc
) cff_cmap_encoding_init
, /* init */
113 (FT_CMap_DoneFunc
) cff_cmap_encoding_done
, /* done */
114 (FT_CMap_CharIndexFunc
)cff_cmap_encoding_char_index
, /* char_index */
115 (FT_CMap_CharNextFunc
) cff_cmap_encoding_char_next
, /* char_next */
117 (FT_CMap_CharVarIndexFunc
) NULL
, /* char_var_index */
118 (FT_CMap_CharVarIsDefaultFunc
)NULL
, /* char_var_default */
119 (FT_CMap_VariantListFunc
) NULL
, /* variant_list */
120 (FT_CMap_CharVariantListFunc
) NULL
, /* charvariant_list */
121 (FT_CMap_VariantCharListFunc
) NULL
/* variantchar_list */
125 /*************************************************************************/
126 /*************************************************************************/
128 /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/
130 /*************************************************************************/
131 /*************************************************************************/
133 FT_CALLBACK_DEF( const char* )
134 cff_sid_to_glyph_name( TT_Face face
,
137 CFF_Font cff
= (CFF_Font
)face
->extra
.data
;
138 CFF_Charset charset
= &cff
->charset
;
139 FT_UInt sid
= charset
->sids
[idx
];
142 return cff_index_get_sid_string( cff
, sid
);
146 FT_CALLBACK_DEF( FT_Error
)
147 cff_cmap_unicode_init( PS_Unicodes unicodes
,
150 TT_Face face
= (TT_Face
)FT_CMAP_FACE( unicodes
);
151 FT_Memory memory
= FT_FACE_MEMORY( face
);
152 CFF_Font cff
= (CFF_Font
)face
->extra
.data
;
153 CFF_Charset charset
= &cff
->charset
;
154 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)cff
->psnames
;
156 FT_UNUSED( pointer
);
159 /* can't build Unicode map for CID-keyed font */
160 /* because we don't know glyph names. */
161 if ( !charset
->sids
)
162 return FT_THROW( No_Unicode_Glyph_Name
);
164 return psnames
->unicodes_init( memory
,
167 (PS_GetGlyphNameFunc
)&cff_sid_to_glyph_name
,
168 (PS_FreeGlyphNameFunc
)NULL
,
173 FT_CALLBACK_DEF( void )
174 cff_cmap_unicode_done( PS_Unicodes unicodes
)
176 FT_Face face
= FT_CMAP_FACE( unicodes
);
177 FT_Memory memory
= FT_FACE_MEMORY( face
);
180 FT_FREE( unicodes
->maps
);
181 unicodes
->num_maps
= 0;
185 FT_CALLBACK_DEF( FT_UInt
)
186 cff_cmap_unicode_char_index( PS_Unicodes unicodes
,
187 FT_UInt32 char_code
)
189 TT_Face face
= (TT_Face
)FT_CMAP_FACE( unicodes
);
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_UInt32
)
199 cff_cmap_unicode_char_next( PS_Unicodes unicodes
,
200 FT_UInt32
*pchar_code
)
202 TT_Face face
= (TT_Face
)FT_CMAP_FACE( unicodes
);
203 CFF_Font cff
= (CFF_Font
)face
->extra
.data
;
204 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)cff
->psnames
;
207 return psnames
->unicodes_char_next( unicodes
, pchar_code
);
211 FT_DEFINE_CMAP_CLASS(
212 cff_cmap_unicode_class_rec
,
214 sizeof ( PS_UnicodesRec
),
216 (FT_CMap_InitFunc
) cff_cmap_unicode_init
, /* init */
217 (FT_CMap_DoneFunc
) cff_cmap_unicode_done
, /* done */
218 (FT_CMap_CharIndexFunc
)cff_cmap_unicode_char_index
, /* char_index */
219 (FT_CMap_CharNextFunc
) cff_cmap_unicode_char_next
, /* char_next */
221 (FT_CMap_CharVarIndexFunc
) NULL
, /* char_var_index */
222 (FT_CMap_CharVarIsDefaultFunc
)NULL
, /* char_var_default */
223 (FT_CMap_VariantListFunc
) NULL
, /* variant_list */
224 (FT_CMap_CharVariantListFunc
) NULL
, /* charvariant_list */
225 (FT_CMap_VariantCharListFunc
) NULL
/* variantchar_list */