diff --git a/tests/Makefile.in b/tests/Makefile.in
index 1df92ac2d3..a267e6d5b1 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 0000000000..ffa4f58d28
--- /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 2f07c1b1cd..379b9f5315 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 d8559c080b..618098b690 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 7d33b327e6..4edaa5a816 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 7c563fdaae..0ae1d53914 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 2f5d0aa81b..404e15b80a 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 89461de8e3..f412c8d6a8 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 8694367444..77ba872270 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 a6b4a266a3..d312302f26 100644
--- a/tests/test_vc9_test_gui.vcproj
+++ b/tests/test_vc9_test_gui.vcproj
@@ -804,6 +804,10 @@
>
+
+