1 /***************************************************************************/
5 /* Type 1 character map support (body). */
7 /* Copyright 2002, 2003, 2006 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 /***************************************************************************/
21 #include FT_INTERNAL_DEBUG_H
26 /*************************************************************************/
27 /*************************************************************************/
29 /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/
31 /*************************************************************************/
32 /*************************************************************************/
35 t1_cmap_std_init( T1_CMapStd cmap
,
38 T1_Face face
= (T1_Face
)FT_CMAP_FACE( cmap
);
39 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
42 cmap
->num_glyphs
= face
->type1
.num_glyphs
;
43 cmap
->glyph_names
= (const char* const*)face
->type1
.glyph_names
;
44 cmap
->sid_to_string
= psnames
->adobe_std_strings
;
45 cmap
->code_to_sid
= is_expert
? psnames
->adobe_expert_encoding
46 : psnames
->adobe_std_encoding
;
48 FT_ASSERT( cmap
->code_to_sid
!= NULL
);
52 FT_CALLBACK_DEF( void )
53 t1_cmap_std_done( T1_CMapStd cmap
)
56 cmap
->glyph_names
= NULL
;
57 cmap
->sid_to_string
= NULL
;
58 cmap
->code_to_sid
= NULL
;
62 FT_CALLBACK_DEF( FT_UInt
)
63 t1_cmap_std_char_index( T1_CMapStd cmap
,
69 if ( char_code
< 256 )
72 const char* glyph_name
;
75 /* convert character code to Adobe SID string */
76 code
= cmap
->code_to_sid
[char_code
];
77 glyph_name
= cmap
->sid_to_string( code
);
79 /* look for the corresponding glyph name */
80 for ( n
= 0; n
< cmap
->num_glyphs
; n
++ )
82 const char* gname
= cmap
->glyph_names
[n
];
85 if ( gname
&& gname
[0] == glyph_name
[0] &&
86 ft_strcmp( gname
, glyph_name
) == 0 )
98 FT_CALLBACK_DEF( FT_UInt
)
99 t1_cmap_std_char_next( T1_CMapStd cmap
,
100 FT_UInt32
*pchar_code
)
103 FT_UInt32 char_code
= *pchar_code
+ 1;
106 while ( char_code
< 256 )
108 result
= t1_cmap_std_char_index( cmap
, char_code
);
117 *pchar_code
= char_code
;
122 FT_CALLBACK_DEF( FT_Error
)
123 t1_cmap_standard_init( T1_CMapStd cmap
)
125 t1_cmap_std_init( cmap
, 0 );
130 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
131 t1_cmap_standard_class_rec
=
133 sizeof ( T1_CMapStdRec
),
135 (FT_CMap_InitFunc
) t1_cmap_standard_init
,
136 (FT_CMap_DoneFunc
) t1_cmap_std_done
,
137 (FT_CMap_CharIndexFunc
)t1_cmap_std_char_index
,
138 (FT_CMap_CharNextFunc
) t1_cmap_std_char_next
142 FT_CALLBACK_DEF( FT_Error
)
143 t1_cmap_expert_init( T1_CMapStd cmap
)
145 t1_cmap_std_init( cmap
, 1 );
149 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
150 t1_cmap_expert_class_rec
=
152 sizeof ( T1_CMapStdRec
),
154 (FT_CMap_InitFunc
) t1_cmap_expert_init
,
155 (FT_CMap_DoneFunc
) t1_cmap_std_done
,
156 (FT_CMap_CharIndexFunc
)t1_cmap_std_char_index
,
157 (FT_CMap_CharNextFunc
) t1_cmap_std_char_next
161 /*************************************************************************/
162 /*************************************************************************/
164 /***** TYPE1 CUSTOM ENCODING CMAP *****/
166 /*************************************************************************/
167 /*************************************************************************/
170 FT_CALLBACK_DEF( FT_Error
)
171 t1_cmap_custom_init( T1_CMapCustom cmap
)
173 T1_Face face
= (T1_Face
)FT_CMAP_FACE( cmap
);
174 T1_Encoding encoding
= &face
->type1
.encoding
;
177 cmap
->first
= encoding
->code_first
;
178 cmap
->count
= (FT_UInt
)( encoding
->code_last
- cmap
->first
+ 1 );
179 cmap
->indices
= encoding
->char_index
;
181 FT_ASSERT( cmap
->indices
!= NULL
);
182 FT_ASSERT( encoding
->code_first
<= encoding
->code_last
);
188 FT_CALLBACK_DEF( void )
189 t1_cmap_custom_done( T1_CMapCustom cmap
)
191 cmap
->indices
= NULL
;
197 FT_CALLBACK_DEF( FT_UInt
)
198 t1_cmap_custom_char_index( T1_CMapCustom cmap
,
199 FT_UInt32 char_code
)
204 if ( ( char_code
>= cmap
->first
) &&
205 ( char_code
< ( cmap
->first
+ cmap
->count
) ) )
206 result
= cmap
->indices
[char_code
];
212 FT_CALLBACK_DEF( FT_UInt
)
213 t1_cmap_custom_char_next( T1_CMapCustom cmap
,
214 FT_UInt32
*pchar_code
)
217 FT_UInt32 char_code
= *pchar_code
;
222 if ( char_code
< cmap
->first
)
223 char_code
= cmap
->first
;
225 for ( ; char_code
< ( cmap
->first
+ cmap
->count
); char_code
++ )
227 result
= cmap
->indices
[char_code
];
235 *pchar_code
= char_code
;
240 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
241 t1_cmap_custom_class_rec
=
243 sizeof ( T1_CMapCustomRec
),
245 (FT_CMap_InitFunc
) t1_cmap_custom_init
,
246 (FT_CMap_DoneFunc
) t1_cmap_custom_done
,
247 (FT_CMap_CharIndexFunc
)t1_cmap_custom_char_index
,
248 (FT_CMap_CharNextFunc
) t1_cmap_custom_char_next
252 /*************************************************************************/
253 /*************************************************************************/
255 /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/
257 /*************************************************************************/
258 /*************************************************************************/
260 FT_CALLBACK_DEF( const char * )
261 t1_get_glyph_name( T1_Face face
,
264 return face
->type1
.glyph_names
[idx
];
268 FT_CALLBACK_DEF( FT_Error
)
269 t1_cmap_unicode_init( PS_Unicodes unicodes
)
271 T1_Face face
= (T1_Face
)FT_CMAP_FACE( unicodes
);
272 FT_Memory memory
= FT_FACE_MEMORY( face
);
273 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
276 return psnames
->unicodes_init( memory
,
278 face
->type1
.num_glyphs
,
279 (PS_GetGlyphNameFunc
)&t1_get_glyph_name
,
280 (PS_FreeGlyphNameFunc
)NULL
,
285 FT_CALLBACK_DEF( void )
286 t1_cmap_unicode_done( PS_Unicodes unicodes
)
288 FT_Face face
= FT_CMAP_FACE( unicodes
);
289 FT_Memory memory
= FT_FACE_MEMORY( face
);
292 FT_FREE( unicodes
->maps
);
293 unicodes
->num_maps
= 0;
297 FT_CALLBACK_DEF( FT_UInt
)
298 t1_cmap_unicode_char_index( PS_Unicodes unicodes
,
299 FT_UInt32 char_code
)
301 T1_Face face
= (T1_Face
)FT_CMAP_FACE( unicodes
);
302 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
305 return psnames
->unicodes_char_index( unicodes
, char_code
);
309 FT_CALLBACK_DEF( FT_UInt
)
310 t1_cmap_unicode_char_next( PS_Unicodes unicodes
,
311 FT_UInt32
*pchar_code
)
313 T1_Face face
= (T1_Face
)FT_CMAP_FACE( unicodes
);
314 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
317 return psnames
->unicodes_char_next( unicodes
, pchar_code
);
321 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
322 t1_cmap_unicode_class_rec
=
324 sizeof ( PS_UnicodesRec
),
326 (FT_CMap_InitFunc
) t1_cmap_unicode_init
,
327 (FT_CMap_DoneFunc
) t1_cmap_unicode_done
,
328 (FT_CMap_CharIndexFunc
)t1_cmap_unicode_char_index
,
329 (FT_CMap_CharNextFunc
) t1_cmap_unicode_char_next