齐天大圣孙悟空第一部:AGG 渲染缓存(Rendering Buffer)
来源:百度文库 编辑:九乡新闻网 时间:2024/05/19 02:23:05
AGG 渲染缓存(Rendering Buffer)2010-07-11 21:45
unsigned height() const;
int stride() const;
unsigned stride_abs() const;返回宽、高、每行步幅int8u* row_ptr(int y)返回指向第y行起点的指针void clear(int8u value)以value值填充整个内存块template void copy_from(const RenBuf& src)从另一rendering_buffer中复制数据
Rendering Buffer
Rendering Buffer是一个内存块,用于保存图像数据。这是AGG与显示器之间的桥梁,我们要显示AGG图形实际上就是识别这个内存块并使用系统的API显示出来 而已(实际上几乎不需要做转换工作,因为无论是Windows还是Linux,API所用的图像存储格式与Rendering Buffer都是兼容的)。
头文件:
#include "agg_rendering_buffer.h"
类型:
rendering_buffer构造函数:
rendering_buffer(int8u* buf, unsigned width, unsigned height, int stride);
参数分别表示内存块指针,宽、高、每行的步幅(当步幅<0时,表示上下颠倒)
成员方法:
void attach(int8u* buf, unsigned width, unsigned height, int stride);参数与构造函数相同int8u* buf();返回内存块指针unsigned width() const;unsigned height() const;
int stride() const;
unsigned stride_abs() const;返回宽、高、每行步幅int8u* row_ptr(int y)返回指向第y行起点的指针void clear(int8u value)以value值填充整个内存块template
实验代码(基于此处代码)
在on_draw()方法的最后加上:
- agg::int8u* p = rbuf.row_ptr(20);//得到第20行指针
- memset(p,0,rbuf.stride_abs());//整行以0填充
得到的图形是:
AGG与GDI显示
Rendering Buffer的图像存储方式和Windows的BMP是一样的,所以让AGG处理BMP是很简单的事情,下面的代码演示了怎样在HDC上显示AGG
- #include
- #include
- #include
- #include
- #include
- ...
- // 首先让系统生成一个32位的bmp缓存
- BITMAPINFO bmp_info;
- bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmp_info.bmiHeader.biWidth = width;
- bmp_info.bmiHeader.biHeight = height;
- bmp_info.bmiHeader.biPlanes = 1;
- bmp_info.bmiHeader.biBitCount = 32;
- bmp_info.bmiHeader.biCompression = BI_RGB;
- bmp_info.bmiHeader.biSizeImage = 0;
- bmp_info.bmiHeader.biXPelsPerMeter = 0;
- bmp_info.bmiHeader.biYPelsPerMeter = 0;
- bmp_info.bmiHeader.biClrUsed = 0;
- bmp_info.bmiHeader.biClrImportant = 0;
- HDC mem_dc = ::CreateCompatibleDC(hdc);
- void* buf = 0;
- HBITMAP bmp = ::CreateDIBSection(
- mem_dc,
- &bmp_info,
- DIB_RGB_COLORS,
- &buf,
- 0,
- 0
- );
- // 把bmp与mem_dc关联,这样AGG就可以和原生GDI一起工作了
- HBITMAP temp = (HBITMAP)::SelectObject(mem_dc, bmp);
- //============================================================
- // 以下是AGG代码
- agg::rendering_buffer rbuf;
- // 32位位图,每行字节数为width*4。
- // BMP是上下倒置的,为了和GDI习惯相同,最后一个参数是负值。
- rbuf.attach((unsigned char*)buf, width, height, -width*4);
- // 像素格式和renderer_base
- agg::pixfmt_bgra32 pixf(rbuf);
- agg::renderer_base renb(pixf);
- renb.clear(agg::rgba8(255, 255, 255, 255));
- // Scanline renderer
- agg::renderer_scanline_aa_solid > ren(renb);
- // Rasterizer & scanline
- agg::rasterizer_scanline_aa<> ras;
- agg::scanline_p8 sl;
- // 多义线(三角形)
- ras.move_to_d(20.7, 34.15);
- ras.line_to_d(398.23, 123.43);
- ras.line_to_d(165.45, 401.87);
- // 设置颜色后渲染
- ren.color(agg::rgba8(80, 90, 60));
- agg::render_scanlines(ras, sl, ren);
- //============================================================
- // 把bmp显示到hdc上,如果图片中有Alpha通道,可以使用AlphaBlend代替BitBlt。
- ::BitBlt(
- hdc,
- rt.left,
- rt.top,
- width,
- height,
- mem_dc,
- 0,
- 0,
- SRCCOPY
- );
- // 释放资源
- ::SelectObject(mem_dc, temp);
- ::DeleteObject(bmp);
- ::DeleteObject(mem_dc);
- #include
得到的图形是:
使用AGG提供的pixel_map类
如果你觉得上面的方法还是有点烦的话(这个要怪MS的API太麻烦),可以考虑用AGG友情提供的pixel_map类,用它操作 BMP方便多了。(要把[AGG]\src\platform\win32\agg_win32_bmp.cpp加入一起编译)
- #include
- #include
- #include
- #include
- #include
- #include
- ...
- CRect rc;
- GetClientRect(&rc);
- agg::pixel_map pm;
- pm.create(rc.right,rc.bottom,agg::org_color32);
- //============================================================
- // 以下是AGG代码
- agg::rendering_buffer rbuf;
- rbuf.attach(pm.buf(), pm.width(), pm.height(), -pm.stride());
- // 像素格式和renderer_base
- agg::pixfmt_bgra32 pixf(rbuf);
- agg::renderer_base renb(pixf);
- renb.clear(agg::rgba8(255, 255, 255, 255));
- // Scanline renderer
- agg::renderer_scanline_aa_solid > ren(renb);
- // Rasterizer & scanline
- agg::rasterizer_scanline_aa<> ras;
- agg::scanline_p8 sl;
- // 多义线(三角形)
- ras.move_to_d(20.7, 34.15);
- ras.line_to_d(398.23, 123.43);
- ras.line_to_d(165.45, 401.87);
- // 设置颜色后渲染
- ren.color(agg::rgba8(80, 90, 60));
- agg::render_scanlines(ras, sl, ren);
- //============================================================
- pm.draw(hdc);
- #include
AGG 渲染缓存(Rendering Buffer)
AGG 字体缓存管理器
AGG 渲染器(Renderers)
AGG 成果
AGG AGG与FreeType库
Z buffer 和 W buffer 簡介
AGG 插值器(Interpolator)
hibernate 缓存
AJAX缓存
stagefright框架(五)-Video Rendering
渲染悲伤
AGG 光栅化(Scanline Rasterizer)
AGG 线段生成器(Span Generator)
AGG 色彩类线段生成器
AGG 组合类线段生成器
Tuxedo数据buffer基本类型介绍
手动调整路由器的Buffer分配
asp.net 2.0 缓存(页面输出缓存)
设置IE缓存大小
如何清除缓存
如何清除缓存?
关于系统缓存
怎么清除DNS缓存?
CacheCls缓存的应用