天天看點

MTK矢量字庫與研究

這兩天在看矢量字庫相關文檔,結合MTK源碼現整理如下:

1.字型矢量化原理,多邊形填充原理,多邊形填充最需要關注的就是斜率,計算每條邊的斜率,進而得到每條邊在每一行上的切點。然後從左到右,将各切點連接配接起來,逐行進行。多邊形有兩種填充方式,Alternate和Winding。矢量字型主要用的前一種方式,而winding會将所有的切點都連接配接起來,沒有了中間的分隔區域。

2..矢量字庫的總體結構,矢量字庫共分三個區域,它們是:(1)索引表區 該區共有6768個表項,每個表項由6個位元組構成,前4個位元組表示該表項對應漢字字形在庫中的絕對偏移位址,後兩個位元組為組成該漢字字形資料的位元組數。(2)空白區:該區每個位元組為0。(3)字形資料區:在字形資料區中,存放各漢字的字形資料,字形資料由若幹筆劃資料構成,每個筆劃資料由一個多邊形構成,其資料組織表現為多邊形起點以及辨別符和相鄰點問的相對位置,字形資料以壓縮形式存貯.

3.MT6253開啟矢量字型,6253平台已經支援矢量運算.預設矢量字庫 latin.ttf,現在模拟器如下圖:

MTK矢量字庫與研究

(短信符号選擇視窗,出現很多空白符号.)

根據代碼空白處應該顯示如下字元:

const U8 *SymbolPickerSymbols[SYMBOL_PICKER_DEFAULT_SYMBOLS] =

{

(U8 *) "/x2e/0/0",

(U8 *) "/x2c/0/0",

(U8 *) "?/0/0",

(U8 *) "!/0/0",

(U8 *) "/'/0/0",

(U8 *) "/"/0/0",

(U8 *) "(/0/0",

(U8 *) ")/0/0",

(U8 *) "@/0/0",

(U8 *) "///0/0",

(U8 *) "//0/0",

(U8 *) ":/0/0",

(U8 *) "_/0/0",

(U8 *) ";/0/0",

(U8 *) "+/0/0",

(U8 *) "-/0/0",

(U8 *) "*/0/0",

(U8 *) "=/0/0",

(U8 *) "%/0/0",

(U8 *) "&/0/0",

(U8 *) "</0/0",

(U8 *) ">/0/0",

(U8 *) "/xa3/0/0",

(U8 *) "/x24/0/0",

(U8 *) "/xa5/0/0",

(U8 *) "/xa7/0/0",

/* (U8*)"/xa2/0/0", */

(U8 *) "/xac/x20/0/0",

(U8 *) "/xa4/0/0",

(U8 *) "[/0/0",

(U8 *) "]/0/0",

(U8 *) "{/0/0",

(U8 *) "}/0/0",

(U8 *) "~/0/0",

(U8 *) "#/0/0",

(U8 *) " /0/0",

(U8 *) "/n/0/0",

/* (U8*)" /0/0", */

};

找到對應符号的Microsoft unicode碼,例如Enter鍵((U8 *) "/n/0/0",)沒顯示,對應Microsoft unicode碼應是$0085,這裡以Macintosh 羅馬語,Microsoft Unicode平台為例.在latin.ttf字庫裡新增一個Enter鍵.

MTK矢量字庫與研究

設定好Unicode映射表.

MTK矢量字庫與研究

ok,其它幾個字元類似用上述方法,重新編譯工程,make resgen 再make r,見模拟器圖檔效果.

MTK矢量字庫與研究

全部顯示出來咯,另外本身ttf字庫是由每個字由若幹筆劃或筆劃的連通體組成,庫中存放的即是這些線段的端點坐标, 由于每個筆劃的折線數不一樣,每個字的筆劃數也不同+字在庫中所占的長度是不相等的。是以定位方法與點陣字庫定位方法不同。字形輸出時,經常進行各種變換,如平移、縮放、旋轉、傾斜、投影等,利用矢量或曲線字庫,算法簡單、速度快、失真小,是以效果好,可以産生高品質的字輸出。同時增加字庫本身占用記憶體.可以利用fontcreat等工具,對字型剪裁,平台支援壓縮.因為項目中隻用到标準英文字庫,我删掉了其它語言的支援.如圖:

MTK矢量字庫與研究

這樣可以減小5K左右的記憶體空間,呵,空間緊張,減少多少是多少..