Skip to content

Commit 8d011fc

Browse files
committed
Use managed buffers in Agg backend
This means we don't have to free them ourselves.
1 parent a3fcf0b commit 8d011fc

File tree

3 files changed

+11
-19
lines changed

3 files changed

+11
-19
lines changed

src/_backend_agg.cpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,30 +41,23 @@ RendererAgg::RendererAgg(unsigned int width, unsigned int height, double dpi)
4141

4242
unsigned stride(width * 4);
4343

44-
pixBuffer = new agg::int8u[NUMBYTES];
45-
renderingBuffer.attach(pixBuffer, width, height, stride);
44+
pixBuffer = std::make_unique<agg::int8u[]>(NUMBYTES);
45+
renderingBuffer.attach(pixBuffer.get(), width, height, stride);
4646
pixFmt.attach(renderingBuffer);
4747
rendererBase.attach(pixFmt);
4848
rendererBase.clear(_fill_color);
4949
rendererAA.attach(rendererBase);
5050
rendererBin.attach(rendererBase);
5151
hatch_size = int(dpi);
52-
hatchBuffer = new agg::int8u[hatch_size * hatch_size * 4];
53-
hatchRenderingBuffer.attach(hatchBuffer, hatch_size, hatch_size, hatch_size * 4);
54-
}
55-
56-
RendererAgg::~RendererAgg()
57-
{
58-
delete[] hatchBuffer;
59-
delete[] alphaBuffer;
60-
delete[] pixBuffer;
52+
hatchBuffer = std::make_unique<agg::int8u[]>(hatch_size * hatch_size * 4);
53+
hatchRenderingBuffer.attach(hatchBuffer.get(), hatch_size, hatch_size, hatch_size * 4);
6154
}
6255

6356
void RendererAgg::create_alpha_buffers()
6457
{
6558
if (!alphaBuffer) {
66-
alphaBuffer = new agg::int8u[width * height];
67-
alphaMaskRenderingBuffer.attach(alphaBuffer, width, height, width);
59+
alphaBuffer = std::make_unique<agg::int8u[]>(width * height);
60+
alphaMaskRenderingBuffer.attach(alphaBuffer.get(), width, height, width);
6861
rendererBaseAlphaMask.attach(pixfmtAlphaMask);
6962
rendererAlphaMask.attach(rendererBaseAlphaMask);
7063
}

src/_backend_agg.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <cmath>
1212
#include <algorithm>
1313
#include <functional>
14+
#include <memory>
1415
#include <optional>
1516
#include <vector>
1617

@@ -126,8 +127,6 @@ class RendererAgg
126127

127128
RendererAgg(unsigned int width, unsigned int height, double dpi);
128129

129-
virtual ~RendererAgg();
130-
131130
unsigned int get_width()
132131
{
133132
return width;
@@ -206,10 +205,10 @@ class RendererAgg
206205
double dpi;
207206
size_t NUMBYTES; // the number of bytes in buffer
208207

209-
agg::int8u *pixBuffer;
208+
std::unique_ptr<agg::int8u[]> pixBuffer;
210209
agg::rendering_buffer renderingBuffer;
211210

212-
agg::int8u *alphaBuffer;
211+
std::unique_ptr<agg::int8u[]> alphaBuffer;
213212
agg::rendering_buffer alphaMaskRenderingBuffer;
214213
alpha_mask_type alphaMask;
215214
agg::pixfmt_gray8 pixfmtAlphaMask;
@@ -229,7 +228,7 @@ class RendererAgg
229228
agg::trans_affine lastclippath_transform;
230229

231230
size_t hatch_size;
232-
agg::int8u *hatchBuffer;
231+
std::unique_ptr<agg::int8u[]> hatchBuffer;
233232
agg::rendering_buffer hatchRenderingBuffer;
234233

235234
agg::rgba _fill_color;

src/_backend_agg_wrapper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ PYBIND11_MODULE(_backend_agg, m, py::mod_gil_not_used())
263263
4,
264264
1
265265
};
266-
return py::buffer_info(renderer->pixBuffer, shape, strides);
266+
return py::buffer_info(renderer->pixBuffer.get(), shape, strides);
267267
});
268268

269269
py::class_<BufferRegion>(m, "BufferRegion", py::buffer_protocol())

0 commit comments

Comments
 (0)