]>
Commit | Line | Data |
---|---|---|
ab797d5d VZ |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Name: tests/graphics/affinetransform.cpp | |
3 | // Purpose: Unit test for transformations implemented for wxAffineMatrix2D | |
4 | // Author: Catalin Raceanu | |
5 | // Created: 2011-04-14 | |
6 | // Copyright: (c) 2011 wxWidgets development team | |
7 | /////////////////////////////////////////////////////////////////////////////// | |
8 | ||
9 | // ---------------------------------------------------------------------------- | |
10 | // headers | |
11 | // ---------------------------------------------------------------------------- | |
12 | ||
13 | #include "testprec.h" | |
14 | ||
15 | #ifdef __BORLANDC__ | |
16 | #pragma hdrstop | |
17 | #endif | |
18 | ||
19 | #include "wx/dcmemory.h" | |
20 | #include "wx/affinematrix2d.h" | |
21 | #include "wx/math.h" | |
22 | ||
23 | #include "testimage.h" | |
24 | ||
25 | // ---------------------------------------------------------------------------- | |
26 | // test class | |
27 | // ---------------------------------------------------------------------------- | |
28 | ||
29 | class AffineTransformTestCase : public CppUnit::TestCase | |
30 | { | |
31 | public: | |
32 | AffineTransformTestCase() | |
33 | { | |
34 | wxImage::AddHandler(new wxJPEGHandler); | |
35 | } | |
36 | ||
37 | virtual void setUp(); | |
38 | ||
39 | private: | |
40 | CPPUNIT_TEST_SUITE( AffineTransformTestCase ); | |
41 | CPPUNIT_TEST( InvertMatrix ); | |
09fa09bf | 42 | #if wxUSE_DC_TRANSFORM_MATRIX |
ab797d5d VZ |
43 | CPPUNIT_TEST( VMirrorAndTranslate ); |
44 | CPPUNIT_TEST( Rotate90Clockwise ); | |
09fa09bf | 45 | #endif // wxUSE_DC_TRANSFORM_MATRIX |
ab797d5d VZ |
46 | CPPUNIT_TEST_SUITE_END(); |
47 | ||
48 | void InvertMatrix(); | |
09fa09bf | 49 | #if wxUSE_DC_TRANSFORM_MATRIX |
ab797d5d VZ |
50 | void VMirrorAndTranslate(); |
51 | void Rotate90Clockwise(); | |
52 | ||
53 | wxImage m_imgOrig; | |
54 | wxBitmap m_bmpOrig; | |
09fa09bf | 55 | #endif // wxUSE_DC_TRANSFORM_MATRIX |
ab797d5d VZ |
56 | |
57 | DECLARE_NO_COPY_CLASS(AffineTransformTestCase) | |
58 | }; | |
59 | ||
60 | // register in the unnamed registry so that these tests are run by default | |
61 | CPPUNIT_TEST_SUITE_REGISTRATION( AffineTransformTestCase ); | |
62 | ||
e3778b4d | 63 | // also include in its own registry so that these tests can be run alone |
ab797d5d VZ |
64 | CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( AffineTransformTestCase, "AffineTransformTestCase" ); |
65 | ||
66 | void AffineTransformTestCase::setUp() | |
67 | { | |
09fa09bf | 68 | #if wxUSE_DC_TRANSFORM_MATRIX |
ab797d5d VZ |
69 | m_imgOrig.LoadFile("horse.jpg"); |
70 | ||
71 | CPPUNIT_ASSERT( m_imgOrig.IsOk() ); | |
72 | ||
73 | m_bmpOrig = wxBitmap(m_imgOrig); | |
09fa09bf | 74 | #endif // wxUSE_DC_TRANSFORM_MATRIX |
ab797d5d VZ |
75 | } |
76 | ||
77 | void AffineTransformTestCase::InvertMatrix() | |
78 | { | |
79 | wxAffineMatrix2D matrix1; | |
80 | matrix1.Set(wxMatrix2D(2, 1, 1, 1), wxPoint2DDouble(1, 1)); | |
81 | ||
82 | wxAffineMatrix2D matrix2(matrix1); | |
83 | ||
84 | matrix2.Invert(); | |
85 | ||
86 | wxMatrix2D m; | |
87 | wxPoint2DDouble p; | |
88 | matrix2.Get(&m, &p); | |
89 | CPPUNIT_ASSERT_EQUAL( 1, (int)m.m_11 ); | |
90 | CPPUNIT_ASSERT_EQUAL( -1, (int)m.m_12 ); | |
91 | CPPUNIT_ASSERT_EQUAL( -1, (int)m.m_21 ); | |
92 | CPPUNIT_ASSERT_EQUAL( 2, (int)m.m_22 ); | |
93 | CPPUNIT_ASSERT_EQUAL( 0, (int)p.m_x ); | |
94 | CPPUNIT_ASSERT_EQUAL( -1, (int)p.m_y ); | |
95 | ||
96 | matrix2.Concat(matrix1); | |
97 | CPPUNIT_ASSERT( matrix2.IsIdentity() ); | |
98 | } | |
99 | ||
09fa09bf VZ |
100 | #if wxUSE_DC_TRANSFORM_MATRIX |
101 | ||
ab797d5d VZ |
102 | void AffineTransformTestCase::VMirrorAndTranslate() |
103 | { | |
104 | wxBitmap bmpUsingMatrix(m_bmpOrig.GetWidth(), m_bmpOrig.GetHeight()); | |
105 | ||
106 | // build the mirrored image using the transformation matrix | |
107 | { | |
108 | wxMemoryDC dc(bmpUsingMatrix); | |
109 | ||
110 | if ( !dc.CanUseTransformMatrix() ) | |
111 | return; | |
112 | ||
113 | wxAffineMatrix2D matrix; | |
114 | matrix.Mirror(wxVERTICAL); | |
115 | matrix.Translate(0, m_bmpOrig.GetHeight() - 1); | |
116 | dc.SetTransformMatrix(matrix); | |
117 | dc.DrawBitmap(m_bmpOrig, 0, 0); | |
118 | } | |
119 | ||
48611b8f VZ |
120 | CPPUNIT_ASSERT_EQUAL( bmpUsingMatrix.ConvertToImage(), |
121 | m_imgOrig.Mirror(false) ); | |
ab797d5d VZ |
122 | } |
123 | ||
124 | void AffineTransformTestCase::Rotate90Clockwise() | |
125 | { | |
126 | wxBitmap bmpUsingMatrix(m_bmpOrig.GetHeight(), m_bmpOrig.GetWidth()); | |
127 | ||
128 | // build the rotated image using the transformation matrix | |
129 | { | |
130 | wxMemoryDC dc(bmpUsingMatrix); | |
131 | ||
132 | if ( !dc.CanUseTransformMatrix() ) | |
133 | return; | |
134 | ||
135 | wxAffineMatrix2D matrix; | |
136 | matrix.Rotate(-0.5 * M_PI); | |
137 | matrix.Translate(m_bmpOrig.GetHeight(), 0); | |
138 | dc.SetTransformMatrix(matrix); | |
139 | dc.DrawBitmap(m_bmpOrig, 0, 0); | |
140 | } | |
141 | ||
48611b8f VZ |
142 | CPPUNIT_ASSERT_EQUAL( bmpUsingMatrix.ConvertToImage(), |
143 | m_imgOrig.Rotate90(true) ); | |
ab797d5d | 144 | } |
09fa09bf VZ |
145 | |
146 | #endif // wxUSE_DC_TRANSFORM_MATRIX |