儘管點陣字型在時間和空間效能上都有較佳的表現,但是由於缺乏靈活性,無法改變字型的大小和風格,除了在一些嵌入式裝置中仍然在使用外,大多數系統都使用向量字型了。向量字型不像點陣字型那樣直接記錄字元的字模資料,而是記錄字型描述資訊,其中最重要的兩部分是outline和hint。
字型的outline(輪廓):這是用來描述字型的基本手段,它一般由直線和貝塞爾(bézier)曲線組成。貝塞爾(bézier)曲線是一條由三個點確定的曲線,假設這三點的座標是(ax, ay)、(bx, by) 和(cx, cy),那麼曲線方程為:
px = (1-t)2.ax + 2t(1-t).bx + t2.cx
py = (1-t)2.ay + 2t(1-t).by + t2.cy
字型精調提示(hint)。outline已經描述字型的表現形式,但是數學上的正確對人眼來說並不見得合適,特別是縮放到特定的大小和解析度的時候,字型可能變得不好看,或者不清析。hint指的是一系列的技術,用來精調字型,讓字型變得更美觀,更清析。
在truetype字型中,hint是用一種程式語言來表述的,這種語言有點像組合語言,每個語句完成乙個單一的功能,通常用乙個虛擬機器來解釋執行。它具有下列特點:
l 支援迴圈。
l 支援條件分支。
l 支援使用者定義的函式。
l 支援以不同方式運算元據的指令集。
l 支援數學和邏輯指令集。
l 其它一些方法。
字元影射表(charmap)。字元對應的字型資料稱為glyph,字型檔案中通常帶有乙個字元對映表,用來把字元對映到對應glyph的索引值。因為字符集的編碼方式有多種,所以可以存在多個子對映表,以支援從不同編碼的字元到glyph索引的對映。如果某個字元沒有對應的glyph,返回索引0,glyph 0通常顯示乙個方塊或者空格。
向量字型有多種不同的格式,其中truetype用得最為廣泛。它的副檔名通常為otf或者ttf,它的檔案內容由幾部分組成,檔案頭、表目錄和表。檔案頭描述了版本號和表的數目等資訊,表目錄記錄了表的偏移量和大小,表則是表的實際資料。
檔案頭的格式為:
型別 名稱
描述 fixed
sfnt version
0x00010000 for version 1.0.
ushort
numtables
number of tables.
ushort
searchrange
(maximum power of 2 <= numtables) x 16.
ushort
entryselector
log2(maximum power of 2 <= numtables).
ushort
rangeshift
numtables x 16-searchrange.
而表目錄的結構為:型別
名稱 描述
ulong
tag4 -byte identifier.
ulong
checksum
checksum for this table.
ulong
offset
offset from beginning of truetype font file.
ulong
length
length of this table.
而表的內容則與具體的表有關,比如cmap表存放是的字元對映關係、fpgm表存放的是outline的函式庫、glyf表存放的是outline資料、而ebdt表存放的是嵌入式位圖。
表ebdt(嵌入式位圖)有什麼用呢,原來是這樣的,向量字型儘管可以任何縮放,但縮得太小時,仍然存在問題,字型會變得不好好看或者不清析,即使採用hint精調,效果也不一定好,或者那樣處理太麻煩了,這時可以採用點陣字型來彌補向量字型的不足,ebdt就是用來存放點陣字型的字模資料的。
向量字型的處理比較麻煩,即要進行向量計算,又進行精調處理,相對於點陣字型來說慢多了,會不會存在效能問題呢?可能會的,不過可以通過下列兩種方式緩解效能問題:
l cache法。把剛計算出來的glyph放到cache中,下次再用到這個字元時,直接從cache中取,而不用重新計算。
l 預先計算法。把常用值預先計算出來,放在hdmx等表中,這可以節省不少計算時間。
freetype是乙個操作字型的函式庫,它不但可以處理點陣字型,也可以處理多種向量字型,包括truetype字型,為上層應用程式提供了乙個統一的呼叫介面。freetype具有良好的可移植性,特別考慮了嵌入式應用環境,字型檔案可以在檔案系統中,也可以在rom中,甚至可以用自定義io函式來訪問字型資料。freetype採用模組化設計,很容易進行擴充和裁減,據說如果只支援truetype,裁減後的二進位制檔案大小只有25k。freetype是開放源**的,它採用freetype和gpl兩種開源協議,可以用於任何商業用途。
freetype的使用相對比較簡單:
1. 包含freetype的標頭檔案。
#include
#include ft_freetype_h
2. 初始化freetype
ft_library library;
error = ft_init_freetype( &library );
3. 載入字型
error = ft_new_face( library,
"/usr/share/fonts/truetype/arial.ttf",
0,&face );
或者error = ft_new_memory_face( library,
buffer,
size,
0,
&face );
4. 設定字型的大小
error = ft_set_char_size(
face,
0,
16*64,
300,
300 );
error = ft_set_pixel_sizes(
face,
0,
16 );
5. 載入字元的glyph
glyph_index = ft_get_char_index( face, charcode );
error = ft_load_glyph(
face,
glyph_index,
load_flags );
error = ft_render_glyph( face->glyph,
render_mode );
6. 字型變換(旋轉和縮放)
error = ft_set_transform(
face,
&matrix,
&delta );
7. 把字元顯示出來(與具體實現有關)
draw_bitmap( &slot->bitmap,
pen_x + slot->bitmap_left,
pen_y - slot->bitmap_top );
FreeType 學習筆記
gtk 基於directfb 的字型繪製是通過pango freetype fontconfig三者協作來完成的,其中,fontconfig負責字型的管理和配置,freetype負責單個字元的繪製,pango則完成對文字的排版布局。而我對這一部分的了解,基本上是空白的。這兩天為了解決乙個關於字型的b...
freetype的安轉和使用
1.tar xvj freetype 2.4.10.tar.bz2 2 cd freetype 2.4.10 3 configure 4 make 5 sudo make install usr local lib 1.如此時編譯 gcc show fontprint.c o show fontpr...
grep學習筆記轉
grep的工作方式是這樣的,它在乙個或多個檔案中搜尋字串模板。如果模板包括空格,則必須被引用,模板後的所有字串被看作檔名。搜尋的結果被送到螢幕,不影響原檔案內容。grep可用於shell指令碼,因為grep通過返回乙個狀態值來說明搜尋的狀態,如果模板搜尋成功,則返回0,如果搜尋不成功,則返回1,如果...