【渲染引擎】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的具體層次劃分在上一篇文章
在使用字型的時候需要首先載入初始化字型。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”倆個字型佔據的字型寬度肯定不同,所以在繪製字型的時候有個獲取真是字型寬度的流程。