AGG 组合类线段生成器

组合类线段生成器

头文件
  1. #include <agg_span_converter.h>
类型
  1. template<class SpanGenerator, class SpanConverter>
  2. 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值