365 lines
9.1 KiB
C++
365 lines
9.1 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: tests/graphics/boundingbox.cpp
|
|
// Purpose: wxGCDC bounding box unit tests
|
|
// Author: Vadim Zeitlin / Maarten Spoek / Toni Ruža
|
|
// Created: 2011-01-36
|
|
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
// (c) 2014 Toni Ruža <toni.ruza@gmail.com>
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#include "testprec.h"
|
|
|
|
|
|
#if wxUSE_GRAPHICS_CONTEXT
|
|
|
|
#include "wx/bitmap.h"
|
|
#include "wx/dcmemory.h"
|
|
#include "wx/dcgraph.h"
|
|
#include "wx/icon.h"
|
|
#include "wx/colour.h"
|
|
#include "wx/gdicmn.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// test class
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class GCDCBoundingBoxTestCase : public CppUnit::TestCase
|
|
{
|
|
public:
|
|
GCDCBoundingBoxTestCase()
|
|
{
|
|
m_bmp.Create(100, 100);
|
|
m_dc.SelectObject(m_bmp);
|
|
m_gcdc = new wxGCDC(m_dc);
|
|
}
|
|
|
|
~GCDCBoundingBoxTestCase()
|
|
{
|
|
delete m_gcdc;
|
|
m_dc.SelectObject(wxNullBitmap);
|
|
m_bmp = wxNullBitmap;
|
|
}
|
|
|
|
virtual void setUp() wxOVERRIDE
|
|
{
|
|
m_gcdc->ResetBoundingBox();
|
|
}
|
|
|
|
private:
|
|
wxBitmap m_bmp;
|
|
wxMemoryDC m_dc;
|
|
|
|
wxGCDC *m_gcdc;
|
|
|
|
void AssertBox(int minX, int minY, int width, int height, int margin = 0)
|
|
{
|
|
int maxX = minX + width;
|
|
int maxY = minY + height;
|
|
|
|
// Allow for a margin of error due to different implementation
|
|
// specificities regarding drawing paths.
|
|
if ( margin )
|
|
{
|
|
#define WX_ASSERT_CLOSE(expected, actual, delta) \
|
|
WX_ASSERT_MESSAGE(("%d != %d", actual, expected), \
|
|
abs(actual - expected) <= delta)
|
|
|
|
WX_ASSERT_CLOSE(minX, m_gcdc->MinX(), margin);
|
|
WX_ASSERT_CLOSE(minY, m_gcdc->MinY(), margin);
|
|
WX_ASSERT_CLOSE(maxX, m_gcdc->MaxX(), margin);
|
|
WX_ASSERT_CLOSE(maxY, m_gcdc->MaxY(), margin);
|
|
|
|
#undef WX_ASSERT_CLOSE
|
|
}
|
|
else
|
|
{
|
|
CPPUNIT_ASSERT_EQUAL(minX, m_gcdc->MinX());
|
|
CPPUNIT_ASSERT_EQUAL(minY, m_gcdc->MinY());
|
|
CPPUNIT_ASSERT_EQUAL(maxX, m_gcdc->MaxX());
|
|
CPPUNIT_ASSERT_EQUAL(maxY, m_gcdc->MaxY());
|
|
}
|
|
}
|
|
|
|
CPPUNIT_TEST_SUITE( GCDCBoundingBoxTestCase );
|
|
CPPUNIT_TEST( DrawBitmap );
|
|
CPPUNIT_TEST( DrawIcon );
|
|
CPPUNIT_TEST( DrawLine );
|
|
CPPUNIT_TEST( CrossHair );
|
|
CPPUNIT_TEST( DrawArc );
|
|
CPPUNIT_TEST( DrawEllipticArc );
|
|
CPPUNIT_TEST( DrawPoint );
|
|
CPPUNIT_TEST( DrawLines );
|
|
#if wxUSE_SPLINES
|
|
CPPUNIT_TEST( DrawSpline );
|
|
#endif
|
|
CPPUNIT_TEST( DrawPolygon );
|
|
CPPUNIT_TEST( DrawPolyPolygon );
|
|
CPPUNIT_TEST( DrawRectangle );
|
|
CPPUNIT_TEST( DrawTwoRectangles );
|
|
CPPUNIT_TEST( DrawRectsOnTransformedDC );
|
|
CPPUNIT_TEST( DrawRoundedRectangle );
|
|
CPPUNIT_TEST( DrawRectangleAndReset );
|
|
CPPUNIT_TEST( DrawEllipse );
|
|
CPPUNIT_TEST( Blit );
|
|
CPPUNIT_TEST( StretchBlit );
|
|
CPPUNIT_TEST( DrawRotatedText );
|
|
CPPUNIT_TEST( DrawText );
|
|
CPPUNIT_TEST( GradientFillLinear );
|
|
CPPUNIT_TEST( GradientFillConcentric );
|
|
CPPUNIT_TEST( DrawCheckMark );
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
void DrawBitmap();
|
|
void DrawIcon();
|
|
void DrawLine();
|
|
void CrossHair();
|
|
void DrawArc();
|
|
void DrawEllipticArc();
|
|
void DrawPoint();
|
|
void DrawLines();
|
|
#if wxUSE_SPLINES
|
|
void DrawSpline();
|
|
#endif
|
|
void DrawPolygon();
|
|
void DrawPolyPolygon();
|
|
void DrawRectangle();
|
|
void DrawTwoRectangles();
|
|
void DrawRectsOnTransformedDC();
|
|
void DrawRoundedRectangle();
|
|
void DrawRectangleAndReset();
|
|
void DrawEllipse();
|
|
void Blit();
|
|
void StretchBlit();
|
|
void DrawRotatedText();
|
|
void DrawText();
|
|
void GradientFillLinear();
|
|
void GradientFillConcentric();
|
|
void DrawCheckMark();
|
|
|
|
wxDECLARE_NO_COPY_CLASS(GCDCBoundingBoxTestCase);
|
|
};
|
|
|
|
// register in the unnamed registry so that these tests are run by default
|
|
CPPUNIT_TEST_SUITE_REGISTRATION( GCDCBoundingBoxTestCase );
|
|
|
|
// also include in it's own registry so that these tests can be run alone
|
|
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( GCDCBoundingBoxTestCase, "GCDCBoundingBoxTestCase" );
|
|
|
|
|
|
void GCDCBoundingBoxTestCase::DrawBitmap()
|
|
{
|
|
wxBitmap bitmap;
|
|
bitmap.Create(12, 12);
|
|
|
|
m_gcdc->DrawBitmap(bitmap, 5, 5);
|
|
AssertBox(5, 5, 12, 12);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawIcon()
|
|
{
|
|
wxBitmap bitmap;
|
|
bitmap.Create(16, 16);
|
|
wxIcon icon;
|
|
icon.CopyFromBitmap(bitmap);
|
|
|
|
m_gcdc->DrawIcon(icon, 42, 42);
|
|
AssertBox(42, 42, 16, 16);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawLine()
|
|
{
|
|
m_gcdc->DrawLine(10, 10, 20, 15);
|
|
AssertBox(10, 10, 10, 5);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::CrossHair()
|
|
{
|
|
int w, h;
|
|
m_gcdc->GetSize(&w, &h);
|
|
|
|
m_gcdc->CrossHair(33, 33);
|
|
AssertBox(0, 0, w, h);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawArc()
|
|
{
|
|
m_gcdc->DrawArc(25, 30, 15, 40, 25, 40); // quarter circle
|
|
AssertBox(15, 30, 10, 10, 3);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawEllipticArc()
|
|
{
|
|
m_gcdc->DrawEllipticArc(40, 50, 30, 20, 0, 180); // half circle
|
|
AssertBox(40, 50, 30, 10, 3);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawPoint()
|
|
{
|
|
m_gcdc->DrawPoint(20, 20);
|
|
AssertBox(20, 20, 0, 0);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawLines()
|
|
{
|
|
wxPoint points[4];
|
|
points[0] = wxPoint(10, 20);
|
|
points[1] = wxPoint(20, 10);
|
|
points[2] = wxPoint(30, 20);
|
|
points[3] = wxPoint(20, 30);
|
|
|
|
m_gcdc->DrawLines(4, points, 7, 8);
|
|
AssertBox(17, 18, 20, 20);
|
|
}
|
|
|
|
#if wxUSE_SPLINES
|
|
void GCDCBoundingBoxTestCase::DrawSpline()
|
|
{
|
|
wxPoint points[3];
|
|
points[0] = wxPoint(10, 30);
|
|
points[1] = wxPoint(20, 20);
|
|
points[2] = wxPoint(40, 50);
|
|
|
|
m_gcdc->DrawSpline(3, points);
|
|
AssertBox(10, 20, 30, 30, 5);
|
|
}
|
|
#endif // wxUSE_SPLINES
|
|
|
|
void GCDCBoundingBoxTestCase::DrawPolygon()
|
|
{
|
|
wxPoint points[3];
|
|
points[0] = wxPoint(10, 30);
|
|
points[1] = wxPoint(20, 10);
|
|
points[2] = wxPoint(30, 30);
|
|
|
|
m_gcdc->DrawPolygon(3, points, -5, -7);
|
|
AssertBox(5, 3, 20, 20);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawPolyPolygon()
|
|
{
|
|
int lenghts[2];
|
|
lenghts[0] = 3;
|
|
lenghts[1] = 3;
|
|
wxPoint points[6];
|
|
points[0] = wxPoint(10, 30);
|
|
points[1] = wxPoint(20, 10);
|
|
points[2] = wxPoint(30, 30);
|
|
points[3] = wxPoint(20, 60);
|
|
points[4] = wxPoint(30, 40);
|
|
points[5] = wxPoint(40, 60);
|
|
|
|
m_gcdc->DrawPolyPolygon(2, lenghts, points, 12, 5);
|
|
AssertBox(22, 15, 30, 50, 4);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawRectangle()
|
|
{
|
|
m_gcdc->DrawRectangle(2, 2, 12, 12);
|
|
AssertBox(2, 2, 12, 12);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawRoundedRectangle()
|
|
{
|
|
m_gcdc->DrawRoundedRectangle(27, 27, 12, 12, 2);
|
|
AssertBox(27, 27, 12, 12);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawEllipse()
|
|
{
|
|
m_gcdc->DrawEllipse(54, 45, 23, 12);
|
|
AssertBox(54, 45, 23, 12);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::Blit()
|
|
{
|
|
wxBitmap bitmap;
|
|
bitmap.Create(20, 20);
|
|
wxMemoryDC dc(bitmap);
|
|
|
|
m_gcdc->Blit(20, 10, 12, 7, &dc, 0, 0);
|
|
AssertBox(20, 10, 12, 7);
|
|
|
|
dc.SelectObject(wxNullBitmap);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::StretchBlit()
|
|
{
|
|
wxBitmap bitmap;
|
|
bitmap.Create(20, 20);
|
|
wxMemoryDC dc(bitmap);
|
|
|
|
m_gcdc->StretchBlit(30, 50, 5, 5, &dc, 0, 0, 12, 4);
|
|
AssertBox(30, 50, 5, 5);
|
|
|
|
dc.SelectObject(wxNullBitmap);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawRotatedText()
|
|
{
|
|
wxString text("vertical");
|
|
wxCoord w, h;
|
|
m_gcdc->GetTextExtent(text, &w, &h);
|
|
|
|
m_gcdc->DrawRotatedText(text, 43, 22, -90);
|
|
AssertBox(43 - h, 22, h, w, 3);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawText()
|
|
{
|
|
wxString text("H");
|
|
wxCoord w, h;
|
|
m_gcdc->GetTextExtent(text, &w, &h);
|
|
|
|
m_gcdc->DrawText(text, 3, 3);
|
|
AssertBox(3, 3, w, h, 3);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::GradientFillLinear()
|
|
{
|
|
wxRect rect(16, 16, 30, 40);
|
|
m_gcdc->GradientFillLinear(rect, *wxWHITE, *wxBLACK, wxNORTH);
|
|
AssertBox(16, 16, 30, 40);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::GradientFillConcentric()
|
|
{
|
|
wxRect rect(6, 6, 30, 40);
|
|
m_gcdc->GradientFillConcentric(rect, *wxWHITE, *wxBLACK, wxPoint(10, 10));
|
|
AssertBox(6, 6, 30, 40);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawCheckMark()
|
|
{
|
|
m_gcdc->DrawCheckMark(32, 24, 16, 16);
|
|
AssertBox(32, 24, 16, 16);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawRectangleAndReset()
|
|
{
|
|
m_gcdc->DrawRectangle(2, 2, 12, 12);
|
|
m_gcdc->ResetBoundingBox();
|
|
AssertBox(0, 0, 0, 0);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawTwoRectangles()
|
|
{
|
|
m_gcdc->DrawRectangle(10, 15, 50, 30);
|
|
m_gcdc->DrawRectangle(15, 20, 55, 35);
|
|
AssertBox(10, 15, 60, 40);
|
|
}
|
|
|
|
void GCDCBoundingBoxTestCase::DrawRectsOnTransformedDC()
|
|
{
|
|
m_gcdc->DrawRectangle(10, 15, 50, 30);
|
|
m_gcdc->SetDeviceOrigin(15, 20);
|
|
m_gcdc->DrawRectangle(15, 20, 45, 35);
|
|
m_gcdc->SetDeviceOrigin(5, 10);
|
|
AssertBox(5, 5, 65, 60);
|
|
}
|
|
|
|
#endif // wxUSE_GRAPHICS_CONTEXT
|