freetype研究筆記二

加載字形圖像過程

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_charmapscharmaps(Tips:'s')訪問,第一個(gè)是該字體包含的charmps數(shù)量藐石,第二個(gè)是charmps指針。
每個(gè)charmap都有一些可見的字段來更精確地描述它定拟。最重要的是 charmap->platform_idcharmap->encoding_id贯钩,定義一對以相當(dāng)通用的方式描述charmap的值:每個(gè)值對對應(yīng)于給定的編碼。例如办素,對(3,1)對應(yīng)于Unicode。具體對應(yīng)值為下圖摘錄于Apple TrueType Reference Manual

cmap對應(yīng)表

可以根據(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] );
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雷滚,一起剝皮案震驚了整個(gè)濱河市需曾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祈远,老刑警劉巖呆万,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異车份,居然都是意外死亡谋减,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門扫沼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來出爹,“玉大人,你說我怎么就攤上這事缎除⊙暇停” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵器罐,是天一觀的道長梢为。 經(jīng)常有香客問我,道長轰坊,這世上最難降的妖魔是什么铸董? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮衰倦,結(jié)果婚禮上袒炉,老公的妹妹穿的比我還像新娘。我一直安慰自己樊零,他們只是感情好我磁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布孽文。 她就那樣靜靜地躺著,像睡著了一般夺艰。 火紅的嫁衣襯著肌膚如雪芋哭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天郁副,我揣著相機(jī)與錄音减牺,去河邊找鬼。 笑死存谎,一個(gè)胖子當(dāng)著我的面吹牛拔疚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播既荚,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼稚失,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恰聘?” 一聲冷哼從身側(cè)響起句各,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晴叨,沒想到半個(gè)月后凿宾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼蕊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年初厚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孙技。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惧所,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绪杏,到底是詐尸還是另有隱情下愈,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布蕾久,位于F島的核電站势似,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏僧著。R本人自食惡果不足惜履因,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盹愚。 院中可真熱鬧栅迄,春花似錦、人聲如沸皆怕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至憋活,卻和暖如春岂津,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悦即。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工吮成, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辜梳。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓粱甫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親作瞄。 傳聞我的和親對象是個(gè)殘疾皇子魔种,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355