装载bitmap文件,使用bitmap图案构建span生成器,对面进行填充。代码如下: #include "platform/agg_platform_support.h" #include "agg_basics.h" #include "agg_rendering_buffer.h" #include "agg_pixfmt_rgb.h" #include "agg_alpha_mask_u8.h" #include "agg_pixfmt_amask_adaptor.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_scanline_u.h" #include "agg_renderer_scanline.h" #include "agg_ellipse.h" #include "agg_conv_contour.h" #include "agg_conv_stroke.h" #include "agg_conv_dash.h" #include "agg_conv_transform.h" #include "platform/win32/agg_win32_bmp.h" #include "agg_span_allocator.h" #include "agg_span_image_filter_rgb.h" #include "agg_span_interpolator_trans.h" #include "agg_span_interpolator_persp.h" #include "agg_span_interpolator_linear.h" enum { flip_y = true}; class the_application : public agg::platform_support { public: the_application(agg::pix_format_e format, bool flip_y): agg::platform_support(format,flip_y) {} virtual ~the_application() { } virtual void on_init(){} virtual void on_draw() { unsigned i; //renderer buffer agg::rendering_buffer rbuf = this->rbuf_window(); //renderers agg::pixfmt_bgr24 pixf(rbuf);//底层像素渲染对象,对渲染内存进行包装了 typedef agg::renderer_base<agg::pixfmt_bgr24> ren_base_type;//底层渲染器 ren_base_type ren_base(pixf); ren_base.clear( agg::rgba8(255,255,255) );//清除buffer背景色 typedef agg::renderer_scanline_aa_solid<ren_base_type> renderer_scanline_type;//高层渲染器 renderer_scanline_type ren_scanline(ren_base); //装载图案作为生成span生成器的source agg::pixel_map pm_img;//可以load进bitmap pm_img.load_from_bmp("e://test.bmp"); //构建图案的renderer agg::rendering_buffer rbuf_img( pm_img.buf(), pm_img.width(), pm_img.height(),pm_img.stride() ); agg::pixfmt_rgb24 pixf_img(rbuf_img); //线段分配器 typedef agg::span_allocator<agg::rgba8> span_allocator_type; span_allocator_type span_alloc; //透视变换的插值器 typedef agg::span_interpolator_persp_lerp<> span_interp_type; const double offset(0); const double scale(0.1); double src[8] = {offset,offset, offset+pixf_img.width()*scale, offset, offset+pixf_img.width()*scale, offset+pixf_img.height()*scale, offset, offset+pixf_img.height()*scale}; double dest[8] = {0,0-180, pixf.width(), 0-180, pixf.width(), pixf.height()-180, 0, pixf.height()-180}; span_interp_type span_interp(src,dest); //span生成器,使用图案作为span生成器 typedef agg::span_image_filter_rgb_bilinear_clip<agg::pixfmt_rgb24,span_interp_type> span_gen_type; span_gen_type span_gen(pixf_img, agg::rgba8(255,255,255), span_interp); //组合成渲染器 agg::renderer_scanline_aa< ren_base_type, span_allocator_type, span_gen_type > img_renderer(ren_base, span_alloc, span_gen); //vertex source agg::ellipse ell(0,0, 120, 90);//定义一个圆vertex source //vertex source 仿射变换 agg::trans_affine imx; imx.translate(150, 150); typedef agg::conv_transform<agg::ellipse> ell_ct_type; ell_ct_type ctell(ell, imx); //轮廓 typedef agg::conv_contour<ell_ct_type> ell_cc_type; ell_cc_type ccell(ctell); // typedef agg::conv_stroke<ell_ct_type> ell_cs_type; ell_cs_type csccell(ctell); csccell.width(1);//con_stroke的width属性决定线宽度 agg::rasterizer_scanline_aa<> ras;//Polygon rasterizer, which including a clipper agg::scanline_u8 sl;//非封装扫描线容器,rasterizer use it to render the render_buffer //使用图案填充 ras.add_path(ctell); agg::render_scanlines( ras, sl, img_renderer ); //椭圆轮廓线 ras.add_path(csccell);//添加路径 ren_scanline.color( agg::rgba8(50,40,23) ); agg::render_scanlines( ras, sl, ren_scanline );//ras使用sl中的span渲染ren_scanline } }; int agg_main(int argc, char* argv[]) { the_application app(agg::pix_format_bgr24, flip_y); app.caption("My AGG Demo"); if(app.init(300, 300, agg::window_resize )) { app.run(); } return 1; } 效果图: