00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "t1cmap.h"
00020
00021 #include FT_INTERNAL_DEBUG_H
00022
00023 #include "psauxerr.h"
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 static void
00035 t1_cmap_std_init( T1_CMapStd cmap,
00036 FT_Int is_expert )
00037 {
00038 T1_Face face = (T1_Face)FT_CMAP_FACE( cmap );
00039 FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
00040
00041
00042 cmap->num_glyphs = face->type1.num_glyphs;
00043 cmap->glyph_names = (const char* const*)face->type1.glyph_names;
00044 cmap->sid_to_string = psnames->adobe_std_strings;
00045 cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding
00046 : psnames->adobe_std_encoding;
00047
00048 FT_ASSERT( cmap->code_to_sid != NULL );
00049 }
00050
00051
00052 FT_CALLBACK_DEF( void )
00053 t1_cmap_std_done( T1_CMapStd cmap )
00054 {
00055 cmap->num_glyphs = 0;
00056 cmap->glyph_names = NULL;
00057 cmap->sid_to_string = NULL;
00058 cmap->code_to_sid = NULL;
00059 }
00060
00061
00062 FT_CALLBACK_DEF( FT_UInt )
00063 t1_cmap_std_char_index( T1_CMapStd cmap,
00064 FT_UInt32 char_code )
00065 {
00066 FT_UInt result = 0;
00067
00068
00069 if ( char_code < 256 )
00070 {
00071 FT_UInt code, n;
00072 const char* glyph_name;
00073
00074
00075
00076 code = cmap->code_to_sid[char_code];
00077 glyph_name = cmap->sid_to_string( code );
00078
00079
00080 for ( n = 0; n < cmap->num_glyphs; n++ )
00081 {
00082 const char* gname = cmap->glyph_names[n];
00083
00084
00085 if ( gname && gname[0] == glyph_name[0] &&
00086 ft_strcmp( gname, glyph_name ) == 0 )
00087 {
00088 result = n;
00089 break;
00090 }
00091 }
00092 }
00093
00094 return result;
00095 }
00096
00097
00098 FT_CALLBACK_DEF( FT_UInt32 )
00099 t1_cmap_std_char_next( T1_CMapStd cmap,
00100 FT_UInt32 *pchar_code )
00101 {
00102 FT_UInt result = 0;
00103 FT_UInt32 char_code = *pchar_code + 1;
00104
00105
00106 while ( char_code < 256 )
00107 {
00108 result = t1_cmap_std_char_index( cmap, char_code );
00109 if ( result != 0 )
00110 goto Exit;
00111
00112 char_code++;
00113 }
00114 char_code = 0;
00115
00116 Exit:
00117 *pchar_code = char_code;
00118 return result;
00119 }
00120
00121
00122 FT_CALLBACK_DEF( FT_Error )
00123 t1_cmap_standard_init( T1_CMapStd cmap )
00124 {
00125 t1_cmap_std_init( cmap, 0 );
00126 return 0;
00127 }
00128
00129
00130 FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
00131 t1_cmap_standard_class_rec =
00132 {
00133 sizeof ( T1_CMapStdRec ),
00134
00135 (FT_CMap_InitFunc) t1_cmap_standard_init,
00136 (FT_CMap_DoneFunc) t1_cmap_std_done,
00137 (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
00138 (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
00139
00140 NULL, NULL, NULL, NULL, NULL
00141 };
00142
00143
00144 FT_CALLBACK_DEF( FT_Error )
00145 t1_cmap_expert_init( T1_CMapStd cmap )
00146 {
00147 t1_cmap_std_init( cmap, 1 );
00148 return 0;
00149 }
00150
00151 FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
00152 t1_cmap_expert_class_rec =
00153 {
00154 sizeof ( T1_CMapStdRec ),
00155
00156 (FT_CMap_InitFunc) t1_cmap_expert_init,
00157 (FT_CMap_DoneFunc) t1_cmap_std_done,
00158 (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
00159 (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
00160
00161 NULL, NULL, NULL, NULL, NULL
00162 };
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 FT_CALLBACK_DEF( FT_Error )
00175 t1_cmap_custom_init( T1_CMapCustom cmap )
00176 {
00177 T1_Face face = (T1_Face)FT_CMAP_FACE( cmap );
00178 T1_Encoding encoding = &face->type1.encoding;
00179
00180
00181 cmap->first = encoding->code_first;
00182 cmap->count = (FT_UInt)( encoding->code_last - cmap->first );
00183 cmap->indices = encoding->char_index;
00184
00185 FT_ASSERT( cmap->indices != NULL );
00186 FT_ASSERT( encoding->code_first <= encoding->code_last );
00187
00188 return 0;
00189 }
00190
00191
00192 FT_CALLBACK_DEF( void )
00193 t1_cmap_custom_done( T1_CMapCustom cmap )
00194 {
00195 cmap->indices = NULL;
00196 cmap->first = 0;
00197 cmap->count = 0;
00198 }
00199
00200
00201 FT_CALLBACK_DEF( FT_UInt )
00202 t1_cmap_custom_char_index( T1_CMapCustom cmap,
00203 FT_UInt32 char_code )
00204 {
00205 FT_UInt result = 0;
00206
00207
00208 if ( ( char_code >= cmap->first ) &&
00209 ( char_code < ( cmap->first + cmap->count ) ) )
00210 result = cmap->indices[char_code];
00211
00212 return result;
00213 }
00214
00215
00216 FT_CALLBACK_DEF( FT_UInt32 )
00217 t1_cmap_custom_char_next( T1_CMapCustom cmap,
00218 FT_UInt32 *pchar_code )
00219 {
00220 FT_UInt result = 0;
00221 FT_UInt32 char_code = *pchar_code;
00222
00223
00224 ++char_code;
00225
00226 if ( char_code < cmap->first )
00227 char_code = cmap->first;
00228
00229 for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )
00230 {
00231 result = cmap->indices[char_code];
00232 if ( result != 0 )
00233 goto Exit;
00234 }
00235
00236 char_code = 0;
00237
00238 Exit:
00239 *pchar_code = char_code;
00240 return result;
00241 }
00242
00243
00244 FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
00245 t1_cmap_custom_class_rec =
00246 {
00247 sizeof ( T1_CMapCustomRec ),
00248
00249 (FT_CMap_InitFunc) t1_cmap_custom_init,
00250 (FT_CMap_DoneFunc) t1_cmap_custom_done,
00251 (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,
00252 (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,
00253
00254 NULL, NULL, NULL, NULL, NULL
00255 };
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 FT_CALLBACK_DEF( const char * )
00267 t1_get_glyph_name( T1_Face face,
00268 FT_UInt idx )
00269 {
00270 return face->type1.glyph_names[idx];
00271 }
00272
00273
00274 FT_CALLBACK_DEF( FT_Error )
00275 t1_cmap_unicode_init( PS_Unicodes unicodes )
00276 {
00277 T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes );
00278 FT_Memory memory = FT_FACE_MEMORY( face );
00279 FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
00280
00281
00282 return psnames->unicodes_init( memory,
00283 unicodes,
00284 face->type1.num_glyphs,
00285 (PS_GetGlyphNameFunc)&t1_get_glyph_name,
00286 (PS_FreeGlyphNameFunc)NULL,
00287 (FT_Pointer)face );
00288 }
00289
00290
00291 FT_CALLBACK_DEF( void )
00292 t1_cmap_unicode_done( PS_Unicodes unicodes )
00293 {
00294 FT_Face face = FT_CMAP_FACE( unicodes );
00295 FT_Memory memory = FT_FACE_MEMORY( face );
00296
00297
00298 FT_FREE( unicodes->maps );
00299 unicodes->num_maps = 0;
00300 }
00301
00302
00303 FT_CALLBACK_DEF( FT_UInt )
00304 t1_cmap_unicode_char_index( PS_Unicodes unicodes,
00305 FT_UInt32 char_code )
00306 {
00307 T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes );
00308 FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
00309
00310
00311 return psnames->unicodes_char_index( unicodes, char_code );
00312 }
00313
00314
00315 FT_CALLBACK_DEF( FT_UInt32 )
00316 t1_cmap_unicode_char_next( PS_Unicodes unicodes,
00317 FT_UInt32 *pchar_code )
00318 {
00319 T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes );
00320 FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
00321
00322
00323 return psnames->unicodes_char_next( unicodes, pchar_code );
00324 }
00325
00326
00327 FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
00328 t1_cmap_unicode_class_rec =
00329 {
00330 sizeof ( PS_UnicodesRec ),
00331
00332 (FT_CMap_InitFunc) t1_cmap_unicode_init,
00333 (FT_CMap_DoneFunc) t1_cmap_unicode_done,
00334 (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,
00335 (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,
00336
00337 NULL, NULL, NULL, NULL, NULL
00338 };
00339
00340
00341