|
|
|
@ -227,233 +227,6 @@ |
|
|
|
|
#endif /* T1_CONFIG_OPTION_NO_AFM */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Function> */ |
|
|
|
|
/* Get_Char_Index */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* Uses a charmap to return a given character code's glyph index. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Input> */ |
|
|
|
|
/* charmap :: A handle to the source charmap object. */ |
|
|
|
|
/* */ |
|
|
|
|
/* charcode :: The character code. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Return> */ |
|
|
|
|
/* Glyph index. 0 means `undefined character code'. */ |
|
|
|
|
/* */ |
|
|
|
|
static FT_UInt |
|
|
|
|
Get_Char_Index( FT_CharMap charmap, |
|
|
|
|
FT_Long charcode ) |
|
|
|
|
{ |
|
|
|
|
T1_Face face; |
|
|
|
|
FT_UInt result = 0; |
|
|
|
|
PSNames_Service psnames; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
face = (T1_Face)charmap->face; |
|
|
|
|
psnames = (PSNames_Service)face->psnames; |
|
|
|
|
if ( psnames ) |
|
|
|
|
switch ( charmap->encoding ) |
|
|
|
|
{ |
|
|
|
|
/*******************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* Unicode encoding support */ |
|
|
|
|
/* */ |
|
|
|
|
case ft_encoding_unicode: |
|
|
|
|
/* use the `PSNames' module to synthetize the Unicode charmap */ |
|
|
|
|
result = psnames->lookup_unicode( &face->unicode_map, |
|
|
|
|
(FT_ULong)charcode ); |
|
|
|
|
|
|
|
|
|
/* the function returns 0xFFFF if the Unicode charcode has */ |
|
|
|
|
/* no corresponding glyph */ |
|
|
|
|
if ( result == 0xFFFFU ) |
|
|
|
|
result = 0; |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
/*******************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* ISOLatin1 encoding support */ |
|
|
|
|
/* */ |
|
|
|
|
case ft_encoding_latin_1: |
|
|
|
|
/* ISOLatin1 is the first page of Unicode */ |
|
|
|
|
if ( charcode < 256 && psnames->unicode_value ) |
|
|
|
|
{ |
|
|
|
|
result = psnames->lookup_unicode( &face->unicode_map, |
|
|
|
|
(FT_ULong)charcode ); |
|
|
|
|
|
|
|
|
|
/* the function returns 0xFFFF if the Unicode charcode has */ |
|
|
|
|
/* no corresponding glyph */ |
|
|
|
|
if ( result == 0xFFFFU ) |
|
|
|
|
result = 0; |
|
|
|
|
} |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
/*******************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* Custom Type 1 encoding */ |
|
|
|
|
/* */ |
|
|
|
|
case ft_encoding_adobe_custom: |
|
|
|
|
{ |
|
|
|
|
T1_Encoding encoding = &face->type1.encoding; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( charcode >= encoding->code_first && |
|
|
|
|
charcode <= encoding->code_last ) |
|
|
|
|
result = encoding->char_index[charcode]; |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*******************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* Adobe Standard & Expert encoding support */ |
|
|
|
|
/* */ |
|
|
|
|
default: |
|
|
|
|
if ( charcode < 256 ) |
|
|
|
|
{ |
|
|
|
|
FT_UInt code; |
|
|
|
|
FT_Int n; |
|
|
|
|
const char* glyph_name; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
code = psnames->adobe_std_encoding[charcode]; |
|
|
|
|
if ( charmap->encoding == ft_encoding_adobe_expert ) |
|
|
|
|
code = psnames->adobe_expert_encoding[charcode]; |
|
|
|
|
|
|
|
|
|
glyph_name = psnames->adobe_std_strings( code ); |
|
|
|
|
if ( !glyph_name ) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
for ( n = 0; n < face->type1.num_glyphs; n++ ) |
|
|
|
|
{ |
|
|
|
|
const char* gname = face->type1.glyph_names[n]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( gname && gname[0] == glyph_name[0] && |
|
|
|
|
ft_strcmp( gname, glyph_name ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
result = n; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
Exit: |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Function> */ |
|
|
|
|
/* Get_Next_Char */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* Uses a charmap to return the next encoded char. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Input> */ |
|
|
|
|
/* charmap :: A handle to the source charmap object. */ |
|
|
|
|
/* */ |
|
|
|
|
/* charcode :: The character code. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Return> */ |
|
|
|
|
/* Next char code. 0 means `no more char codes'. */ |
|
|
|
|
/* */ |
|
|
|
|
static FT_Long |
|
|
|
|
Get_Next_Char( FT_CharMap charmap, |
|
|
|
|
FT_Long charcode ) |
|
|
|
|
{ |
|
|
|
|
T1_Face face; |
|
|
|
|
PSNames_Service psnames; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
face = (T1_Face)charmap->face; |
|
|
|
|
psnames = (PSNames_Service)face->psnames; |
|
|
|
|
|
|
|
|
|
if ( psnames ) |
|
|
|
|
switch ( charmap->encoding ) |
|
|
|
|
{ |
|
|
|
|
/*******************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* Unicode encoding support */ |
|
|
|
|
/* */ |
|
|
|
|
case ft_encoding_unicode: |
|
|
|
|
/* use the `PSNames' module to synthetize the Unicode charmap */ |
|
|
|
|
return psnames->next_unicode( &face->unicode_map, |
|
|
|
|
(FT_ULong)charcode ); |
|
|
|
|
|
|
|
|
|
/*******************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* ISOLatin1 encoding support */ |
|
|
|
|
/* */ |
|
|
|
|
case ft_encoding_latin_1: |
|
|
|
|
{ |
|
|
|
|
FT_Long code; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* use the `PSNames' module to synthetize the Unicode charmap */ |
|
|
|
|
code = psnames->next_unicode( &face->unicode_map, |
|
|
|
|
(FT_ULong)charcode ); |
|
|
|
|
if ( code < 256 ) |
|
|
|
|
return code; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*******************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* Custom Type 1 encoding */ |
|
|
|
|
/* */ |
|
|
|
|
case ft_encoding_adobe_custom: |
|
|
|
|
{ |
|
|
|
|
T1_Encoding encoding = &face->type1.encoding; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
charcode++; |
|
|
|
|
if ( charcode < encoding->code_first ) |
|
|
|
|
charcode = encoding->code_first; |
|
|
|
|
while ( charcode <= encoding->code_last ) |
|
|
|
|
{ |
|
|
|
|
if ( encoding->char_index[charcode] ) |
|
|
|
|
return charcode; |
|
|
|
|
charcode++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*******************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* Adobe Standard & Expert encoding support */ |
|
|
|
|
/* */ |
|
|
|
|
default: |
|
|
|
|
while ( ++charcode < 256 ) |
|
|
|
|
{ |
|
|
|
|
FT_UInt code; |
|
|
|
|
FT_Int n; |
|
|
|
|
const char* glyph_name; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
code = psnames->adobe_std_encoding[charcode]; |
|
|
|
|
if ( charmap->encoding == ft_encoding_adobe_expert ) |
|
|
|
|
code = psnames->adobe_expert_encoding[charcode]; |
|
|
|
|
|
|
|
|
|
glyph_name = psnames->adobe_std_strings( code ); |
|
|
|
|
if ( !glyph_name ) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
for ( n = 0; n < face->type1.num_glyphs; n++ ) |
|
|
|
|
{ |
|
|
|
|
const char* gname = face->type1.glyph_names[n]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( gname && gname[0] == glyph_name[0] && |
|
|
|
|
ft_strcmp( gname, glyph_name ) == 0 ) |
|
|
|
|
return charcode; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_TABLE_DEF |
|
|
|
@ -491,7 +264,6 @@ |
|
|
|
|
(FT_Size_ResetPointsFunc) T1_Size_Reset, |
|
|
|
|
(FT_Size_ResetPixelsFunc) T1_Size_Reset, |
|
|
|
|
(FT_Slot_LoadFunc) T1_Load_Glyph, |
|
|
|
|
(FT_CharMap_CharIndexFunc)Get_Char_Index, |
|
|
|
|
|
|
|
|
|
#ifdef T1_CONFIG_OPTION_NO_AFM |
|
|
|
|
(FT_Face_GetKerningFunc) 0, |
|
|
|
@ -500,9 +272,7 @@ |
|
|
|
|
(FT_Face_GetKerningFunc) Get_Kerning, |
|
|
|
|
(FT_Face_AttachFunc) T1_Read_AFM, |
|
|
|
|
#endif |
|
|
|
|
(FT_Face_GetAdvancesFunc) 0, |
|
|
|
|
|
|
|
|
|
(FT_CharMap_CharNextFunc) Get_Next_Char |
|
|
|
|
(FT_Face_GetAdvancesFunc) 0 |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|