加載字形圖像過程
1.轉(zhuǎn)換 Character Code 到 Glyph Index
通常部默,應(yīng)用程序希望基于其字符代碼加載字形圖像,字符代碼是定義給定編碼的字符的唯一值。例如,代碼65(0x41)表示ASCII編碼中的字符“A”。
face對象包含一個(gè)或多個(gè)表舆瘪,稱為 charmaps
。一個(gè)用于將Unicode字符代碼轉(zhuǎn)換為字形索引红伦,另一個(gè)用于將Apple Roman編碼轉(zhuǎn)換為字形索引英古。然后可以在Windows(使用Unicode)和舊MacOS版本(使用Apple Roman)上使用此類字體。另請注意昙读,給定的charmap
可能不會映射到字體中存在的所有字形
默認(rèn)Unicode charmap表選擇Glyph Index
glyph_index = FT_Get_Char_Index(face召调,charcode);
默認(rèn)情況下,創(chuàng)建新的面部對象時(shí)蛮浑,F(xiàn)reeType會嘗試選擇Unicode charmap唠叛。如果字體不包含基于字形名稱的charmap
,它會模擬Unicode charmap沮稚。默認(rèn)情況下使用UTF-32表示形式; 例如艺沼,如果要加載字符U + 1F028,請使用值0x1F028作為值charcode蕴掏。如果返回值為0障般,它始終對應(yīng)于稱為缺失字形的特殊字形圖像调鲸,通常顯示為框或空格。
手動選擇charmap
有兩周方法可供選擇一種是通過枚舉來制定選擇的charmap
error = FT_Select_Charmap(
face, /* target face object */
FT_ENCODING_BIG5 ); /* encoding */
如下為可選項(xiàng)
typedef enum FT_Encoding_
{
FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),
FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ),
FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ),
FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ),
FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ),
FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ),
/* for backwards compatibility */
FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS,
FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312,
FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5,
FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB,
FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ),
FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ),
FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ),
FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),
FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )
} FT_Encoding;
另一種方法是手動解析FT_Face-> charmaps
列表挽荡,可以通過num_charmaps
和 charmaps
(Tips:'s')訪問,第一個(gè)是該字體包含的charmps數(shù)量藐石,第二個(gè)是charmps
指針。
每個(gè)charmap
都有一些可見的字段來更精確地描述它定拟。最重要的是 charmap->platform_id
和charmap->encoding_id
贯钩,定義一對以相當(dāng)通用的方式描述charmap的值:每個(gè)值對對應(yīng)于給定的編碼。例如办素,對(3,1)對應(yīng)于Unicode。具體對應(yīng)值為下圖摘錄于Apple TrueType Reference Manual
可以根據(jù)特定的編碼選擇不同的
champ
FT_CharMap found = 0;
FT_CharMap charmap;
int n;
for ( n = 0; n < face->num_charmaps; n++ )
{
charmap = face->charmaps[n];
if ( charmap->platform_id == my_platform_id &&
charmap->encoding_id == my_encoding_id )
{
found = charmap;
break;
}
}
if(祸穷!found){...}
無論通過上述哪種方法選擇了chmap
表性穿,需要執(zhí)行
error = FT_Set_Charmap(face,found);
if(error){...}
執(zhí)行后講改變后續(xù)函數(shù)調(diào)用
/* retrieve glyph index from character code */
glyph_index = FT_Get_Char_Index( face, text[n] );