1 /***************************************************************************/
5 /* Type 1 character map support (body). */
7 /* Copyright 2002, 2003, 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 /***************************************************************************/
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_UInt32
)
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
,
140 NULL
, NULL
, NULL
, NULL
, NULL
144 FT_CALLBACK_DEF( FT_Error
)
145 t1_cmap_expert_init( T1_CMapStd cmap
)
147 t1_cmap_std_init( cmap
, 1 );
151 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
152 t1_cmap_expert_class_rec
=
154 sizeof ( T1_CMapStdRec
),
156 (FT_CMap_InitFunc
) t1_cmap_expert_init
,
157 (FT_CMap_DoneFunc
) t1_cmap_std_done
,
158 (FT_CMap_CharIndexFunc
)t1_cmap_std_char_index
,
159 (FT_CMap_CharNextFunc
) t1_cmap_std_char_next
,
161 NULL
, NULL
, NULL
, NULL
, NULL
165 /*************************************************************************/
166 /*************************************************************************/
168 /***** TYPE1 CUSTOM ENCODING CMAP *****/
170 /*************************************************************************/
171 /*************************************************************************/
174 FT_CALLBACK_DEF( FT_Error
)
175 t1_cmap_custom_init( T1_CMapCustom cmap
)
177 T1_Face face
= (T1_Face
)FT_CMAP_FACE( cmap
);
178 T1_Encoding encoding
= &face
->type1
.encoding
;
181 cmap
->first
= encoding
->code_first
;
182 cmap
->count
= (FT_UInt
)( encoding
->code_last
- cmap
->first
);
183 cmap
->indices
= encoding
->char_index
;
185 FT_ASSERT( cmap
->indices
!= NULL
);
186 FT_ASSERT( encoding
->code_first
<= encoding
->code_last
);
192 FT_CALLBACK_DEF( void )
193 t1_cmap_custom_done( T1_CMapCustom cmap
)
195 cmap
->indices
= NULL
;
201 FT_CALLBACK_DEF( FT_UInt
)
202 t1_cmap_custom_char_index( T1_CMapCustom cmap
,
203 FT_UInt32 char_code
)
208 if ( ( char_code
>= cmap
->first
) &&
209 ( char_code
< ( cmap
->first
+ cmap
->count
) ) )
210 result
= cmap
->indices
[char_code
];
216 FT_CALLBACK_DEF( FT_UInt32
)
217 t1_cmap_custom_char_next( T1_CMapCustom cmap
,
218 FT_UInt32
*pchar_code
)
221 FT_UInt32 char_code
= *pchar_code
;
226 if ( char_code
< cmap
->first
)
227 char_code
= cmap
->first
;
229 for ( ; char_code
< ( cmap
->first
+ cmap
->count
); char_code
++ )
231 result
= cmap
->indices
[char_code
];
239 *pchar_code
= char_code
;
244 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
245 t1_cmap_custom_class_rec
=
247 sizeof ( T1_CMapCustomRec
),
249 (FT_CMap_InitFunc
) t1_cmap_custom_init
,
250 (FT_CMap_DoneFunc
) t1_cmap_custom_done
,
251 (FT_CMap_CharIndexFunc
)t1_cmap_custom_char_index
,
252 (FT_CMap_CharNextFunc
) t1_cmap_custom_char_next
,
254 NULL
, NULL
, NULL
, NULL
, NULL
258 /*************************************************************************/
259 /*************************************************************************/
261 /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/
263 /*************************************************************************/
264 /*************************************************************************/
266 FT_CALLBACK_DEF( const char * )
267 t1_get_glyph_name( T1_Face face
,
270 return face
->type1
.glyph_names
[idx
];
274 FT_CALLBACK_DEF( FT_Error
)
275 t1_cmap_unicode_init( PS_Unicodes unicodes
)
277 T1_Face face
= (T1_Face
)FT_CMAP_FACE( unicodes
);
278 FT_Memory memory
= FT_FACE_MEMORY( face
);
279 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
282 return psnames
->unicodes_init( memory
,
284 face
->type1
.num_glyphs
,
285 (PS_GetGlyphNameFunc
)&t1_get_glyph_name
,
286 (PS_FreeGlyphNameFunc
)NULL
,
291 FT_CALLBACK_DEF( void )
292 t1_cmap_unicode_done( PS_Unicodes unicodes
)
294 FT_Face face
= FT_CMAP_FACE( unicodes
);
295 FT_Memory memory
= FT_FACE_MEMORY( face
);
298 FT_FREE( unicodes
->maps
);
299 unicodes
->num_maps
= 0;
303 FT_CALLBACK_DEF( FT_UInt
)
304 t1_cmap_unicode_char_index( PS_Unicodes unicodes
,
305 FT_UInt32 char_code
)
307 T1_Face face
= (T1_Face
)FT_CMAP_FACE( unicodes
);
308 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
311 return psnames
->unicodes_char_index( unicodes
, char_code
);
315 FT_CALLBACK_DEF( FT_UInt32
)
316 t1_cmap_unicode_char_next( PS_Unicodes unicodes
,
317 FT_UInt32
*pchar_code
)
319 T1_Face face
= (T1_Face
)FT_CMAP_FACE( unicodes
);
320 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
323 return psnames
->unicodes_char_next( unicodes
, pchar_code
);
327 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
328 t1_cmap_unicode_class_rec
=
330 sizeof ( PS_UnicodesRec
),
332 (FT_CMap_InitFunc
) t1_cmap_unicode_init
,
333 (FT_CMap_DoneFunc
) t1_cmap_unicode_done
,
334 (FT_CMap_CharIndexFunc
)t1_cmap_unicode_char_index
,
335 (FT_CMap_CharNextFunc
) t1_cmap_unicode_char_next
,
337 NULL
, NULL
, NULL
, NULL
, NULL