From ab797d5d346f10b3097d38431c96c090e20d687b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 26 Apr 2011 22:57:20 +0000 Subject: [PATCH] Add a unit test for wxAffineMatrix2D class and its support in wxDC. Verify that applying a world transformation to wxDC really does result in the expected transformation. See #13092. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67617 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- tests/Makefile.in | 4 ++ tests/graphics/affinematrix.cpp | 140 ++++++++++++++++++++++++++++++++++++++++ tests/makefile.bcc | 4 ++ tests/makefile.gcc | 4 ++ tests/makefile.vc | 4 ++ tests/makefile.wat | 4 ++ tests/test.bkl | 1 + tests/test_test_gui.dsp | 4 ++ tests/test_vc7_test_gui.vcproj | 3 + tests/test_vc8_test_gui.vcproj | 4 ++ tests/test_vc9_test_gui.vcproj | 4 ++ 11 files changed, 176 insertions(+) create mode 100644 tests/graphics/affinematrix.cpp diff --git a/tests/Makefile.in b/tests/Makefile.in index 1df92ac..a267e6d 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -155,6 +155,7 @@ TEST_GUI_OBJECTS = \ test_gui_colour.o \ test_gui_ellipsization.o \ test_gui_measuring.o \ + test_gui_affinematrix.o \ test_gui_config.o \ test_gui_bitmapcomboboxtest.o \ test_gui_bitmaptogglebuttontest.o \ @@ -696,6 +697,9 @@ test_gui_ellipsization.o: $(srcdir)/graphics/ellipsization.cpp $(TEST_GUI_ODEP) test_gui_measuring.o: $(srcdir)/graphics/measuring.cpp $(TEST_GUI_ODEP) $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/graphics/measuring.cpp +test_gui_affinematrix.o: $(srcdir)/graphics/affinematrix.cpp $(TEST_GUI_ODEP) + $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/graphics/affinematrix.cpp + test_gui_config.o: $(srcdir)/config/config.cpp $(TEST_GUI_ODEP) $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/config/config.cpp diff --git a/tests/graphics/affinematrix.cpp b/tests/graphics/affinematrix.cpp new file mode 100644 index 0000000..ffa4f58 --- /dev/null +++ b/tests/graphics/affinematrix.cpp @@ -0,0 +1,140 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: tests/graphics/affinetransform.cpp +// Purpose: Unit test for transformations implemented for wxAffineMatrix2D +// Author: Catalin Raceanu +// Created: 2011-04-14 +// Copyright: (c) 2011 wxWidgets development team +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "testprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/dcmemory.h" +#include "wx/affinematrix2d.h" +#include "wx/math.h" + +#include "testimage.h" + +// ---------------------------------------------------------------------------- +// test class +// ---------------------------------------------------------------------------- + +class AffineTransformTestCase : public CppUnit::TestCase +{ +public: + AffineTransformTestCase() + { + wxImage::AddHandler(new wxJPEGHandler); + } + + virtual void setUp(); + +private: + CPPUNIT_TEST_SUITE( AffineTransformTestCase ); + CPPUNIT_TEST( InvertMatrix ); + CPPUNIT_TEST( VMirrorAndTranslate ); + CPPUNIT_TEST( Rotate90Clockwise ); + CPPUNIT_TEST_SUITE_END(); + + void InvertMatrix(); + void VMirrorAndTranslate(); + void Rotate90Clockwise(); + + wxImage m_imgOrig; + wxBitmap m_bmpOrig; + + DECLARE_NO_COPY_CLASS(AffineTransformTestCase) +}; + +// register in the unnamed registry so that these tests are run by default +CPPUNIT_TEST_SUITE_REGISTRATION( AffineTransformTestCase ); + +// also include in it's own registry so that these tests can be run alone +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( AffineTransformTestCase, "AffineTransformTestCase" ); + +void AffineTransformTestCase::setUp() +{ + m_imgOrig.LoadFile("horse.jpg"); + + CPPUNIT_ASSERT( m_imgOrig.IsOk() ); + + m_bmpOrig = wxBitmap(m_imgOrig); +} + +void AffineTransformTestCase::InvertMatrix() +{ + wxAffineMatrix2D matrix1; + matrix1.Set(wxMatrix2D(2, 1, 1, 1), wxPoint2DDouble(1, 1)); + + wxAffineMatrix2D matrix2(matrix1); + + matrix2.Invert(); + + wxMatrix2D m; + wxPoint2DDouble p; + matrix2.Get(&m, &p); + CPPUNIT_ASSERT_EQUAL( 1, (int)m.m_11 ); + CPPUNIT_ASSERT_EQUAL( -1, (int)m.m_12 ); + CPPUNIT_ASSERT_EQUAL( -1, (int)m.m_21 ); + CPPUNIT_ASSERT_EQUAL( 2, (int)m.m_22 ); + CPPUNIT_ASSERT_EQUAL( 0, (int)p.m_x ); + CPPUNIT_ASSERT_EQUAL( -1, (int)p.m_y ); + + matrix2.Concat(matrix1); + CPPUNIT_ASSERT( matrix2.IsIdentity() ); +} + +void AffineTransformTestCase::VMirrorAndTranslate() +{ + wxBitmap bmpUsingMatrix(m_bmpOrig.GetWidth(), m_bmpOrig.GetHeight()); + + // build the mirrored image using the transformation matrix + { + wxMemoryDC dc(bmpUsingMatrix); + + if ( !dc.CanUseTransformMatrix() ) + return; + + wxAffineMatrix2D matrix; + matrix.Mirror(wxVERTICAL); + matrix.Translate(0, m_bmpOrig.GetHeight() - 1); + dc.SetTransformMatrix(matrix); + dc.DrawBitmap(m_bmpOrig, 0, 0); + } + + wxImage imgUsingMatrix = bmpUsingMatrix.ConvertToImage(); + wxImage imgOrigVMirrored = m_imgOrig.Mirror(false); + + CPPUNIT_ASSERT_EQUAL( imgUsingMatrix, imgOrigVMirrored ); +} + +void AffineTransformTestCase::Rotate90Clockwise() +{ + wxBitmap bmpUsingMatrix(m_bmpOrig.GetHeight(), m_bmpOrig.GetWidth()); + + // build the rotated image using the transformation matrix + { + wxMemoryDC dc(bmpUsingMatrix); + + if ( !dc.CanUseTransformMatrix() ) + return; + + wxAffineMatrix2D matrix; + matrix.Rotate(-0.5 * M_PI); + matrix.Translate(m_bmpOrig.GetHeight(), 0); + dc.SetTransformMatrix(matrix); + dc.DrawBitmap(m_bmpOrig, 0, 0); + } + + wxImage imgUsingMatrix = bmpUsingMatrix.ConvertToImage(); + wxImage imgOrigRotate90Clockwise = m_imgOrig.Rotate90(true); + + CPPUNIT_ASSERT_EQUAL( imgUsingMatrix, imgOrigRotate90Clockwise ); +} diff --git a/tests/makefile.bcc b/tests/makefile.bcc index 2f07c1b..379b9f5 100644 --- a/tests/makefile.bcc +++ b/tests/makefile.bcc @@ -140,6 +140,7 @@ TEST_GUI_OBJECTS = \ $(OBJS)\test_gui_colour.obj \ $(OBJS)\test_gui_ellipsization.obj \ $(OBJS)\test_gui_measuring.obj \ + $(OBJS)\test_gui_affinematrix.obj \ $(OBJS)\test_gui_config.obj \ $(OBJS)\test_gui_bitmapcomboboxtest.obj \ $(OBJS)\test_gui_bitmaptogglebuttontest.obj \ @@ -744,6 +745,9 @@ $(OBJS)\test_gui_ellipsization.obj: .\graphics\ellipsization.cpp $(OBJS)\test_gui_measuring.obj: .\graphics\measuring.cpp $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\graphics\measuring.cpp +$(OBJS)\test_gui_affinematrix.obj: .\graphics\affinematrix.cpp + $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\graphics\affinematrix.cpp + $(OBJS)\test_gui_config.obj: .\config\config.cpp $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\config\config.cpp diff --git a/tests/makefile.gcc b/tests/makefile.gcc index d8559c0..618098b 100644 --- a/tests/makefile.gcc +++ b/tests/makefile.gcc @@ -133,6 +133,7 @@ TEST_GUI_OBJECTS = \ $(OBJS)\test_gui_colour.o \ $(OBJS)\test_gui_ellipsization.o \ $(OBJS)\test_gui_measuring.o \ + $(OBJS)\test_gui_affinematrix.o \ $(OBJS)\test_gui_config.o \ $(OBJS)\test_gui_bitmapcomboboxtest.o \ $(OBJS)\test_gui_bitmaptogglebuttontest.o \ @@ -725,6 +726,9 @@ $(OBJS)\test_gui_ellipsization.o: ./graphics/ellipsization.cpp $(OBJS)\test_gui_measuring.o: ./graphics/measuring.cpp $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\test_gui_affinematrix.o: ./graphics/affinematrix.cpp + $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\test_gui_config.o: ./config/config.cpp $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $< diff --git a/tests/makefile.vc b/tests/makefile.vc index 7d33b32..4edaa5a 100644 --- a/tests/makefile.vc +++ b/tests/makefile.vc @@ -135,6 +135,7 @@ TEST_GUI_OBJECTS = \ $(OBJS)\test_gui_colour.obj \ $(OBJS)\test_gui_ellipsization.obj \ $(OBJS)\test_gui_measuring.obj \ + $(OBJS)\test_gui_affinematrix.obj \ $(OBJS)\test_gui_config.obj \ $(OBJS)\test_gui_bitmapcomboboxtest.obj \ $(OBJS)\test_gui_bitmaptogglebuttontest.obj \ @@ -870,6 +871,9 @@ $(OBJS)\test_gui_ellipsization.obj: .\graphics\ellipsization.cpp $(OBJS)\test_gui_measuring.obj: .\graphics\measuring.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\graphics\measuring.cpp +$(OBJS)\test_gui_affinematrix.obj: .\graphics\affinematrix.cpp + $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\graphics\affinematrix.cpp + $(OBJS)\test_gui_config.obj: .\config\config.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\config\config.cpp diff --git a/tests/makefile.wat b/tests/makefile.wat index 7c563fd..0ae1d53 100644 --- a/tests/makefile.wat +++ b/tests/makefile.wat @@ -379,6 +379,7 @@ TEST_GUI_OBJECTS = & $(OBJS)\test_gui_colour.obj & $(OBJS)\test_gui_ellipsization.obj & $(OBJS)\test_gui_measuring.obj & + $(OBJS)\test_gui_affinematrix.obj & $(OBJS)\test_gui_config.obj & $(OBJS)\test_gui_bitmapcomboboxtest.obj & $(OBJS)\test_gui_bitmaptogglebuttontest.obj & @@ -784,6 +785,9 @@ $(OBJS)\test_gui_ellipsization.obj : .AUTODEPEND .\graphics\ellipsization.cpp $(OBJS)\test_gui_measuring.obj : .AUTODEPEND .\graphics\measuring.cpp $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $< +$(OBJS)\test_gui_affinematrix.obj : .AUTODEPEND .\graphics\affinematrix.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $< + $(OBJS)\test_gui_config.obj : .AUTODEPEND .\config\config.cpp $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $< diff --git a/tests/test.bkl b/tests/test.bkl index 2f5d0aa..404e15b 100644 --- a/tests/test.bkl +++ b/tests/test.bkl @@ -136,6 +136,7 @@ graphics/colour.cpp graphics/ellipsization.cpp graphics/measuring.cpp + graphics/affinematrix.cpp config/config.cpp controls/bitmapcomboboxtest.cpp controls/bitmaptogglebuttontest.cpp diff --git a/tests/test_test_gui.dsp b/tests/test_test_gui.dsp index 89461de..f412c8d 100644 --- a/tests/test_test_gui.dsp +++ b/tests/test_test_gui.dsp @@ -239,6 +239,10 @@ SOURCE=.\menu\accelentry.cpp # End Source File # Begin Source File +SOURCE=.\graphics\affinematrix.cpp +# End Source File +# Begin Source File + SOURCE=.\asserthelper.cpp # End Source File # Begin Source File diff --git a/tests/test_vc7_test_gui.vcproj b/tests/test_vc7_test_gui.vcproj index 8694367..77ba872 100644 --- a/tests/test_vc7_test_gui.vcproj +++ b/tests/test_vc7_test_gui.vcproj @@ -569,6 +569,9 @@ RelativePath=".\menu\accelentry.cpp"> + + + + diff --git a/tests/test_vc9_test_gui.vcproj b/tests/test_vc9_test_gui.vcproj index a6b4a26..d312302 100644 --- a/tests/test_vc9_test_gui.vcproj +++ b/tests/test_vc9_test_gui.vcproj @@ -804,6 +804,10 @@ > + + -- 2.7.4