summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2016-09-05 11:45:29 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2016-09-05 11:45:29 +0200
commitea4435f8ca32639ad2c516cd89123b8e88b666bc (patch)
treef19b830f55124a80c6ec259b123f25ba96f99adb
parent257a769685d380e7a6fc5f154e03f5e127de4e39 (diff)
Added painter unit test and fixed image and text rendering boundaries.
-rw-r--r--plugingui/painter.cc42
-rw-r--r--test/paintertest.cc166
2 files changed, 204 insertions, 4 deletions
diff --git a/plugingui/painter.cc b/plugingui/painter.cc
index db67a0e..3c290f3 100644
--- a/plugingui/painter.cc
+++ b/plugingui/painter.cc
@@ -27,6 +27,7 @@
#include "painter.h"
#include <cmath>
+#include <cassert>
namespace GUI
{
@@ -203,24 +204,48 @@ void Painter::drawText(int x0, int y0, const Font& font,
if(nocolour)
{
- for(int y = 0; y < renderHeight; ++y)
+ for(int y = -1 * std::min(0, y0); y < renderHeight; ++y)
{
- for(int x = 0; x < renderWidth; ++x)
+ for(int x = -1 * std::min(0, x0); x < renderWidth; ++x)
{
unsigned char r, g, b, a;
+
+ assert(x >= 0);
+ assert(y >= 0);
+ assert(x < (int)textbuf->width);
+ assert(y < (int)textbuf->height);
+
textbuf->pixel(x, y, &r, &g, &b, &a);
+
+ assert(x + x0 >= 0);
+ assert(y + y0 >= 0);
+ assert(x + x0 < (int)pixbuf.width);
+ assert(y + y0 < (int)pixbuf.height);
+
pixbuf.addPixel(x + x0, y + y0, r, g, b, a);
}
}
}
else
{
- for(int y = 0; y < renderHeight; ++y)
+ for(int y = -1 * std::min(0, y0); y < renderHeight; ++y)
{
- for(int x = 0; x < renderWidth; ++x)
+ for(int x = -1 * std::min(0, x0); x < renderWidth; ++x)
{
unsigned char r,g,b,a;
+
+ assert(x >= 0);
+ assert(y >= 0);
+ assert(x < (int)textbuf->width);
+ assert(y < (int)textbuf->height);
+
textbuf->pixel(x, y, &r, &g, &b, &a);
+
+ assert(x + x0 >= 0);
+ assert(y + y0 >= 0);
+ assert(x + x0 < (int)pixbuf.width);
+ assert(y + y0 < (int)pixbuf.height);
+
pixbuf.addPixel(x + x0, y + y0,
colour.red() * 255,
colour.green() * 255,
@@ -361,7 +386,16 @@ void Painter::drawImage(int x0, int y0, const Drawable& image)
{
for(std::size_t x = -1 * std::min(0, x0); x < (std::size_t)fw; ++x)
{
+ assert(x >= 0);
+ assert(y >= 0);
+ assert(x < image.width());
+ assert(y < image.height());
auto& c = image.getPixel(x, y);
+
+ assert(x0 + x >= 0);
+ assert(y0 + y >= 0);
+ assert(x0 + x < pixbuf.width);
+ assert(y0 + y < pixbuf.height);
pixbuf.addPixel(x0 + x, y0 + y, c);
}
}
diff --git a/test/paintertest.cc b/test/paintertest.cc
new file mode 100644
index 0000000..5c8cf45
--- /dev/null
+++ b/test/paintertest.cc
@@ -0,0 +1,166 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * paintertest.cc
+ *
+ * Fri Nov 29 18:08:57 CET 2013
+ * Copyright 2013 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "../plugingui/canvas.h"
+#include "../plugingui/painter.h"
+
+class TestableCanvas
+ : public GUI::Canvas
+{
+public:
+ TestableCanvas(std::size_t width, std::size_t height)
+ : pixbuf(width, height)
+ {}
+
+ GUI::PixelBufferAlpha& GetPixelBuffer() override
+ {
+ return pixbuf;
+ }
+
+ void beginPaint() override
+ {
+ }
+
+ void endPaint() override
+ {
+ }
+
+private:
+ GUI::PixelBufferAlpha pixbuf;
+};
+
+class PainterTest
+ : public CppUnit::TestFixture
+{
+ CPPUNIT_TEST_SUITE(PainterTest);
+ CPPUNIT_TEST(testDrawImage);
+ CPPUNIT_TEST(testDrawText);
+ CPPUNIT_TEST_SUITE_END();
+
+public:
+ void setUp() {}
+ void tearDown() {}
+
+ void testDrawImage()
+ {
+ // Success criterion is simply to not assert in the drawing routines...
+ GUI::Image image(":logo.png");
+
+ { // Image fits in pixelbuffer
+ TestableCanvas canvas(image.width(), image.height());
+ GUI::Painter painter(canvas);
+ painter.drawImage(0, 0, image);
+ }
+
+ { // Image fits in pixelbuffer, negative offset
+ TestableCanvas canvas(image.width(), image.height());
+ GUI::Painter painter(canvas);
+ painter.drawImage(-10, -10, image);
+ }
+
+ { // Image too big for pixelbuffer
+ TestableCanvas canvas(image.width() / 2, image.height() / 2);
+ GUI::Painter painter(canvas);
+ painter.drawImage(0, 0, image);
+ }
+
+ { // Image fits in pixelbuffer but offset so it is drawn over the edge.
+ TestableCanvas canvas(image.width(), image.height());
+ GUI::Painter painter(canvas);
+ painter.drawImage(10, 10, image);
+ }
+
+ { // Image is offset to the right and down so nothing is to be drawn.
+ TestableCanvas canvas(image.width(), image.height());
+ GUI::Painter painter(canvas);
+ painter.drawImage(image.width() + 1,
+ image.height() + 1,
+ image);
+ }
+
+ { // Image is offset to the left and up so nothing is to be drawn.
+ TestableCanvas canvas(image.width(), image.height());
+ GUI::Painter painter(canvas);
+ painter.drawImage(-1 * (image.width() + 1),
+ -1 * (image.height() + 1),
+ image);
+ }
+ }
+
+ void testDrawText()
+ {
+ // Success criterion is simply to not assert in the drawing routines...
+ GUI::Font font;
+ std::string someText = "Hello World";
+ std::size_t width = font.textWidth(someText);
+ std::size_t height = font.textHeight(someText);
+
+ { // Text fits in pixelbuffer
+ TestableCanvas canvas(width, height);
+ GUI::Painter painter(canvas);
+ painter.drawText(0, 0, font, someText);
+ }
+
+ { // Text fits in pixelbuffer, negative offset
+ TestableCanvas canvas(width, height);
+ GUI::Painter painter(canvas);
+ painter.drawText(-10, -10, font, someText);
+ }
+
+ { // Text too big for pixelbuffer
+ TestableCanvas canvas(width / 2, height / 2);
+ GUI::Painter painter(canvas);
+ painter.drawText(0, 0, font, someText);
+ }
+
+ { // Text fits in pixelbuffer but offset so it is drawn over the edge.
+ TestableCanvas canvas(width, height);
+ GUI::Painter painter(canvas);
+ painter.drawText(10, 10, font, someText);
+ }
+
+ { // Text is offset to the right and down so nothing is to be drawn.
+ TestableCanvas canvas(width, height);
+ GUI::Painter painter(canvas);
+ painter.drawText(width + 1,
+ height + 1,
+ font, someText);
+ }
+
+ { // Text is offset to the left and up so nothing is to be drawn.
+ TestableCanvas canvas(width, height);
+ GUI::Painter painter(canvas);
+ painter.drawText(-1 * (width + 1),
+ -1 * (height + 1),
+ font, someText);
+ }
+ }
+};
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION(PainterTest);