实验代码,使用gradient_lut实现多颜色渐变
把示例代码的渐变颜色部分改成这样: ?? ...
?? // 渐变颜色
?? //typedef agg::gradient_linear_color
?? //colorF_type colorF(agg::rgba(1,1,1), agg::rgba(0,0,1));//白色到蓝色 ?? typedef agg::gradient_lut<
?? agg::color_interpolator
?? colorF.add_color(0, agg::rgba(1,1,1)); ?? colorF.add_color(0.2, agg::rgba(1,0,0)); ?? colorF.add_color(0.4, agg::rgba(0,1,0)); ?? colorF.add_color(0.8, agg::rgba(0,0,1)); ?? colorF.build_lut(); ?? ... 显示效果
渐变方式
除本例中的gradient_radial_focus以外,AGG还提供了很多渐变方式,它们都定义在#include
修改演示代码的渐变方式是很简单的,如: ?? ...
?? // 渐变方式
?? //typedef agg::gradient_radial_focus gradientF_type; ?? //gradientF_type grF(1, 0.1, 0.5); ?? typedef agg::gradient_x gradientF_type; ?? gradientF_type grF; ?? ...
这里是其中的一部分AGG自带渐变方式以及显示效果
gradient_x
gradient_y
gradient_diamond
gradient_xy
gradient_conic
gradient_radial
本节的最后,再介绍一下其它几个色彩类的线段生成器
? span_solid没什么好说的,实色填充而已
? span_gradient_alpha是透明度渐变,参数和span_gradient差不多,区别是ColorF改成了AlphaF,“operator []()”返回值也由颜色结构变为的透明度数值。
? span_gouraud_rgba 高氏三角着色,需指定三角形的三个顶点和三种颜色,用法见下例
?? // 色彩类线段生成器demo ?? // 线段分配器
?? typedef agg::span_allocator
?? typedef agg::span_gouraud_rgba
?? //三种颜色 ?? ?? ?? ??
span_gen.colors( agg::rgba(1,0,0), agg::rgba(0,1,0), agg::rgba(0,0,1)
?? );
?? //三角形三个顶点 ?? span_gen.triangle( ?? 100,50, ?? 130,125, ?? 70,125,0 ?? );
?? agg::renderer_scanline_aa< ?? renderer_base_type, ?? span_allocator_type, ?? span_gen_type
?? > my_renderer(renb, span_alloc, span_gen); ??
?? ras.add_path(ell);
?? agg::render_scanlines(ras,sl,my_renderer);
显示效果
组合类线段生成器
头文件
? #include
? template
span_converter的作用是组合两种生成器,比如先由图案类线段生成器产生图案,然后由色彩类线段生成器产生半透明色叠加在图案上。
下面的演示代码演示了怎样组合span_image_filter_rgb_bilinear_clip和span_gradient_alpha两种生成器
演示代码,同样基于这个代码,加入下面的头文件
? #include \
? #include \? #include \
? #include \在on_draw()方法的最后加上下面这些代码 ? agg::pixel_map pm_img;
? if(pm_img.load_from_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
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
?? for(int i=0; i<256; i++) alphaF[i] = i; ??
?? // Alpha线段生成器 ?? ?? ?? ??
typedef agg::span_gradient_alpha 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 pic_span_gen_type pic_span_gen(pixf_img, agg::rgba(0,1,0), ip_img); // 使用span_converter组合成新的线段生成器 typedef agg::span_converter 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); ?? } 显示效果