wxWidgets第十七课 采用AGG渲染库
发布时间:2023-05-17 00:22:31
wxWidgets可以使用不同的渲染库来呈现视图,其中AGG渲染库是一种高质量的图形渲染库,可以满足高质量的渲染和图形需求。本文将介绍如何在wxWidgets中采用AGG渲染库进行渲染。
1、安装AGG渲染库
AGG渲染库可以从官网(http://www.antigrain.com)下载。下载解压缩之后,将agg/include/agg_config.h.in文件改名为agg/include/agg_config.h,并将其拷贝到/usr/include目录下。
2、在wxWidgets中采用AGG渲染库
为了在wxWidgets中使用AGG渲染库,我们需要编写一个AGG渲染器,为wxWidgets中的DC类提供AGG渲染的实现。以下是一个简单的AGG渲染器的示例代码:
#include "wx/dc.h"
#include "agg_renderer.h"
#include "agg_trans_affine.h"
#include "agg_color_rgba.h"
#include "agg_basics.h"
#include "agg_path_storage.h"
#include "agg_conv_stroke.h"
class AggRenderer : public wxDC {
public:
AggRenderer(wxWindow* window) : wxDC() {
m_window = window;
m_renderBuffer = nullptr;
m_renderWidth = -1;
m_renderHeight = -1;
}
~AggRenderer() {
if (m_renderBuffer != nullptr) {
delete m_renderBuffer;
m_renderBuffer = nullptr;
}
}
void SetUserScale(double x, double y) override {
wxDC::SetUserScale(x, y);
m_transform = agg::trans_affine(m_scaleX, 0, 0, m_scaleY, 0, 0);
}
void SetDeviceOrigin(int x, int y) override {
wxDC::SetDeviceOrigin(x, y);
m_transform *= agg::trans_affine_translation(x, y);
}
void SetLogicalFunction(wxRasterOperationMode function) override {
wxDC::SetLogicalFunction(function);
agg::pixfmt_rgba32 pixfmt((unsigned char*)m_renderBuffer, m_renderWidth, m_renderHeight, m_renderWidth * 4);
m_rendererBase.reset(new agg::renderer_base<pixfmt>);
}
void BeginDrawing() override {
if (m_renderBuffer == nullptr || m_renderWidth != m_window->GetClientSize().GetWidth() || m_renderHeight != m_window->GetClientSize().GetHeight()) {
m_renderWidth = m_window->GetClientSize().GetWidth();
m_renderHeight = m_window->GetClientSize().GetHeight();
if (m_renderBuffer != nullptr) {
delete m_renderBuffer;
m_renderBuffer = nullptr;
}
m_renderBuffer = new unsigned char[m_renderWidth * m_renderHeight * 4];
}
}
void EndDrawing() override {
wxBitmap bitmap(wxImage(m_renderWidth, m_renderHeight, m_renderBuffer, true));
wxClientDC dc(m_window);
dc.DrawBitmap(bitmap, 0, 0);
}
void Clear() override {
agg::rect_i r(0, 0, m_renderWidth, m_renderHeight);
m_rendererBase->clear(agg::rgba(255, 255, 255));
}
void SetPen(const wxPen& pen) override {
agg::path_storage path;
path.move_to(0.0, 0.0);
path.line_to((double)m_deviceOriginX, (double)m_deviceOriginY);
agg::conv_stroke<agg::path_storage> strokePath(path);
strokePath.width(pen.GetWidth());
strokePath.line_cap(agg::butt_cap);
strokePath.line_join(agg::miter_join);
strokePath.miter_limit(10.0);
m_rendererPath.reset(new agg::renderer_scanline_aa<agg::renderer_base<agg::pixfmt_rgba32>>(*m_rendererBase));
m_rendererPath->color(agg::rgba8(pen.GetColour().Red(), pen.GetColour().Green(), pen.GetColour().Blue(), pen.GetColour().Alpha()));
agg::render_scanlines(strokePath, *m_rendererPath);
}
private:
wxWindow* m_window;
unsigned char* m_renderBuffer;
int m_renderWidth;
int m_renderHeight;
agg::trans_affine m_transform;
std::unique_ptr<agg::renderer_base<agg::pixfmt_rgba32>> m_rendererBase;
std::unique_ptr<agg::renderer_scanline_aa<agg::renderer_base<agg::pixfmt_rgba32>>> m_rendererPath;
};
这个AGG渲染器支持用户缩放和设备原点设置,并提供了清除函数和笔设置函数。
3、使用AGG渲染器
可以通过下面这个代码段来使用AGG渲染器:
#include "agg_renderer.h"
#include "wx/wx.h"
class MyApp : public wxApp {
public:
bool OnInit() override {
wxFrame* frame = new wxFrame(nullptr, wxID_ANY, "AGG Renderer Example");
frame->SetSize(640, 480);
frame->Show();
SetTopWindow(frame);
AggRenderer renderer(frame);
renderer.BeginDrawing();
renderer.Clear();
renderer.SetPen(wxPen(wxColour(255, 0, 0, 255), 5));
renderer.SetUserScale(1.0, -1.0);
renderer.SetDeviceOrigin(0, renderer.GetSize().y);
agg::path_storage path;
path.move_to(0.0, 0.0);
path.line_to(100.0, 100.0);
path.line_to(200.0, 0.0);
path.line_to(300.0, 100.0);
agg::conv_stroke<agg::path_storage> strokePath(path);
strokePath.width(1.0);
strokePath.line_cap(agg::butt_cap);
strokePath.line_join(agg::miter_join);
strokePath.miter_limit(10.0);
renderer.SetPen(wxPen(wxColour(255, 0, 0, 255), 5));
agg::renderer_scanline_aa<agg::renderer_base<agg::pixfmt_rgba32>> rendererPath(agg::renderer_base<agg::pixfmt_rgba32>((unsigned char*)renderer.GetBuffer(), renderer.GetSize().x, renderer.GetSize().y, renderer.GetSize().x * 4));
rendererPath.color(agg::rgba8(255, 0, 0, 255));
agg::render_scanlines(strokePath, rendererPath);
renderer.EndDrawing();
return true;
}
};
IMPLEMENT_APP(MyApp);
这个示例程序使用AGG渲染器渲染四段线段,颜色为红色。
总结
使用AGG渲染库可以实现高质量的图形渲染和绘制,对于需要高质量渲染和图形的应用程序非常有用。在wxWidgets中使用AGG渲染器可以方便地实现高质量的渲染和绘制。
