2019年3月25日 星期一

FreeType的字型排版資訊

FreeType的字型排版資訊

前言

  在之前的初探FreeType中讀取出字型的pixel資料,但只是這樣的資料並不夠用,只是畫出單一個字還可以,如果要畫一個字串的話,就需要知道"排版資訊",在此做個紀錄。

內容

  在之前的"初探FreeType"中,每個"glyph"的寬跟高都是不同的,要畫出一個左排到右的字串的話,會發現無法對齊,因為只知道該字的Pixel寬與高並沒有辦法對齊。

  排版的資訊在"FT_load_Glyph()"時就會存在"face"裡,個人整理了排版資訊如下圖
字型的排版資訊
排版需要的變數有"glyph width"、"glyph height"、"code width"、"code height"、"code offset x"與"code offset y",接著來看怎麼從Freetype取出這些數值。

  "glyph width"的部分可以在"face->glyph->matrics.horiAdvance"取得,取得後記得除以64,就可以取得pixel的寬。

  "glyph height"比較簡單,還記得"FT_Set_Pixel_sizes()"嗎?最後一個參數就是這個數值。

  "code width"可以在"face->glyph->matrics.width"取得,取得後記得除以64。

  "code width"可以在"face->glyph->matrics.height"取得,取得後記得除以64。

  "code offset x"可以在"face->glyph->matrics.horiBearingX"取得,取得後記得除以64。

  "code offset y"這個比較麻煩,"glyph height-(face->glyph->bitmap_top+glyph height/4)",這計算式看起很奇怪是因為FreeType是左下座標為基準,但我定義的這個數值卻是左上座標,所以要做個換算。

  接著來說一些注意事項,有些字是無法讀出字型資訊的,比如說"\n",也就是換行,在畫字串時要記得處理特殊字元。"code offset x"與"code offset y"是有"負值"的,如"j"這個字元的"code offset x"就是負的。如果"code offset x"是負值,該值就不會被算在 "glyph width"裡面,如下圖
"code offset x"是負值的狀況

參考資料

Glyph Metrics

相關文章

初探FreeType

沒有留言:

張貼留言