diff options
| -rw-r--r-- | plugingui/painter.cc | 42 | ||||
| -rw-r--r-- | test/paintertest.cc | 166 | 
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); | 
