AGG第十五课 agg::rounded_rect 渲染圆角矩形
发布时间:2023-05-17 20:21:32
AGG(Anti-Grain Geometry)是一种开源的2D图形库,可以用来生成高质量的图像。agg::rounded_rect是AGG库中的一个类,可以用来渲染具有圆角的矩形。在本课中,我们将介绍agg::rounded_rect的基本用法以及如何使用它来绘制圆角矩形。
agg::rounded_rect类的定义如下:
template<class Coord> class rounded_rect
{
public:
rounded_rect();
rounded_rect(double x, double y, double width, double height, double rx, double ry);
void rect(double x, double y, double width, double height);
void radius(double rx, double ry);
void normalize_radius();
void trim_by(const rounded_rect& r);
void trim_by(double x, double y, double width, double height);
double x() const;
double y() const;
double width() const;
double height() const;
double rx() const;
double ry() const;
bool is_empty() const;
void clear();
void move_to(double x, double y);
template<class VertexSource>
void render(VertexSource& vs) const;
};
这个类有几个成员函数用来设置矩形和圆角半径,可以用render函数渲染圆角矩形。
首先,我们需要设置圆角矩形的边界框和圆角半径:
agg::rounded_rect<double> rr(x, y, width, height, rx, ry);
这个语句创建了一个包含矩形左上角坐标(x,y)和宽度、高度(width,height)以及半径(rx,ry)的圆角矩形对象。
接着,我们可以通过调用rect函数来设置边界框:
rr.rect(x, y, width, height);
这个函数将矩形边界框的定义设置为左上角坐标为(x,y)的矩形,宽度和高度为(width,height)。
如果需要设置半径,可以调用radius函数:
rr.radius(rx, ry);
这里的rx和ry分别为横向和纵向的圆角半径。
现在,我们已经定义了一个圆角矩形对象,我们可以通过调用render函数将其渲染到画布上:
agg::render_scanlines(rr, sl_poly, ras, ren_base_color);
这里,我们用render_scanlines和render_base_color将圆角矩形渲染到画布上。
完整的圆角矩形绘制示例:
#include <agg_rendering_buffer.h>
#include <agg_scanline_p.h>
#include <agg_pixfmt_rgba.h>
#include "agg_basics.h"
#include "agg_rounded_rect.h"
#include "agg_renderer_scanline.h"
#include "agg_rasterizer_scanline_aa.h"
int main()
{
// define the buffer where to render
unsigned char* buffer = new unsigned char[320*240*4];
agg::rendering_buffer rendering_buffer(buffer, 320, 240, 320 * 4);
// pixel format
typedef agg::pixfmt_rgba32 pixfmt;
typedef agg::renderer_base<pixfmt> renderer_base;
typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_solid;
typedef agg::rasterizer_scanline_aa<> rasterizer_aa;
typedef agg::scanline_p8 scanline;
pixfmt pixf(rendering_buffer);
renderer_base rb(pixf);
renderer_solid rs(rb);
rasterizer_aa ras;
scanline sl_poly;
agg::rounded_rect<double> rr(50, 50, 100, 100, 10, 10);
rr.normalize_radius();
agg::rgba color(0.5, 0.5, 0.5, 1.0);
renderer_base ren_base_color(pixf);
ren_base_color.clear(agg::rgba(1,1,1));
ras.reset();
ras.add_path(rr);
sl_poly.reset();
rs.color(color);
agg::render_scanlines(ras, sl_poly, rs, ren_base_color);
// save the image
agg::write_ppm(buffer, 320, 240, -320);
return 0;
}
