Eliminate several memory leaks.

All leaks found with valgrind while running the test suite.
This commit also clears the Cairo cache to improve SNR of Valgrind
output.
pull/33/head
whitequark 2016-08-01 03:52:12 +00:00
parent a2a50927e9
commit 4f49a8a9d4
6 changed files with 24 additions and 5 deletions

View File

@ -637,6 +637,7 @@ void Group::DrawFilledPaths(Canvas *canvas) {
SPolygon sp = {};
sbls.MakePwlInto(&sp);
canvas->DrawPolygon(sp, hcf);
sp.Clear();
}
}

View File

@ -144,6 +144,11 @@ bool Canvas::Fill::Equals(const Fill &other) const {
pattern == other.pattern);
}
void Canvas::Clear() {
strokes.Clear();
fills.Clear();
}
Canvas::hStroke Canvas::GetStroke(const Stroke &stroke) {
for(const Stroke &s : strokes) {
if(s.Equals(stroke)) return s.h;

View File

@ -98,6 +98,7 @@ public:
StipplePattern stipplePattern;
double stippleScale;
void Clear() { *this = {}; }
bool Equals(const Stroke &other) const;
};
@ -114,13 +115,15 @@ public:
RgbaColor color;
FillPattern pattern;
void Clear() { *this = {}; }
bool Equals(const Fill &other) const;
};
IdList<Stroke, hStroke> strokes;
IdList<Fill, hFill> fills;
Canvas() : strokes(), fills() {};
Canvas() : strokes(), fills() {}
virtual void Clear();
hStroke GetStroke(const Stroke &stroke);
hFill GetFill(const Fill &fill);
@ -226,7 +229,7 @@ public:
BBox bbox;
SurfaceRenderer() : camera(), lighting(), chordTolerance(), mesh(), bbox() {}
virtual void Clear();
void Clear() override;
// Canvas interface.
const Camera &GetCamera() const override { return camera; }

View File

@ -352,6 +352,8 @@ void SurfaceRenderer::OutputInPaintOrder() {
if(tr.meta.color.IsEmpty()) continue;
OutputTriangle(tr);
}
mp.Clear();
}
for(auto eit : edges) {
@ -382,6 +384,8 @@ void SurfaceRenderer::OutputInPaintOrder() {
}
void SurfaceRenderer::Clear() {
Canvas::Clear();
for(auto &eit : edges) {
SEdgeList &el = eit.second;
el.l.Clear();

View File

@ -2,7 +2,8 @@
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR})
${CMAKE_CURRENT_BINARY_DIR}
${CAIRO_INCLUDE_DIRS})
set(testsuite_SOURCES
harness.cpp

View File

@ -5,6 +5,7 @@
//-----------------------------------------------------------------------------
#include "harness.h"
#include <regex>
#include <cairo.h>
#if defined(WIN32)
#include <windows.h>
#else
@ -310,11 +311,15 @@ int main(int argc, char **argv) {
if(failTally > 0) {
fprintf(stderr, "Failure! %u checks failed\n",
(unsigned)failTally);
return 1;
} else {
fprintf(stderr, "Success! %u test cases (%u skipped), %u checks, %.3fs\n",
(unsigned)ranTally, (unsigned)skippedTally,
(unsigned)checkTally, testTime.count());
return 0;
}
// At last, try to reset all caches we or our dependencies have, to make SNR
// of memory checking tools like valgrind higher.
cairo_debug_reset_static_data();
return (failTally > 0);
}