组合类线段生成器
头文件
- #include <agg_span_converter.h>
类型
- template<class SpanGenerator, class SpanConverter>
- class agg::span_converter;
span_converter的作用是组合两种生成器,比如先由图案类线段生成器产生图案,然后由色彩类线段生成器产生半透明色叠加在图案上。
下面的演示代码演示了怎样组合span_image_filter_rgb_bilinear_clip和span_gradient_alpha两种生成器
演示代码,同样基于这个代码,加入下面的头文件
#include "agg_span_allocator.h"
#include "agg_span_gradient_alpha.h"
#include "agg_span_converter.h"
#include "span_image_filter_rgb_bilinear_clip.h"
在on_draw()方法的最后加上下面这些代码
agg::pixel_map pm_img;
if(pm_img.load_from_bmp("d://spheres.bmp"))
{
// pm_img里的图案作为填充来源
agg::rendering_buffer rbuf_img(
pm_img.buf(),
pm_img.width(), pm_img.height(),
-pm_img.stride());
agg::pixfmt_bgr24 pixf_img(rbuf_img);// 我用的bmp是24位的
// 线段分配器
typedef agg::span_allocator<agg::rgba8> span_allocator_type;//分配器类型
span_allocator_type span_alloc; // span_allocator
// 插值器
typedef agg::span_interpolator_linear<> interpolator_type; //插值器类型
agg::trans_affine img_mtx; // 变换矩阵
interpolator_type ip_img(img_mtx); // 插值器
agg::trans_affine alpha_mtx; // 变换矩阵
interpolator_type ip_alpha(alpha_mtx); // 插值器
// 渐变方式
typedef agg::gradient_x gradientF_type;
gradientF_type grF;
typedef std::vector<agg::int8u> alphaF_type;
alphaF_type alphaF(256);
for(int i=0; i<256; i++) alphaF[i] = i;
// Alpha线段生成器
typedef agg::span_gradient_alpha<agg::rgba8,
interpolator_type,
gradientF_type,
alphaF_type> alpha_span_gen_type;
alpha_span_gen_type alpha_span_gen(ip_alpha,grF,alphaF,0,150);
// 图案线段生成器
typedef agg::span_image_filter_rgb_bilinear_clip<agg::pixfmt_bgr24,
interpolator_type > pic_span_gen_type;
pic_span_gen_type pic_span_gen(pixf_img, agg::rgba(0,1,0), ip_img);
// 使用span_converter组合成新的线段生成器
typedef agg::span_converter<pic_span_gen_type, alpha_span_gen_type> span_gen_type;
span_gen_type span_gen(pic_span_gen,alpha_span_gen);
// 组合成渲染器
agg::renderer_scanline_aa<
renderer_base_type,
span_allocator_type,
span_gen_type
> my_renderer(renb, span_alloc, span_gen);
// 插值器的矩阵变换
img_mtx.scale(0.5);
img_mtx.translate(40,40);
img_mtx.invert(); //注意这里
// 用我们的渲染器画圆
ras.add_path(ccell);
agg::render_scanlines(ras,sl,my_renderer);
}
显示效果
<<待续>>
作者:毛毛 来源:www.cppprog.com