Freetype 學習筆記 轉2

2021-04-26 06:41:48 字數 3616 閱讀 7596

儘管點陣字型在時間和空間效能上都有較佳的表現,但是由於缺乏靈活性,無法改變字型的大小和風格,除了在一些嵌入式裝置中仍然在使用外,大多數系統都使用向量字型了。向量字型不像點陣字型那樣直接記錄字元的字模資料,而是記錄字型描述資訊,其中最重要的兩部分是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,如果...