FreeType是一個完全開源的、可擴充、可定製且可移植的字型引擎,它提供
TrueType字型驅動的實現統一的介面來訪問多種字型格式檔案,包括點陣字、TrueType、OpenType、Type1、
CID、CFF、Windows FON/FNT、X11 PCF等。FreeType函數庫具有以下特點:
(1)它使得客戶應用程式可以方便地訪問字型檔,無論字型檔儲存在哪
裡,並且與字型格式無關。
(2)能方便地提取全域字型資料,這些資料普遍存在於一般的字型格式中。
(例如:全域度量標準,字元編碼/字元對應表,等等)
(3)能方便地提取某個字元的字形資料(度量標準,映像,名字等其他任何
資料)
(4)具備訪問字型格式特定的功能(例如:SFNT表,多重控制,OpenType
輪廓表)
使用FreeType引擎來顯示字元的流程.2所示(FreeType Team,2008)。
首先需要初始化FreeType庫,然後依次根據字元的編碼處理一個字元,把它
轉化為點陣的位元影像資訊,最後根據字元的資訊,在相應的地方把它顯示出來。
根據以上流程圖相應的函數如下:
(1)首先對FreeType庫進行初始化,並且讀取向量字型檔檔案。
FT_Init_FreeType(&library);//建立新的庫對象,準備作其他動作時使用
FT_New_Face(library,filename,0,&face);
FT_Init_FreeType()他會預設地註冊一些模組。這個方式中,模組列表在構
建時動態計算,並依賴ftinit組件的內容。
FT_New_Face()通常用來建立外觀對象,如果函數調用成功,返回0。外觀對
象包含一些用來描述全域字型資料的屬性,可以被客戶程式直接存取。它包括外
觀中字形的數量、外觀家族的名稱、風格名稱、EM大小等。這個函數包括的參
數library是一個全域的變數,而filename是向量字型檔的路徑(c檔案路徑名)。
這裡通過以上兩個步驟首先建立了FreeType庫的一個執行個體。然後使用一個字
庫檔案來得到字型的face對象介面。
(2)得到face對象之後,需要設定當前字型的屬性,尺寸對象的內容可以通
過調用函數FT_Set_Pixel_Sizes()來改變。
當一個新的face對象建立時,對於可伸縮字型格式,size對象預設值為字元
大小水平和垂直均為10象素。對於定長字型格式,這個大小是未定義的,所以必
須在裝載一個字形前設定該值。
FT_Set_Pixel_Sizes(face,//當前face對象
16,//字元點陣寬度
16//字元點陣高度
);
以上函數把字元象素設定為16*16象素,因此最後的位元影像資訊就是16*16點陣
象素。
(3)設定完字型的屬性之後,需要得到字元的輪廓資訊。
一個face對象包含一個或多個字元表(charmap),字元表是用來轉換字元碼到
字形索引的。TrueType字型檔通常包含兩個字元表,一個用來轉換Unicode字
符碼到字形索引,另一個用來轉換Apple Roman編碼到字形索引。這樣的字型既
可以用於Windows(使用Unicode),同時又可用於Macintosh(使用Apple Roman)。
另外需要注意,一個特定的字元表可能沒有覆蓋完字型裡面的全部字形。
當建立一個face對象時,它預設選擇Unicode字元表。根據字元的Unicode編
碼來得到它的glyph索引。代碼如下:
FT_Get_Char_Index(face,charcode);
這個函數會在face裡被選中的字元表中尋找與給出的字元碼對應的字形索
引。從face中來得到字元對應的glyph後,需要讀取到glyph slo(t儲存字形的對象:
字形槽)中才能使用。
FT_Load_Glyph(face,glyph_index,FT_LOAD_DEFAULT);
FT_Load_Glyph()的第三個參數是裝載標誌load_flags,其值是位標誌集合,
用來指示某些特殊操作的,預設值為FT_LOAD_DEFAULT即0。這個函數會設法
從face中裝載對應的字形映像。
然後通過FT_Get_Glyph()簡單地提取一個字形映像。
FT_Get_Glyph(face->glyph,&glyph);
最後把字形對象轉換成一個位元影像:
FT_Glyph_To_Bitmap(&glyph,FT_RENDER_MODE_NORMAL,0,1);
glyph是源字形控制代碼的地址;第二個參數是標準的渲染模式;第三個參數是
二維向量的指標,該二維向量是在轉換前用來平移源字形映像的,該指標為0時
表明渲染前不需要平移源字形;最後一個參數是一個布爾值,用來指示該函數是
否要銷毀源字形對象。
bitmap=(FT_BitmapGlyph)glyph;
經過轉化之後,字型的點陣資訊就存放在bitmap參數裡面,再把點陣資訊寫
入OSD的buffer中,即可顯示出相應的字元。
依據以上演算法,將FreeType應用到高清播放機中時,能正常顯示菜單介面字
幕。然而在播放影片的過程中,srt字幕顯示過慢,無法跟進視頻播放的進度,滯
後現象非常嚴重。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/saintevil/archive/2010/07/19/5747582.aspx