FreeType 學習筆記

2021-06-04 23:17:47 字數 4464 閱讀 1575

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等。筆畫字型 不討論。輪廓字型 即向量字型,利用字型輪廓及...