gtk+(基於directfb)的字型繪製是通過pango+freetype+fontconfig三者協作來完成的,其中,fontconfig負責字型的管理和配置,freetype負責單個字元的繪製,pango則完成對文字的排版布局。而我對這一部分的了解,基本上是空白的。這兩天為了解決乙個關於字型的bug,花了一些時間閱讀相關資料,這裡記錄一些freetype的學習筆記。
儘管點陣字型在時間和空間效能上都有較佳的表現,但是由於缺乏靈活性,無法改變字型的大小和風格,除了在一些嵌入式裝置中仍然在使用外,大多數系統都使用向量字型了。向量字型不像點陣字型那樣直接記錄字元的字模資料,而是記錄字型描述資訊,其中最重要的兩部分是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,
/* first byte in memory */
size,
/* size in bytes */
0,
/* face_index */
&face );
4.設定字型的大小
error = ft_set_char_size(
face,
/* handle to face object */
0,
/* char_width in 1/64th of points */
16*64,
/* char_height in 1/64th of points */
300,
/* horizontal device resolution */
300 );
/* vertical device resolution */
error = ft_set_pixel_sizes(
face,
/* handle to face object */
0,
/* pixel_width */
16 );
/* pixel_height */
5.載入字元的glyph
glyph_index = ft_get_char_index( face, charcode );
error = ft_load_glyph(
face,
/* handle to face object */
glyph_index,
/* glyph index */
load_flags );
/* load flags, see below */
error = ft_render_glyph( face->glyph,
/* glyph slot */
render_mode );
/* render mode */
6.字型變換(旋轉和縮放)
error = ft_set_transform(
face,
/* target face object */
&matrix,
/* pointer to 2x2 matrix */
&delta );
/* pointer to 2d vector */
7.把字元顯示出來(與具體實現有關)
draw_bitmap( &slot->bitmap,
pen_x + slot->bitmap_left,
pen_y - slot->bitmap_top );
Freetype 學習筆記 轉2
儘管點陣字型在時間和空間效能上都有較佳的表現,但是由於缺乏靈活性,無法改變字型的大小和風格,除了在一些嵌入式裝置中仍然在使用外,大多數系統都使用向量字型了。向量字型不像點陣字型那樣直接記錄字元的字模資料,而是記錄字型描述資訊,其中最重要的兩部分是outline和hint。字型的outline 輪廓 ...
freetype 使用小結
freetype是乙個完全開源的 可擴充套件 可定製且可移植的字型引擎,它提供truetype字型驅動的實現統一的介面來訪問多種字型格式檔案,包括點陣字 truetype opentype type1 cid cff windows fon fnt x11 pcf等。freetype函式庫具有以下特...
初探freetype字型庫
文字的顯示依賴於字型字型檔,大致的字型字型檔分為點陣字型檔 筆畫字型檔和輪廓字型檔。點陣字型檔 缺點比較明顯,縮放存在鋸齒,渲染旋轉等操作相對複雜,且效果不理想,先大多用在嵌入式行業 基本拋棄 常見格式有bdf,pcf,fnt,hbf,hzf等。筆畫字型 不討論。輪廓字型 即向量字型,利用字型輪廓及...