齐白:AGG 组合类线段生成器

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 15:19:02
AGG 组合类线段生成器2010-07-11 22:05

组合类线段生成器

头文件

  1. #include

类型

  1. template
  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 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 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         interpolator_type,
  28.          gradientF_type,
  29.          alphaF_type> alpha_span_gen_type;
  30.      alpha_span_gen_type alpha_span_gen(ip_alpha,grF,alphaF,0,150);
  31.     // 图案线段生成器
  32.     typedef agg::span_image_filter_rgb_bilinear_clip         interpolator_type > pic_span_gen_type;
  33.      pic_span_gen_type pic_span_gen(pixf_img, agg::rgba(0,1,0), ip_img);
  34.     // 使用span_converter组合成新的线段生成器
  35.     typedef agg::span_converter span_gen_type;
  36.      span_gen_type span_gen(pic_span_gen,alpha_span_gen);
  37.     // 组合成渲染器
  38.      agg::renderer_scanline_aa<
  39.          renderer_base_type,
  40.          span_allocator_type,
  41.          span_gen_type
  42.      > my_renderer(renb, span_alloc, span_gen);
  43.     // 插值器的矩阵变换
  44.      img_mtx.scale(0.5);
  45.      img_mtx.translate(40,40);
  46.      img_mtx.invert(); //注意这里
  47.     // 用我们的渲染器画圆
  48.      ras.add_path(ccell);
  49.      agg::render_scanlines(ras,sl,my_renderer);
  50. }

显示效果


<<待续>>