1 /***************************************************************************/
5 /* Type 1 character map 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 /***************************************************************************/
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
= (FT_UInt
)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
);
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
,
126 FT_UNUSED( pointer
);
129 t1_cmap_std_init( cmap
, 0 );
134 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
135 t1_cmap_standard_class_rec
=
137 sizeof ( T1_CMapStdRec
),
139 (FT_CMap_InitFunc
) t1_cmap_standard_init
, /* init */
140 (FT_CMap_DoneFunc
) t1_cmap_std_done
, /* done */
141 (FT_CMap_CharIndexFunc
)t1_cmap_std_char_index
, /* char_index */
142 (FT_CMap_CharNextFunc
) t1_cmap_std_char_next
, /* char_next */
144 (FT_CMap_CharVarIndexFunc
) NULL
, /* char_var_index */
145 (FT_CMap_CharVarIsDefaultFunc
)NULL
, /* char_var_default */
146 (FT_CMap_VariantListFunc
) NULL
, /* variant_list */
147 (FT_CMap_CharVariantListFunc
) NULL
, /* charvariant_list */
148 (FT_CMap_VariantCharListFunc
) NULL
/* variantchar_list */
152 FT_CALLBACK_DEF( FT_Error
)
153 t1_cmap_expert_init( T1_CMapStd cmap
,
156 FT_UNUSED( pointer
);
159 t1_cmap_std_init( cmap
, 1 );
163 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
164 t1_cmap_expert_class_rec
=
166 sizeof ( T1_CMapStdRec
),
168 (FT_CMap_InitFunc
) t1_cmap_expert_init
, /* init */
169 (FT_CMap_DoneFunc
) t1_cmap_std_done
, /* done */
170 (FT_CMap_CharIndexFunc
)t1_cmap_std_char_index
, /* char_index */
171 (FT_CMap_CharNextFunc
) t1_cmap_std_char_next
, /* char_next */
173 (FT_CMap_CharVarIndexFunc
) NULL
, /* char_var_index */
174 (FT_CMap_CharVarIsDefaultFunc
)NULL
, /* char_var_default */
175 (FT_CMap_VariantListFunc
) NULL
, /* variant_list */
176 (FT_CMap_CharVariantListFunc
) NULL
, /* charvariant_list */
177 (FT_CMap_VariantCharListFunc
) NULL
/* variantchar_list */
181 /*************************************************************************/
182 /*************************************************************************/
184 /***** TYPE1 CUSTOM ENCODING CMAP *****/
186 /*************************************************************************/
187 /*************************************************************************/
190 FT_CALLBACK_DEF( FT_Error
)
191 t1_cmap_custom_init( T1_CMapCustom cmap
,
194 T1_Face face
= (T1_Face
)FT_CMAP_FACE( cmap
);
195 T1_Encoding encoding
= &face
->type1
.encoding
;
197 FT_UNUSED( pointer
);
200 cmap
->first
= (FT_UInt
)encoding
->code_first
;
201 cmap
->count
= (FT_UInt
)encoding
->code_last
- cmap
->first
;
202 cmap
->indices
= encoding
->char_index
;
204 FT_ASSERT( cmap
->indices
);
205 FT_ASSERT( encoding
->code_first
<= encoding
->code_last
);
211 FT_CALLBACK_DEF( void )
212 t1_cmap_custom_done( T1_CMapCustom cmap
)
214 cmap
->indices
= NULL
;
220 FT_CALLBACK_DEF( FT_UInt
)
221 t1_cmap_custom_char_index( T1_CMapCustom cmap
,
222 FT_UInt32 char_code
)
227 if ( ( char_code
>= cmap
->first
) &&
228 ( char_code
< ( cmap
->first
+ cmap
->count
) ) )
229 result
= cmap
->indices
[char_code
];
235 FT_CALLBACK_DEF( FT_UInt32
)
236 t1_cmap_custom_char_next( T1_CMapCustom cmap
,
237 FT_UInt32
*pchar_code
)
240 FT_UInt32 char_code
= *pchar_code
;
245 if ( char_code
< cmap
->first
)
246 char_code
= cmap
->first
;
248 for ( ; char_code
< ( cmap
->first
+ cmap
->count
); char_code
++ )
250 result
= cmap
->indices
[char_code
];
258 *pchar_code
= char_code
;
263 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
264 t1_cmap_custom_class_rec
=
266 sizeof ( T1_CMapCustomRec
),
268 (FT_CMap_InitFunc
) t1_cmap_custom_init
, /* init */
269 (FT_CMap_DoneFunc
) t1_cmap_custom_done
, /* done */
270 (FT_CMap_CharIndexFunc
)t1_cmap_custom_char_index
, /* char_index */
271 (FT_CMap_CharNextFunc
) t1_cmap_custom_char_next
, /* char_next */
273 (FT_CMap_CharVarIndexFunc
) NULL
, /* char_var_index */
274 (FT_CMap_CharVarIsDefaultFunc
)NULL
, /* char_var_default */
275 (FT_CMap_VariantListFunc
) NULL
, /* variant_list */
276 (FT_CMap_CharVariantListFunc
) NULL
, /* charvariant_list */
277 (FT_CMap_VariantCharListFunc
) NULL
/* variantchar_list */
281 /*************************************************************************/
282 /*************************************************************************/
284 /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/
286 /*************************************************************************/
287 /*************************************************************************/
289 FT_CALLBACK_DEF( const char * )
290 psaux_get_glyph_name( T1_Face face
,
293 return face
->type1
.glyph_names
[idx
];
297 FT_CALLBACK_DEF( FT_Error
)
298 t1_cmap_unicode_init( PS_Unicodes unicodes
,
301 T1_Face face
= (T1_Face
)FT_CMAP_FACE( unicodes
);
302 FT_Memory memory
= FT_FACE_MEMORY( face
);
303 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
305 FT_UNUSED( pointer
);
308 return psnames
->unicodes_init( memory
,
310 (FT_UInt
)face
->type1
.num_glyphs
,
311 (PS_GetGlyphNameFunc
)&psaux_get_glyph_name
,
312 (PS_FreeGlyphNameFunc
)NULL
,
317 FT_CALLBACK_DEF( void )
318 t1_cmap_unicode_done( PS_Unicodes unicodes
)
320 FT_Face face
= FT_CMAP_FACE( unicodes
);
321 FT_Memory memory
= FT_FACE_MEMORY( face
);
324 FT_FREE( unicodes
->maps
);
325 unicodes
->num_maps
= 0;
329 FT_CALLBACK_DEF( FT_UInt
)
330 t1_cmap_unicode_char_index( PS_Unicodes unicodes
,
331 FT_UInt32 char_code
)
333 T1_Face face
= (T1_Face
)FT_CMAP_FACE( unicodes
);
334 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
337 return psnames
->unicodes_char_index( unicodes
, char_code
);
341 FT_CALLBACK_DEF( FT_UInt32
)
342 t1_cmap_unicode_char_next( PS_Unicodes unicodes
,
343 FT_UInt32
*pchar_code
)
345 T1_Face face
= (T1_Face
)FT_CMAP_FACE( unicodes
);
346 FT_Service_PsCMaps psnames
= (FT_Service_PsCMaps
)face
->psnames
;
349 return psnames
->unicodes_char_next( unicodes
, pchar_code
);
353 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
354 t1_cmap_unicode_class_rec
=
356 sizeof ( PS_UnicodesRec
),
358 (FT_CMap_InitFunc
) t1_cmap_unicode_init
, /* init */
359 (FT_CMap_DoneFunc
) t1_cmap_unicode_done
, /* done */
360 (FT_CMap_CharIndexFunc
)t1_cmap_unicode_char_index
, /* char_index */
361 (FT_CMap_CharNextFunc
) t1_cmap_unicode_char_next
, /* char_next */
363 (FT_CMap_CharVarIndexFunc
) NULL
, /* char_var_index */
364 (FT_CMap_CharVarIsDefaultFunc
)NULL
, /* char_var_default */
365 (FT_CMap_VariantListFunc
) NULL
, /* variant_list */
366 (FT_CMap_CharVariantListFunc
) NULL
, /* charvariant_list */
367 (FT_CMap_VariantCharListFunc
) NULL
/* variantchar_list */