1 /***************************************************************************/
5 /* CFF character mapping table (cmap) support (body). */
7 /* Copyright 2002, 2003, 2004, 2005, 2006, 2007 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 /***************************************************************************/
25 /*************************************************************************/
26 /*************************************************************************/
28 /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/
30 /*************************************************************************/
31 /*************************************************************************/
33 FT_CALLBACK_DEF( FT_Error
)
34 cff_cmap_encoding_init( CFF_CMapStd cmap
)
36 TT_Face face
= (TT_Face
)FT_CMAP_FACE( cmap
);
37 CFF_Font cff
= (CFF_Font
)face
->extra
.data
;
38 CFF_Encoding encoding
= &cff
->encoding
;
41 cmap
->gids
= encoding
->codes
;
47 FT_CALLBACK_DEF( void )
48 cff_cmap_encoding_done( CFF_CMapStd cmap
)
54 FT_CALLBACK_DEF( FT_UInt
)
55 cff_cmap_encoding_char_index( CFF_CMapStd cmap
,
61 if ( char_code
< 256 )
62 result
= cmap
->gids
[char_code
];
68 FT_CALLBACK_DEF( FT_UInt32
)
69 cff_cmap_encoding_char_next( CFF_CMapStd cmap
,
70 FT_UInt32
*pchar_code
)
73 FT_UInt32 char_code
= *pchar_code
;
78 if ( char_code
< 255 )
80 FT_UInt code
= (FT_UInt
)(char_code
+ 1);
88 result
= cmap
->gids
[code
];
102 FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec
,
103 sizeof ( CFF_CMapStdRec
),
105 (FT_CMap_InitFunc
) cff_cmap_encoding_init
,
106 (FT_CMap_DoneFunc
) cff_cmap_encoding_done
,
107 (FT_CMap_CharIndexFunc
)cff_cmap_encoding_char_index
,
108 (FT_CMap_CharNextFunc
) cff_cmap_encoding_char_next
,
110 NULL
, NULL
, NULL
, NULL
, NULL
114 /*************************************************************************/
115 /*************************************************************************/
117 /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/
119 /*************************************************************************/
120 /*************************************************************************/
122 FT_CALLBACK_DEF( const char* )
123 cff_sid_to_glyph_name( TT_Face face
,
126 CFF_Font cff
= (CFF_Font
)face
->extra
.data
;
127 CFF_Charset charset
= &cff
->charset
;
128 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)cff
->psnames
;
129 FT_UInt sid
= charset
->sids
[idx
];
132 return cff_index_get_sid_string( &cff
->string_index
, sid
, psnames
);
136 FT_CALLBACK_DEF( void )
137 cff_sid_free_glyph_name( TT_Face face
,
140 FT_Memory memory
= FT_FACE_MEMORY( face
);
147 FT_CALLBACK_DEF( FT_Error
)
148 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
;
157 /* can't build Unicode map for CID-keyed font */
158 if ( !charset
->sids
)
159 return CFF_Err_Invalid_Argument
;
161 return psnames
->unicodes_init( memory
,
164 (PS_GetGlyphNameFunc
)&cff_sid_to_glyph_name
,
165 (PS_FreeGlyphNameFunc
)&cff_sid_free_glyph_name
,
170 FT_CALLBACK_DEF( void )
171 cff_cmap_unicode_done( PS_Unicodes unicodes
)
173 FT_Face face
= FT_CMAP_FACE( unicodes
);
174 FT_Memory memory
= FT_FACE_MEMORY( face
);
177 FT_FREE( unicodes
->maps
);
178 unicodes
->num_maps
= 0;
182 FT_CALLBACK_DEF( FT_UInt
)
183 cff_cmap_unicode_char_index( PS_Unicodes unicodes
,
184 FT_UInt32 char_code
)
186 TT_Face face
= (TT_Face
)FT_CMAP_FACE( unicodes
);
187 CFF_Font cff
= (CFF_Font
)face
->extra
.data
;
188 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)cff
->psnames
;
191 return psnames
->unicodes_char_index( unicodes
, char_code
);
195 FT_CALLBACK_DEF( FT_UInt32
)
196 cff_cmap_unicode_char_next( PS_Unicodes unicodes
,
197 FT_UInt32
*pchar_code
)
199 TT_Face face
= (TT_Face
)FT_CMAP_FACE( unicodes
);
200 CFF_Font cff
= (CFF_Font
)face
->extra
.data
;
201 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)cff
->psnames
;
204 return psnames
->unicodes_char_next( unicodes
, pchar_code
);
208 FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec
,
209 sizeof ( PS_UnicodesRec
),
211 (FT_CMap_InitFunc
) cff_cmap_unicode_init
,
212 (FT_CMap_DoneFunc
) cff_cmap_unicode_done
,
213 (FT_CMap_CharIndexFunc
)cff_cmap_unicode_char_index
,
214 (FT_CMap_CharNextFunc
) cff_cmap_unicode_char_next
,
216 NULL
, NULL
, NULL
, NULL
, NULL