AGG 线段生成器(Span Generator)
来源:互联网 发布:苹果win7装回mac系统 编辑:程序博客网 时间:2024/05/17 22:43
线段生成器(Span Generator)
我们前面举的例子使用的都是简单的单一实色,如蓝色的圆、黑色的线等。这是因为在例子里我们一直使用renderer_scanline_aa_solid或render_scanlines_aa_solid。
在上篇文章(http://www.cppprog.com/2009/0821/150.html)的渲染器一节中除了renderer_scanline_aa_solid外,还提到有一个renderer_scanline_aa,这里再写一遍它的声明:
- template<class BaseRenderer, class SpanAllocator, class SpanGenerator>
- class renderer_scanline_aa;
另外,还有一个函数版本:
- template<class Rasterizer, class Scanline, class BaseRenderer,
- class SpanAllocator, class SpanGenerator>
- void render_scanlines_aa(Rasterizer& ras, Scanline& sl, BaseRenderer& ren,
- SpanAllocator& alloc, SpanGenerator& span_gen);
renderer_scanline_aa (还有一个兄弟版本renderer_scanline_bin)可以按指定的图案或不同的颜色(如渐变)填充顶点源里的多边形。其中的模板参数 SpanAllocator用于准备span,我们直接使用agg::span_allocator就行。这里的SpanGenerator就是本节要说的线段生成器,它决定了最终用什么东西填到rendering_buffer里。
线段生成器品种很多,常用的在致可以分成图案类和色彩类两大部分:图案类线段生成器使用已有图像作为span来源;色彩类线段生成器使用指定的颜色作为span来源。
图案类线段生成器
头文件
- #include <agg_span_image_filter_gray.h>
- #include <agg_span_image_filter_rgb.h>
- #include <agg_span_image_filter_rgba.h>
- #include <agg_span_pattern_gray.h>
- #include <agg_span_pattern_rgb.h>
- #include <agg_span_pattern_rgba.h>
类型
- template<class Source, class Interpolator>
- span_image_filter_[gray|rgb|rgba]
- template<class Source, class Interpolator>
- span_image_filter_[gray|rgb|rgba]_2x2
- template<class Source, class Interpolator>
- span_image_filter_[gray|rgb|rgba]_bilinear
- template<class Source, class Interpolator>
- span_image_filter_[gray|rgb|rgba]_bilinear_clip
- template<class Source, class Interpolator>
- span_image_filter_[gray|rgb|rgba]_nn
- template<class Source, class Interpolator>
- span_image_resample_[gray|rgb|rgba]
- template<class Source>
- span_image_resample_[gray|rgb|rgba]_affine
- template<class Source>
- class agg::span_pattern_[gray|rgb|rgba]
上面这些线段生成器类的模板参数都比较相似:Source用于指定图像来源,可以是PixelFormat renderer或agg::image_accessor_clip(由不同的线段生成器类决定);Interpolator是一种插值器,用于填充图像间隙。我们先写一段示例代码,先看一下线段生成器的作用,也为后面的各种实验做准备。
示例代码,使用span_image_filter_rgb_bilinear_clip
还是基于这个代码(http://www.cppprog.com/2009/0816/146.html),加入下面的头文件
- #include <platform/win32/agg_win32_bmp.h>
- #include "agg_span_allocator.h"
- #include "agg_span_image_filter_rgb.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_mtx); // 插值器
- // 线段生成器
- typedef agg::span_image_filter_rgb_bilinear_clip<agg::pixfmt_bgr24,
- interpolator_type > span_gen_type; // 这个就是Span Generator
- span_gen_type span_gen(pixf_img, agg::rgba(0,1,0), ip);
- // 组合成渲染器
- 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(ell);
- agg::render_scanlines(ras,sl,my_renderer);
- }
其中的d://spheres.bmp(下载)是我预先放在D盘里的24位bmp图像,作为填充的来源。
显示效果:
- 在第19行的span_gen_type之前,所有的事情都在为定义这个线段生成器做准备。
- 首先是用pixel_map读取bmp文件,然后生成rendering_buffer和pixfmt_bgr24作为这个线段生成器的"Source"。
- 然后是线段分配器,这个没什么特殊要求的话用span_allocator就可以了。
- 接着是插值器类型,插值器也有几个类型(后面会介绍),它的构造函数需要一个变换矩阵对象,于是我们得为它装备一个。
- 现在,终于可以组合成一个我们的线段生成器了。这里使用的是span_image_filter_rgb_bilinear_clip,它的Source是PixelFormat Renderer,如本例的pixfmt_bgr24。
- span_image_filter_rgb_bilinear_clip的构造函数有三个参数,分别是Source对象,填充来源范围之外的颜色和插值器对象。
- 我们可以改变插值器的矩阵来变换填充图像,象这里的img_mtx.scale(0.5)和img_mtx.translate(40,40)。要注意的是,插值器的矩阵运算是从目标位置向源位置计算的(即根据目标位置变换得到对应的填充源位置),所以想对源图像变换的话,要记得最后调用矩阵的invert()方法取反。
- 最后,画圆。由于ell是ellipse对象,没有被conv_stroke转换的ellipse对象是实心的(多边形而不是多义线),于是填充之。
作者:毛毛 来源:www.cppprog.com
- AGG 线段生成器(Span Generator)
- AGG 色彩类线段生成器
- AGG 组合类线段生成器
- 生成器 generator
- 生成器generator
- 生成器generator
- 生成器generator
- Hibernate主键生成器generator
- [Python]生成器(generator)
- Load Generator负载生成器
- Python 生成器 generator
- python生成器Generator
- cmake 生成器(generator)
- Load Generator负载生成器
- Java笔记---生成器Generator
- Python-----生成器:generator
- Python 生成器 generator
- Mybatis Generator(代码生成器)
- awk 函数 实现数字转换为ip
- 多线程处理:创建用户界面线程
- SourceInsight使用技巧
- .net同时Eval两个数值方法
- AGG 渲染缓存(Rendering Buffer)
- AGG 线段生成器(Span Generator)
- 毕业后五年拉开差距的原因
- 我的右键“设为桌面背景”按键没了,就用 regsvr32 shimgvw.dll 一条指令搞定了
- 全自动Ubuntu批量安装
- AGG 插值器(Interpolator)
- 税金计算方法
- 乔布斯办公室语录
- Velocity学习笔记
- 我也来开个技术类blog了