|
如果某個想法是你唯一的想法, 那就沒有比它更危險的東西了。 |
freetype2 是幹麻用的, 簡單來說就是可以把 type1, truetype 字型解譯出來, 讓我們取得字型內容, 然後用繪圖函式來秀出某一個字。如果沒有繪圖函式, 可以用 printf 來秀出這個字, 雖然粗糙了點, 但可以方便的測試。
freetype2 非常的複雜, 我在很久之前 (2001 左右) 讀了其內建的手冊, 異常辛苦, 印出來的紙本滿滿是我的注記。學習一個 library 尤其是一個複雜的 library, 沒有比給一個範例程式更好的學習方式了, 手冊雖然有範例, 但是不夠完整, 所以我才寫了這個, 可以編譯、執行、印出字型中的字, 而且只需要 c++17 就可以了, 不需要進入繪圖模式, 在 2019 年, 支援 c++17 的編譯器並不難找。
其中會需要 unicode 轉換, 我是借助 c++11 的標準程式庫來完成, c++11 來的即時, 更早之前, 我是用 qstring 來做 unicode 轉換, 為了 unicode 要 link qt 實在是有點蠢。
source code:
https://github.com/descent/progs/tree/master/cpp11_utf8
L198 ~ L320 就是在取出字型的 bitmap, 可以看到需要呼叫好幾個 api, 有了這個資料就可以在螢幕上畫出這個字。
unicode 點陣字型 (有日文)
apt-get install xfonts-unifont
/usr/share/fonts/X11/misc/unifont.pcf.gz
文鼎捐贈的字型 (只有繁體中文英文數字)
apt-get install fonts-arphic-bsmi00lp
/usr/share/fonts/truetype/arphic-bsmi00lp/bsmi00lp.ttf
只有畫出文字是不夠的, 還要畫在正確的位置, 這需要繪圖模式才辦得到, 以下的範例在於正確取得座標位置, 避免畫出來的 2 個水平文字無法水平對齊。這篇不會提到這個, 下篇再來說明這個。
https://www.freetype.org/freetype2/docs/tutorial/example1.c
參考
/* now, draw to our target surface (convert position) */
draw_bitmap( &slot->bitmap,
slot->bitmap_left,
target_height - slot->bitmap_top );
畫出的座標
可以隱約看出「中文」這 2 個字。
ref:
FreeType简易教程
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。