AGG高质量图形输出 下载本文

? mtx.rotate(agg::deg2rad(30)); // 旋转30度 ? mtx.translate(100,100); // 平移100,100

? typedef agg::conv_transform ell_ct_type; ?? ell_ct_type ctell(ell, mtx); // 矩阵变换 ??

?? typedef agg::conv_contour ell_cc_type; ?? ell_cc_type ccell(ctell); // 轮廓变换

??

?? typedef agg::conv_stroke ell_cc_cs_type; ?? ell_cc_cs_type csccell(ccell); // 转换成多义线

得到的图形是:

注:trans_affine不 仅仅用于源顶点的变换,在AGG库中有不少地方都能看到它。比如后面会讲到的线段(span)生成器,通过变换矩阵,就能够 自由变换填充于多边形之内的图案。

坐标转换管道

头文件

#include // conv_stroke #include // conv_dash #include // conv_marker #include // conv_curve #include // conv_contour

#include // conv_smooth_poly1.h #include // conv_bspline

#include // conv_transform

类型(演示程序基于基于此处代码)

template struct conv_stroke;

template struct conv_dash;

变成连续线 构造参数为

VertexSource

width属性决定线宽。

虚线

构造参数为

VertexSource

用add_dash设置虚线长度和间隔

与conv_stroke套用

在例 程的ell_cc_cs_type csccell(ccell); 后面加上csccell.width(3);线宽就会变成3。

// Coordinate conversion pipeline typedef agg::conv_contour ell_cc_type; ell_cc_type ccell(ell);

typedef agg::conv_dash ell_cd_type;

ell_cd_type cdccell(ccell);

cdccell.add_dash(5,5);

typedef agg::conv_stroke ell_cc_cs_type;

ell_cc_cs_type csccell(cdccell); ...

template class conv_marker;

template struct conv_contour;

template struct

conv_smooth_poly1_curve;

建立标记

轮廓变换 构造参数为

VertexSource

width属性决定扩展或收缩轮廓。

圆滑过渡多边形各顶点(贝塞尔) 构造参数为

VertexSource

smooth_value属性决定圆滑度(默认为1)

请参考arrowhead示例代码

见例 程代码

在例 程on_draw()方法最后加入下面代码 triangle t(100,100,50);//自定义顶点源

agg::conv_smooth_poly1_curve cspct(t);

ras.add_path(cspct);

agg::render_scanlines_aa_solid( ras,sl,renb,agg::rgba8(255,0,0));

template struct conv_bspline;

template

class Curve3 = curve3, class Curve4 = curve4>

圆滑过渡多义线各顶点(贝塞尔) 构造参数为

VertexSource

interpolation_step属性决定步长。

可识别VertexSource中的曲线信息 构造参数为VertexSource。

三角形就变得圆头圆脑啦^_^

在例 程on_draw()方法最后加入下面代码 triangle t(100,100,50);

agg::conv_bspline cspct(t); ras.add_path(cspct);

agg::render_scanlines_aa_solid( ras,sl,renb,agg::rgba8(255,0,0));

三角形也能变得圆头圆脑

例程里的顶点都没有曲线信息,算了, 到后面讲到文字输出时会用到它的。

class conv_curve; conv_smooth_poly1_curve

就是基于它实现的。

见变换矩阵一节的例子

template

class conv_transform;

矩阵变换

用变换矩阵重新计算顶点位置 构造参数为

VertexSource和变换矩阵

Scanline Rasterizer

Scanline Rasterizer能够把顶点数据转换成一组水平扫描线,扫描线由一组线段(Span)组成,线段(Span)包含了起始位置、长度和覆盖率(可以理解 为透明度)信息。AGG的抗锯齿(Anti-Aliasing)功能也是在这时引入的。

扫描线Scanline

扫描线是一种保存span的容器,span用于表示一小条(水平方向)细线。图像中同一行的span组成一个Scanline。 头文件

#include // scanline_u8,scanline32_u8 #include // scanline_p8,scanline32_p8 #include // scanline_bin,scanline32_bin 类型

scanline_bin,scanline32_bin scanline_u8,scanline32_u8 scanline_p8,scanline32_p8 成员类型 struct span; typename

线段数据,其中的成员变量有:x起始位置,len长度,*covers覆盖率

span迭代器

不携带AA信息的span容器。scanline32_bin中的32代表坐标位数,一般16位已经足够了,所以前一版 本用得更多些(下同) unpacked版的span容器,用每个span来保存各自的线段信息 packed版的span容器,相同属性的span会合并成一个