星期五, 2月 11, 2011

AlbiteReader的字型處理

org.albite.font.AlbiteFont
  1. ctor 開啟字型檔以後,就開始處理 (這邊是開 .alf)
  2. 格式
    • byte 1: line spacing
    • byte 2: line height
    • byte 3-6: glyphs (character range)
    • byte 7-8: maxium width
    • byte 9-12: character count
    • 接下來就是循序讀出各字元的 x, y, w, h, xo, yo, xa
      • byte 1-2: character
      • byte 3-4: x
      • byte 5-6: y
      • byte 7-8: width
      • byte 9-10: height
      • byte 11-12: xoffset
      • byte 13-14: yoffset
      • byte 15-16: xadvance 下一個字元跟目前字元的間隔
    • 再放到對應 character 的 glyphs 陣列裡 (glyphs[character]=new Glyph(x, y, w, h, xo, yo, xa)
  3. 讀完 .alf(字型資訊),接著開啟 .ali,這邊是真正的字型資料,先把整個 .ali 讀取到記憶體裡 (由 AlbiteImageMono 處理,同樣也有檔頭,但較簡單,前4個bytes是magic number,接著的兩個bytes是width,然後再來的兩個bytes是height)
  4. 把必要的字元先處理起來,像是 ' ', '?', '-'
  5. 其他的字元都是畫的時候,依據 glyphs 資訊去存取記憶體裡的 buffer


照這樣看起來,如果要依樣畫葫蘆,將中文字型製作成 .ali 的話,會遇到的問題是記憶體問題。AlbiteFont 會將整個 .ali 載入到記憶體裡,製作出來的 .ali 會有多大呢? 假設字的大小是12x12,要完整收文泉驛的20932個字,那大約是3MB左右。依照 SE T700 的規格,內部記憶體只有 25MB。未知的是可用記憶體,所以必須考慮最壞的情況,記憶體會不足!!

會使用自己的字型,我想應該是考慮到平台相容的問題。

沒有留言: