AGG学习之一----直接操作渲染的内存区

    技术2022-05-20  51

    看了  天秤座的唐风  对AGG文档的翻译,决定自己下载源代码、码几个example试试。

     

    对AGG中的render_buffer讲解我就不在赘述了,http://www.cnblogs.com/liyiwen/archive/2010/06/03/1751094.html 写的非常清晰。

     

    在使用VS2008建立测试example时,由于其官方代码要求输出PPM格式文件,而我在需找PPM图片浏览器未果,所以决定使用AGG中提供的platform_support直接在Window窗口中显示操作效果。

    另外,需要注意一些问题:

    1.建立空白project,不需要预编译头

    2.建立的project默认为UNICODE,需要更改为未设置

    3.将AGG/include目录设置为附加包含目录。  配置属性-->c/c++ -->常规

    4.编译时,需要其他文件,请自行添加到工程中(此example仅添加agg_platform_support.cpp、agg_trans_affine.cpp、agg_win32_bmp.cpp三个文件)

     

    代码如下:

    // test.cpp : 定义控制台应用程序的入口点。 // #include "agg_rendering_buffer.h" #include "agg_basics.h" #include "platform/agg_platform_support.h" enum { flip_y = true, }; void draw_black_frame(agg::rendering_buffer& rbuf) { unsigned i; for (i=0; i<rbuf.height(); ++i) { unsigned char * p = rbuf.row_ptr(i); *p++=0; *p++=0; *p++=0; p += (rbuf.width()-2)*3; *p++=0; *p++=0; *p++=0; } memset( rbuf.row_ptr(0), 0, rbuf.width()*3 ); memset( rbuf.row_ptr(rbuf.height()-1), 0, rbuf.width()*3 ); } 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() { agg::rendering_buffer rbuf = this->rbuf_window(); memset(rbuf.row_ptr(0), 255, rbuf.width()*rbuf.height()*3); unsigned i; for (i=0; i<rbuf.height()/2; ++i) { unsigned char *p = rbuf.row_ptr(i); p += i*3; *p++ = 127; *p++ = 200; *p++ = 98; } draw_black_frame(rbuf); } }; int agg_main(int argc, char* argv[]) { the_application app(agg::pix_format_bgr24, flip_y); app.caption("My AGG Demo"); if(app.init(320, 200, agg::window_resize )) { app.run(); } return 1; }

     

    运行效果图如下:

     

     

    在添加、修改些代码,让边框缩小20个像素。

    代码如下:

    #include "agg_rendering_buffer.h" #include "agg_basics.h" #include "platform/agg_platform_support.h" enum { flip_y = true, }; void draw_black_frame(agg::rendering_buffer& rbuf) { unsigned i; for (i=0; i<rbuf.height(); ++i) { unsigned char * p = rbuf.row_ptr(i); *p++=0; *p++=0; *p++=0; p += (rbuf.width()-2)*3; *p++=0; *p++=0; *p++=0; } memset( rbuf.row_ptr(0), 0, rbuf.width()*3 ); memset( rbuf.row_ptr(rbuf.height()-1), 0, rbuf.width()*3 ); } 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() { agg::rendering_buffer rbuf = this->rbuf_window(); memset(rbuf.row_ptr(0), 255, rbuf.width()*rbuf.height()*3); unsigned char * buf = rbuf.buf(); int w = rbuf.width(); int h = rbuf.height(); rbuf.attach(buf+w*3*20+3*20,缓冲区缩小 w-40, h-40, -w*3);//调整步长(Y轴方向调整) unsigned i; for (i=0; i<rbuf.height()/2; ++i)//绘制对角线 { unsigned char *p = rbuf.row_ptr(i); p += i*3; *p++ = 127; *p++ = 200; *p++ = 98; } draw_black_frame(rbuf); } }; int agg_main(int argc, char* argv[]) { the_application app(agg::pix_format_bgr24, flip_y); app.caption("My AGG Demo"); if(app.init(320, 200, agg::window_resize )) { app.run(); } return 1; }

     

    效果图如下:


    最新回复(0)