1. 程式人生 > >【渲染引擎】agg字型介紹

【渲染引擎】agg字型介紹

agg字型可以使用第三方字型庫,比如Freetype或者window下的字型。當你選擇使用某種字型的時候,就必須把相應字型的標頭檔案包含進去。

 #include <agg_font_win32_tt.h> //for window
 #include <agg_font_freetype.h> //for freetype

這倆個檔案其實是提供了一個介面給agg,封裝了具體字型庫的實現。這樣就遮蔽了具體的字型庫的不同。這裡只介紹如何使用freetype。freetype是一個字型庫,現在freetype已經是freetype2了。
agg在繪製字型的時候有2種方式,一種是在渲染層(Scanline Rasterizer),一種是在頂點層。agg的具體層次劃分在上一篇文章

agg介紹中已有說明。在這裡不在展開。
在使用字型的時候需要首先載入初始化字型。freetype提供了load_font方法,用以字型引擎載入具體的字型。

bool load_font(const char* font_name,unsigned face_index,
    glyph_rendering ren_type,const char* font_mem = 0,
    const long font_mem_size = 0);

可以看出該方法主要接受三個引數,font_name字型名,選擇哪個字型face_index,包裝型別ren_type。

對於face_index來說,一個字型檔案裡可能有多種字型樣式,其實就是字型外觀。像‘Times New Roman Regular’和‘Times New Roman Italic’就是倆種不同的字型樣式。face_index就是告訴引擎具體採用哪一種樣式。一般都設定為0。
對於ren_type來說,其型別為glyph_rendering,是一個列舉型別屬於agg庫的一部分。其定義在agg_font_cache_manager.h標頭檔案中,共有五個屬性值:

enum agg::glyph_rendering{
     glyph_ren_native_mono,   //對應mono_adaptor_type
     glyph_ren_native_gray8,   //對應gray8_adaptor_type
     glyph_ren_outline,    //對應path_adaptor_type
     glyph_ren_agg_mono,   //對應mono_adaptor_type
     glyph_ren_agg_gray8    //對應gray8_adaptor_type
};

該引數主要是告訴字型引擎字型的包裝形式,相應的在freetype裡也有相應的引數與其對應,在上面的註釋中也分別說明了如何和freetype中的型別進行對應的。
對於繪製字型的時候,有倆個字型大小一個就是你給定的字型大小,另外一個就是繪製的時候真是字型大小。這個很好理解,比如對於“我”和“1”倆個字型佔據的字型寬度肯定不同,所以在繪製字型的時候有個獲取真是字型寬度的流程。