【渲染引擎】agg字体介绍

时间:2021-09-23 05:38:56

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”俩个字体占据的字体宽度肯定不同,所以在绘制字体的时候有个获取真是字体宽度的流程。