欢迎访问宙启技术站
智能推送

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;
}