AGG的字符输出
字符输出,对于AGG来说,这个功能可以处于显示流程的 不同位置。比如字体引擎可直接处于“Scanline Rasterizer”层向渲染器提供已处理完毕的扫描线,也可以处于“Vertex Source顶点源”层提供字体的顶点数据。
下面,我们开始学习AGG不同的字符输出方式。如没有特殊说明,所以示例代码都基于此处代码
方式一、使用gsv_text对象
gsv_text属于顶点源层的对象,它的用法也很简单,直接看下例:
引用头文件:#include <agg_gsv_text.h>
在on_draw()方法的最后加入下面的代码
-
- agg::gsv_text txt;
- agg::conv_stroke<agg::gsv_text> cstxt(txt);
-
- txt.flip(true);
- txt.size(18);
-
- txt.start_point(20,100);
- txt.text("cpp");
-
- ras.add_path(cstxt);
- agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba(1,0,0));
-
- txt.start_point(20+txt.text_width(),100);
- txt.text("prog.com");
-
- ras.add_path(cstxt);
- agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba(0,0,1));
显示效果
注:gsv_text的flip ()方法指出是否上下反转输出,这里设置了flip是因为在Windows下agg::platform_support的rbuf_window()其 实是一个DIB缓存,它的方向是从下到上的。
gsv_text必须用conv_stroke转 换才能正确输出文字,否则会被当作多边形处理。为了使用方便,AGG提供了gsv_text_outline包 装,它实现了conv_stroke和坐标转换,代码很短:
- template<class Transformer = trans_affine> class gsv_text_outline
- {
- public:
- gsv_text_outline(gsv_text& text, const Transformer& trans) :
- m_polyline(text),
- m_trans(m_polyline, trans){}
- void width(double w){
- m_polyline.width(w);
- }
- void transformer(const Transformer* trans){
- m_trans->transformer(trans);
- }
- void rewind(unsigned path_id) {
- m_trans.rewind(path_id);
- m_polyline.line_join(round_join);
- m_polyline.line_cap(round_cap);
- }
- unsigned vertex(double* x, double* y) {
- return m_trans.vertex(x, y);
- }
- private:
- conv_stroke<gsv_text> m_polyline;
- conv_transform<conv_stroke<gsv_text>, Transformer> m_trans;
- };
我们使用gsv_text_outline重写上面的代码:
- #include <agg_gsv_text.h>
- #include <agg_trans_single_path.h>
- ...
-
-
- agg::gsv_text txt;
- agg::trans_single_path tran_path;
- agg::gsv_text_outline<agg::trans_single_path> txtol(txt,tran_path);
-
- tran_path.add_path(ell);
-
-
- txt.flip(true);
- txt.size(24);
-
- txt.start_point(0,0);
- txt.text("cpp");
-
- ras.add_path(txtol);
- agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba(1,0,0));
-
- txt.start_point(0+txt.text_width(),0);
- txt.text("prog.com");
-
- ras.add_path(txtol);
- agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba(0,0,1));
显示效果
gsv_text的使用很简单,不过要了解的一点是:它只能输出ASCII可显示字符,对于汉字是无能为力的(你可以试试输出"C++编程")。如果要输出汉字,我 们得继续寻找其它字符输出方式。