分享

AGG 组合类线段生成器

 lhzstudio 2011-10-15
AGG 组合类线段生成器
2010-07-11 22:05

组合类线段生成器

头文件

  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两种生成器

演示代码,同样基于这个代码,加入下面的头文件

  1. #include "agg_span_allocator.h"
  2. #include "agg_span_gradient_alpha.h"
  3. #include "agg_span_converter.h"
  4. #include "span_image_filter_rgb_bilinear_clip.h"

在on_draw()方法的最后加上下面这些代码

  1. agg::pixel_map pm_img;
  2. if(pm_img.load_from_bmp("d:\\spheres.bmp"))
  3. {
  4.     // pm_img里的图案作为填充来源
  5.      agg::rendering_buffer rbuf_img(
  6.          pm_img.buf(),
  7.          pm_img.width(), pm_img.height(),
  8.          -pm_img.stride());
  9.      agg::pixfmt_bgr24 pixf_img(rbuf_img);// 我用的bmp是24位的
  10.     // 线段分配器
  11.     typedef agg::span_allocator<agg::rgba8> span_allocator_type;//分配器类型
  12.      span_allocator_type span_alloc; // span_allocator
  13.     // 插值器
  14.     typedef agg::span_interpolator_linear<> interpolator_type; //插值器类型
  15.      agg::trans_affine img_mtx; // 变换矩阵
  16.      interpolator_type ip_img(img_mtx); // 插值器
  17.     
  18.      agg::trans_affine alpha_mtx; // 变换矩阵
  19.      interpolator_type ip_alpha(alpha_mtx); // 插值器
  20.     // 渐变方式
  21.     typedef agg::gradient_x gradientF_type;
  22.      gradientF_type grF;
  23.     typedef std::vector<agg::int8u> alphaF_type;
  24.      alphaF_type alphaF(256);
  25.     for(int i=0; i<256; i++) alphaF[i] = i;
  26.     // Alpha线段生成器
  27.     typedef agg::span_gradient_alpha<agg::rgba8,
  28.          interpolator_type,
  29.          gradientF_type,
  30.          alphaF_type> alpha_span_gen_type;
  31.      alpha_span_gen_type alpha_span_gen(ip_alpha,grF,alphaF,0,150);
  32.     // 图案线段生成器
  33.     typedef agg::span_image_filter_rgb_bilinear_clip<agg::pixfmt_bgr24,
  34.          interpolator_type > pic_span_gen_type;
  35.      pic_span_gen_type pic_span_gen(pixf_img, agg::rgba(0,1,0), ip_img);
  36.     // 使用span_converter组合成新的线段生成器
  37.     typedef agg::span_converter<pic_span_gen_type, alpha_span_gen_type> span_gen_type;
  38.      span_gen_type span_gen(pic_span_gen,alpha_span_gen);
  39.     // 组合成渲染器
  40.      agg::renderer_scanline_aa<
  41.          renderer_base_type,
  42.          span_allocator_type,
  43.          span_gen_type
  44.      > my_renderer(renb, span_alloc, span_gen);
  45.     // 插值器的矩阵变换
  46.      img_mtx.scale(0.5);
  47.      img_mtx.translate(40,40);
  48.      img_mtx.invert(); //注意这里
  49.     // 用我们的渲染器画圆
  50.      ras.add_path(ccell);
  51.      agg::render_scanlines(ras,sl,my_renderer);
  52. }

显示效果

span_converter

<<待续>>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多