xref: /AOO41X/main/basegfx/test/basegfx2d.cxx (revision 09dbbe930366fe6f99ae3b8ae1cf8690b638dbda)
1*09dbbe93SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*09dbbe93SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*09dbbe93SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*09dbbe93SAndrew Rist  * distributed with this work for additional information
6*09dbbe93SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*09dbbe93SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*09dbbe93SAndrew Rist  * "License"); you may not use this file except in compliance
9*09dbbe93SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*09dbbe93SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*09dbbe93SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*09dbbe93SAndrew Rist  * software distributed under the License is distributed on an
15*09dbbe93SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*09dbbe93SAndrew Rist  * KIND, either express or implied.  See the License for the
17*09dbbe93SAndrew Rist  * specific language governing permissions and limitations
18*09dbbe93SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*09dbbe93SAndrew Rist  *************************************************************/
21*09dbbe93SAndrew Rist 
22*09dbbe93SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir 
25cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
26cdf0e10cSrcweir #include "precompiled_basegfx.hxx"
27cdf0e10cSrcweir // autogenerated file with codegen.pl
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "preextstl.h"
30cdf0e10cSrcweir #include "cppunit/TestAssert.h"
31cdf0e10cSrcweir #include "cppunit/TestFixture.h"
32cdf0e10cSrcweir #include "cppunit/extensions/HelperMacros.h"
33cdf0e10cSrcweir #include "postextstl.h"
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx>
36cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx>
37cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx>
38cdf0e10cSrcweir #include <basegfx/curve/b2dcubicbezier.hxx>
39cdf0e10cSrcweir #include <basegfx/curve/b2dbeziertools.hxx>
40cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygontools.hxx>
41cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygonclipper.hxx>
42cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygon.hxx>
43cdf0e10cSrcweir #include <basegfx/range/b2dpolyrange.hxx>
44cdf0e10cSrcweir #include <basegfx/numeric/ftools.hxx>
45cdf0e10cSrcweir #include <basegfx/color/bcolor.hxx>
46cdf0e10cSrcweir #include <basegfx/color/bcolortools.hxx>
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include <basegfx/tools/debugplotter.hxx>
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #include <iostream>
51cdf0e10cSrcweir #include <fstream>
52cdf0e10cSrcweir 
53cdf0e10cSrcweir using namespace ::basegfx;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 
56cdf0e10cSrcweir namespace basegfx2d
57cdf0e10cSrcweir {
58cdf0e10cSrcweir 
59cdf0e10cSrcweir class b2dsvgdimpex : public CppUnit::TestFixture
60cdf0e10cSrcweir {
61cdf0e10cSrcweir private:
62cdf0e10cSrcweir     ::rtl::OUString aPath0;
63cdf0e10cSrcweir     ::rtl::OUString aPath1;
64cdf0e10cSrcweir     ::rtl::OUString aPath2;
65cdf0e10cSrcweir     ::rtl::OUString aPath3;
66cdf0e10cSrcweir 
67cdf0e10cSrcweir public:
68cdf0e10cSrcweir     // initialise your test code values here.
69cdf0e10cSrcweir     void setUp()
70cdf0e10cSrcweir     {
71cdf0e10cSrcweir         // simple rectangle
72cdf0e10cSrcweir         aPath0 = ::rtl::OUString::createFromAscii(
73cdf0e10cSrcweir             "M 10 10-10 10-10-10 10-10Z" );
74cdf0e10cSrcweir 
75cdf0e10cSrcweir         // simple bezier polygon
76cdf0e10cSrcweir         aPath1 = ::rtl::OUString::createFromAscii(
77cdf0e10cSrcweir             "m11430 0c-8890 3810 5715 6985 5715 6985 "
78cdf0e10cSrcweir             "0 0-17145-1905-17145-1905 0 0 22860-10160 "
79cdf0e10cSrcweir             "16510 6350-6350 16510-3810-11430-3810-11430z" );
80cdf0e10cSrcweir 
81cdf0e10cSrcweir         // '@' as a bezier polygon
82cdf0e10cSrcweir         aPath2 = ::rtl::OUString::createFromAscii(
83cdf0e10cSrcweir             "m1917 1114c-89-189-233-284-430-284-167 "
84cdf0e10cSrcweir             "0-306 91-419 273-113 182-170 370-170 564 "
85cdf0e10cSrcweir             "0 145 33 259 98 342 65 84 150 126 257 126 "
86cdf0e10cSrcweir             "77 0 154-19 231-57 77-38 147-97 210-176 63"
87cdf0e10cSrcweir             "-79 99-143 109-190 38-199 76-398 114-598z"
88cdf0e10cSrcweir             "m840 1646c-133 73-312 139-537 197-225 57"
89cdf0e10cSrcweir             "-440 86-644 87-483-1-866-132-1150-392-284"
90cdf0e10cSrcweir             "-261-426-619-426-1076 0-292 67-560 200-803 "
91cdf0e10cSrcweir             "133-243 321-433 562-569 241-136 514-204 821"
92cdf0e10cSrcweir             "-204 405 0 739 125 1003 374 264 250 396 550 "
93cdf0e10cSrcweir             "396 899 0 313-88 576-265 787-177 212-386 318"
94cdf0e10cSrcweir             "-627 318-191 0-308-94-352-281-133 187-315 281"
95cdf0e10cSrcweir             "-546 281-172 0-315-67-428-200-113-133-170-301"
96cdf0e10cSrcweir             "-170-505 0-277 90-527 271-751 181-223 394"
97cdf0e10cSrcweir             "-335 640-335 196 0 353 83 470 250 13-68 26"
98cdf0e10cSrcweir             "-136 41-204 96 0 192 0 288 0-74 376-148 752"
99cdf0e10cSrcweir             "-224 1128-21 101-31 183-31 245 0 39 9 70 26 "
100cdf0e10cSrcweir             "93 17 24 39 36 67 36 145 0 279-80 400-240 121"
101cdf0e10cSrcweir             "-160 182-365 182-615 0-288-107-533-322-734"
102cdf0e10cSrcweir             "-215-201-487-301-816-301-395 0-715 124-960 "
103cdf0e10cSrcweir             "373-245 249-368 569-368 958 0 385 119 685 "
104cdf0e10cSrcweir             "357 900 237 216 557 324 958 325 189-1 389-27 "
105cdf0e10cSrcweir             "600-77 211-52 378-110 503-174 27 70 54 140 81 210z" );
106cdf0e10cSrcweir 
107cdf0e10cSrcweir         // first part of 'Hello World' as a line polygon
108cdf0e10cSrcweir         aPath3 = ::rtl::OUString::createFromAscii(
109cdf0e10cSrcweir             "m1598 125h306v2334h-306v-1105h-1293v1105h-305v"
110cdf0e10cSrcweir             "-2334h305v973h1293zm2159 1015 78-44 85 235-91 "
111cdf0e10cSrcweir             "47-91 40-90 34-90 29-89 21-88 16-88 10-88 3-102"
112cdf0e10cSrcweir             "-4-97-12-91-19-85-26-40-16-39-18-38-20-36-22-34"
113cdf0e10cSrcweir             "-24-33-26-32-27-30-30-29-31-27-33-25-33-23-36-21"
114cdf0e10cSrcweir             "-36-19-38-18-40-16-40-26-86-18-91-11-97-4-103 3"
115cdf0e10cSrcweir             "-98 11-94 17-89 24-84 31-79 37-75 22-35 23-34 24"
116cdf0e10cSrcweir             "-33 27-32 28-30 29-28 31-27 31-24 33-22 34-21 35"
117cdf0e10cSrcweir             "-18 37-17 38-14 38-13 41-11 41-8 86-12 91-4 82 4 "
118cdf0e10cSrcweir             "78 10 37 9 37 9 36 12 35 14 33 15 33 17 32 19 31 "
119cdf0e10cSrcweir             "21 30 22 30 25 55 54 26 29 24 31 22 32 21 33 19 "
120cdf0e10cSrcweir             "34 18 36 30 74 23 80 17 84 10 89 3 94v78h-1277l6 "
121cdf0e10cSrcweir             "75 10 70 14 66 19 62 23 57 13 26 14 26 15 25 17 "
122cdf0e10cSrcweir             "23 17 22 19 21 19 20 21 18 21 18 23 16 23 14 24 "
123cdf0e10cSrcweir             "14 26 12 26 11 27 10 28 8 59 13 63 7 67 3 80-3 81"
124cdf0e10cSrcweir             "-9 79-14 80-21 78-26 79-32zm-1049-808-12 53h963l"
125cdf0e10cSrcweir             "-7-51-11-49-14-46-17-43-21-40-24-38-27-36-31-32"
126cdf0e10cSrcweir             "-33-29-35-25-37-22-38-17-40-14-41-9-42-6-44-2-48 "
127cdf0e10cSrcweir             "2-46 6-44 9-42 13-40 17-38 21-36 24-34 28-32 32"
128cdf0e10cSrcweir             "-29 34-26 38-23 41-20 44-17 47zm1648-1293h288v"
129cdf0e10cSrcweir             "2459h-288zm752-2459h288v2459h-288zm1286-1750 86-11 "
130cdf0e10cSrcweir             "91-4 91 4 85 12 42 8 39 11 39 13 38 14 36 17 35 18 "
131cdf0e10cSrcweir             "34 20 33 23 31 24 30 26 29 28 28 30 26 32 25 33 23 "
132cdf0e10cSrcweir             "34 21 35 37 75 31 80 24 84 16 90 11 94 3 100-3 100"
133cdf0e10cSrcweir             "-11 95-16 89-24 85-31 80-37 74-21 35-23 35-25 32-26 "
134cdf0e10cSrcweir             "32-28 30-29 28-30 26-31 24-33 22-34 21-35 18-36 17"
135cdf0e10cSrcweir             "-38 14-39 13-39 10-42 9-85 12-91 4-91-4-86-12-41-9"
136cdf0e10cSrcweir             "-40-10-39-13-37-14-36-17-35-18-34-21-33-22-31-24-30"
137cdf0e10cSrcweir             "-26-29-28-28-30-26-32-25-32-23-35-21-35-38-74-30-80"
138cdf0e10cSrcweir             "-24-85-17-89-11-95-3-100 3-101 11-95 17-90 24-85 30"
139cdf0e10cSrcweir             "-79 38-75 21-35 23-35 25-32 26-32 28-30 29-28 30-26 "
140cdf0e10cSrcweir             "31-24 33-22 34-20 35-18 36-16 37-15 39-12 40-11z" );
141cdf0e10cSrcweir     }
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     void tearDown()
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir     }
146cdf0e10cSrcweir 
147cdf0e10cSrcweir     void impex()
148cdf0e10cSrcweir     {
149cdf0e10cSrcweir         B2DPolyPolygon 	aPoly;
150cdf0e10cSrcweir         ::rtl::OUString aExport;
151cdf0e10cSrcweir 
152cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("importing simple rectangle from SVG-D",
153cdf0e10cSrcweir                                tools::importFromSvgD( aPoly,
154cdf0e10cSrcweir                                                       aPath0 ));
155cdf0e10cSrcweir         aExport = tools::exportToSvgD( aPoly );
156cdf0e10cSrcweir         const char* sExportString = "m10 10h-20v-20h20z";
157cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("exporting rectangle to SVG-D",
158cdf0e10cSrcweir                                !aExport.compareToAscii(sExportString) );
159cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("importing simple rectangle from SVG-D (round-trip",
160cdf0e10cSrcweir                                tools::importFromSvgD( aPoly,
161cdf0e10cSrcweir                                                       aExport ));
162cdf0e10cSrcweir         aExport = tools::exportToSvgD( aPoly );
163cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("exporting rectangle to SVG-D (round-trip)",
164cdf0e10cSrcweir                                !aExport.compareToAscii(sExportString));
165cdf0e10cSrcweir 
166cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("importing simple bezier polygon from SVG-D",
167cdf0e10cSrcweir                                tools::importFromSvgD( aPoly,
168cdf0e10cSrcweir                                                       aPath1 ));
169cdf0e10cSrcweir         aExport = tools::exportToSvgD( aPoly );
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 		// Adaptions for B2DPolygon bezier change (see #i77162#):
172cdf0e10cSrcweir 		//
173cdf0e10cSrcweir 		// The import/export of aPath1 does not reproduce aExport again. This is
174cdf0e10cSrcweir 		// correct since aPath1 contains a segment with non-used control points
175cdf0e10cSrcweir 		// which gets exported now correctly as 'l' and also a point (#4, index 3)
176cdf0e10cSrcweir 		// with C2 continuity which produces a 's' staement now.
177cdf0e10cSrcweir 		//
178cdf0e10cSrcweir 		// The old SVGexport identified nun-used ControlVectors erraneously as bezier segments
179cdf0e10cSrcweir 		// because the 2nd vector at the start point was used, even when added
180cdf0e10cSrcweir 		// with start point was identical to end point. Exactly for that reason
181cdf0e10cSrcweir 		// i reworked the B2DPolygon to use prev, next control points.
182cdf0e10cSrcweir 		//
183cdf0e10cSrcweir 		// so for correct unit test i add the new exported string here as sExportStringSimpleBezier
184cdf0e10cSrcweir 		// and compare to it.
185cdf0e10cSrcweir 		const char* sExportStringSimpleBezier =
186cdf0e10cSrcweir 			"m11430 0c-8890 3810 5715 6985 5715 6985"
187cdf0e10cSrcweir 			"l-17145-1905c0 0 22860-10160 16510 6350"
188cdf0e10cSrcweir 			"s-3810-11430-3810-11430z";
189cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("exporting bezier polygon to SVG-D", !aExport.compareToAscii(sExportStringSimpleBezier));
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 		// Adaptions for B2DPolygon bezier change (see #i77162#):
192cdf0e10cSrcweir 		//
193cdf0e10cSrcweir 		// a 2nd good test is that re-importing of aExport has to create the same
194cdf0e10cSrcweir 		// B2DPolPolygon again:
195cdf0e10cSrcweir 		B2DPolyPolygon aReImport;
196cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("importing simple bezier polygon from SVG-D", tools::importFromSvgD( aReImport, aExport));
197cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("re-imported polygon needs to be identical", aReImport == aPoly);
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("importing '@' from SVG-D", tools::importFromSvgD( aPoly, aPath2 ));
200cdf0e10cSrcweir         aExport = tools::exportToSvgD( aPoly );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 		// Adaptions for B2DPolygon bezier change (see #i77162#):
203cdf0e10cSrcweir 		//
204cdf0e10cSrcweir 		// same here, the corrected export with the corrected B2DPolygon is simply more efficient,
205cdf0e10cSrcweir 		// so i needed to change the compare string. Also adding the re-import comparison below.
206cdf0e10cSrcweir 		const char* sExportString1 =
207cdf0e10cSrcweir 			"m1917 1114c-89-189-233-284-430-284-167 0-306 91-419 273s-170 370-17"
208cdf0e10cSrcweir 			"0 564c0 145 33 259 98 342 65 84 150 126 257 126q115.5 0 231-57s147-97 210-176 99-143 109-190c38-199 76-398 114"
209cdf0e10cSrcweir 			"-598zm840 1646c-133 73-312 139-537 197-225 57-440 86-644 87-483-1-866-132-1150-392-284-261-426-619-426-1076 0-"
210cdf0e10cSrcweir 			"292 67-560 200-803s321-433 562-569 514-204 821-204c405 0 739 125 1003 374 264 250 396 550 396 899 0 313-88 576"
211cdf0e10cSrcweir 			"-265 787q-265.5 318-627 318c-191 0-308-94-352-281-133 187-315 281-546 281-172 0-315-67-428-200s-170-301-170-50"
212cdf0e10cSrcweir 			"5c0-277 90-527 271-751 181-223 394-335 640-335 196 0 353 83 470 250 13-68 26-136 41-204q144 0 288 0c-74 376-14"
213cdf0e10cSrcweir 			"8 752-224 1128-21 101-31 183-31 245 0 39 9 70 26 93 17 24 39 36 67 36 145 0 279-80 400-240s182-365 182-615c0-2"
214cdf0e10cSrcweir 			"88-107-533-322-734s-487-301-816-301c-395 0-715 124-960 373s-368 569-368 958q0 577.5 357 900c237 216 557 324 95"
215cdf0e10cSrcweir 			"8 325 189-1 389-27 600-77 211-52 378-110 503-174q40.5 105 81 210z";
216cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("re-importing '@' from SVG-D", tools::importFromSvgD( aReImport, aExport));
217cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("re-imported '@' needs to be identical", aReImport == aPoly);
218cdf0e10cSrcweir 
219cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("exporting '@' to SVG-D", !aExport.compareToAscii(sExportString1));
220cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("importing '@' from SVG-D (round-trip",
221cdf0e10cSrcweir                                tools::importFromSvgD( aPoly,
222cdf0e10cSrcweir                                                       aExport ));
223cdf0e10cSrcweir         aExport = tools::exportToSvgD( aPoly );
224cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("exporting '@' to SVG-D (round-trip)",
225cdf0e10cSrcweir                                !aExport.compareToAscii(sExportString1));
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 
228cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("importing complex polygon from SVG-D",
229cdf0e10cSrcweir                                tools::importFromSvgD( aPoly,
230cdf0e10cSrcweir                                                       aPath3 ));
231cdf0e10cSrcweir         aExport = tools::exportToSvgD( aPoly );
232cdf0e10cSrcweir         const char* sExportString2 =
233cdf0e10cSrcweir             "m1598 125h306v2334h-306v-1105h-1293v1105h-305v-2334h305v973h1293"
234cdf0e10cSrcweir             "zm2159 1015 78-44 85 235-91 47-91 40-90 34-90 29-89 21-88 16-88 10-88 3-102-4-97"
235cdf0e10cSrcweir             "-12-91-19-85-26-40-16-39-18-38-20-36-22-34-24-33-26-32-27-30-30-29-31-27-33-25-3"
236cdf0e10cSrcweir             "3-23-36-21-36-19-38-18-40-16-40-26-86-18-91-11-97-4-103 3-98 11-94 17-89 24-84 3"
237cdf0e10cSrcweir             "1-79 37-75 22-35 23-34 24-33 27-32 28-30 29-28 31-27 31-24 33-22 34-21 35-18 37-"
238cdf0e10cSrcweir             "17 38-14 38-13 41-11 41-8 86-12 91-4 82 4 78 10 37 9 37 9 36 12 35 14 33 15 33 1"
239cdf0e10cSrcweir             "7 32 19 31 21 30 22 30 25 55 54 26 29 24 31 22 32 21 33 19 34 18 36 30 74 23 80 "
240cdf0e10cSrcweir             "17 84 10 89 3 94v78h-1277l6 75 10 70 14 66 19 62 23 57 13 26 14 26 15 25 17 23 1"
241cdf0e10cSrcweir             "7 22 19 21 19 20 21 18 21 18 23 16 23 14 24 14 26 12 26 11 27 10 28 8 59 13 63 7"
242cdf0e10cSrcweir             " 67 3 80-3 81-9 79-14 80-21 78-26 79-32zm-1049-808-12 53h963l-7-51-11-49-14-46-1"
243cdf0e10cSrcweir             "7-43-21-40-24-38-27-36-31-32-33-29-35-25-37-22-38-17-40-14-41-9-42-6-44-2-48 2-4"
244cdf0e10cSrcweir             "6 6-44 9-42 13-40 17-38 21-36 24-34 28-32 32-29 34-26 38-23 41-20 44-17 47zm1648"
245cdf0e10cSrcweir             "-1293h288v2459h-288zm752-2459h288v2459h-288zm1286-1750 86-11 91-4 91 4 85 12 42 "
246cdf0e10cSrcweir             "8 39 11 39 13 38 14 36 17 35 18 34 20 33 23 31 24 30 26 29 28 28 30 26 32 25 33 "
247cdf0e10cSrcweir             "23 34 21 35 37 75 31 80 24 84 16 90 11 94 3 100-3 100-11 95-16 89-24 85-31 80-37"
248cdf0e10cSrcweir             " 74-21 35-23 35-25 32-26 32-28 30-29 28-30 26-31 24-33 22-34 21-35 18-36 17-38 1"
249cdf0e10cSrcweir             "4-39 13-39 10-42 9-85 12-91 4-91-4-86-12-41-9-40-10-39-13-37-14-36-17-35-18-34-2"
250cdf0e10cSrcweir             "1-33-22-31-24-30-26-29-28-28-30-26-32-25-32-23-35-21-35-38-74-30-80-24-85-17-89-"
251cdf0e10cSrcweir             "11-95-3-100 3-101 11-95 17-90 24-85 30-79 38-75 21-35 23-35 25-32 26-32 28-30 29"
252cdf0e10cSrcweir             "-28 30-26 31-24 33-22 34-20 35-18 36-16 37-15 39-12 40-11z";
253cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("exporting complex polygon to SVG-D",
254cdf0e10cSrcweir                                !aExport.compareToAscii(sExportString2));
255cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("importing complex polygon from SVG-D (round-trip",
256cdf0e10cSrcweir                                tools::importFromSvgD( aPoly,
257cdf0e10cSrcweir                                                       aExport ));
258cdf0e10cSrcweir         aExport = tools::exportToSvgD( aPoly );
259cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("exporting complex polygon to SVG-D (round-trip)",
260cdf0e10cSrcweir                                !aExport.compareToAscii(sExportString2));
261cdf0e10cSrcweir 
262cdf0e10cSrcweir         const B2DPolygon aRect(
263cdf0e10cSrcweir             tools::createPolygonFromRect( B2DRange(0.0,0.0,4000.0,4000.0) ));
264cdf0e10cSrcweir         aExport = tools::exportToSvgD( B2DPolyPolygon(aRect), false, false);
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 		const char* sExportStringRect = "M0 0H4000V4000H0Z";
267cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("exporting to rectangle svg-d string",
268cdf0e10cSrcweir                                !aExport.compareToAscii(sExportStringRect));
269cdf0e10cSrcweir     }
270cdf0e10cSrcweir 
271cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
272cdf0e10cSrcweir     // member functions of the current class,
273cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
274cdf0e10cSrcweir 
275cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dsvgdimpex);
276cdf0e10cSrcweir     CPPUNIT_TEST(impex);
277cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
278cdf0e10cSrcweir }; // class b2dsvgdimpex
279cdf0e10cSrcweir 
280cdf0e10cSrcweir class b2dpolyrange : public CppUnit::TestFixture
281cdf0e10cSrcweir {
282cdf0e10cSrcweir private:
283cdf0e10cSrcweir public:
284cdf0e10cSrcweir     void setUp()
285cdf0e10cSrcweir     {}
286cdf0e10cSrcweir 
287cdf0e10cSrcweir     void tearDown()
288cdf0e10cSrcweir     {}
289cdf0e10cSrcweir 
290cdf0e10cSrcweir     void check()
291cdf0e10cSrcweir     {
292cdf0e10cSrcweir         B2DPolyRange aRange;
293cdf0e10cSrcweir         aRange.appendElement(B2DRange(0,0,1,1),ORIENTATION_POSITIVE);
294cdf0e10cSrcweir         aRange.appendElement(B2DRange(2,2,3,3),ORIENTATION_POSITIVE);
295cdf0e10cSrcweir 
296cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("simple poly range - count",
297cdf0e10cSrcweir                                aRange.count() == 2);
298cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("simple poly range - first element",
299cdf0e10cSrcweir                                aRange.getElement(0).head == B2DRange(0,0,1,1));
300cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("simple poly range - second element",
301cdf0e10cSrcweir                                aRange.getElement(1).head == B2DRange(2,2,3,3));
302cdf0e10cSrcweir 
303cdf0e10cSrcweir         // B2DPolyRange relies on correctly orientated rects
304cdf0e10cSrcweir         const B2DRange aRect(0,0,1,1);
305cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("createPolygonFromRect - correct orientation",
306cdf0e10cSrcweir                                tools::getOrientation(
307cdf0e10cSrcweir                                    tools::createPolygonFromRect(aRect)) == ORIENTATION_POSITIVE );
308cdf0e10cSrcweir     }
309cdf0e10cSrcweir 
310cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
311cdf0e10cSrcweir     // member functions of the current class,
312cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
313cdf0e10cSrcweir 
314cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dpolyrange);
315cdf0e10cSrcweir     CPPUNIT_TEST(check);
316cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
317cdf0e10cSrcweir };
318cdf0e10cSrcweir 
319cdf0e10cSrcweir class b2dbeziertools : public CppUnit::TestFixture
320cdf0e10cSrcweir {
321cdf0e10cSrcweir private:
322cdf0e10cSrcweir     B2DCubicBezier aHalfCircle; 					// not exactly, but a look-alike
323cdf0e10cSrcweir     B2DCubicBezier aQuarterCircle; 					// not exactly, but a look-alike
324cdf0e10cSrcweir     B2DCubicBezier aLoop; 							// identical endpoints, curve goes back to where it started
325cdf0e10cSrcweir     B2DCubicBezier aStraightLineDistinctEndPoints;	// truly a line
326cdf0e10cSrcweir     B2DCubicBezier aStraightLineDistinctEndPoints2;	// truly a line, with slightly different control points
327cdf0e10cSrcweir     B2DCubicBezier aStraightLineIdenticalEndPoints;	// degenerate case of aLoop
328cdf0e10cSrcweir     B2DCubicBezier aStraightLineIdenticalEndPoints2;// degenerate case of aLoop, with slightly different control points
329cdf0e10cSrcweir     B2DCubicBezier aCrossing;						// curve self-intersects somewhere in the middle
330cdf0e10cSrcweir     B2DCubicBezier aCusp;							// curve has a point of undefined tangency
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 
333cdf0e10cSrcweir public:
334cdf0e10cSrcweir     // initialise your test code values here.
335cdf0e10cSrcweir     void setUp()
336cdf0e10cSrcweir     {
337cdf0e10cSrcweir         const B2DPoint a00(0.0, 0.0);
338cdf0e10cSrcweir         const B2DPoint a10(1.0, 0.0);
339cdf0e10cSrcweir         const B2DPoint a11(1.0, 1.0);
340cdf0e10cSrcweir         const B2DPoint a01(0.0, 1.0);
341cdf0e10cSrcweir         const B2DPoint middle( 0.5, 0.5 );
342cdf0e10cSrcweir         const B2DPoint quarterDown( 0.25, 0.25 );
343cdf0e10cSrcweir         const B2DPoint quarterUp( 0.75, 0.75 );
344cdf0e10cSrcweir 
345cdf0e10cSrcweir         aHalfCircle 	= B2DCubicBezier(a00, a01, a11, a10);
346cdf0e10cSrcweir 
347cdf0e10cSrcweir 		// The spline control points become
348cdf0e10cSrcweir 		//
349cdf0e10cSrcweir 		// 	(R * cos(A), R * sin(A))
350cdf0e10cSrcweir 		// 	(R * cos(A) - h * sin(A), R * sin(A) + h * cos (A))
351cdf0e10cSrcweir 		// 	(R * cos(B) + h * sin(B), R * sin(B) - h * cos (B))
352cdf0e10cSrcweir 		// 	(R * cos(B), R * sin(B))
353cdf0e10cSrcweir 		//
354cdf0e10cSrcweir 		// where	h = 4/3 * R * tan ((B-A)/4)
355cdf0e10cSrcweir         //
356cdf0e10cSrcweir         // with R being the radius, A start angle and B end angle (A < B).
357cdf0e10cSrcweir         //
358cdf0e10cSrcweir         // (This calculation courtesy Carl Worth, himself based on
359cdf0e10cSrcweir         // Michael Goldapp and Dokken/Daehlen)
360cdf0e10cSrcweir 
361cdf0e10cSrcweir         // Choosing R=1, A=0, B=pi/2
362cdf0e10cSrcweir         const double h( 4.0/3.0 * tan(M_PI/8.0) );
363cdf0e10cSrcweir         aQuarterCircle 	= B2DCubicBezier(a10 + B2DPoint(1.0,0.0),
364cdf0e10cSrcweir                                          B2DPoint(B2DPoint( 1.0, h ) + B2DPoint(1.0,0.0)),
365cdf0e10cSrcweir                                          B2DPoint(B2DPoint( h, 1.0) + B2DPoint(1.0,0.0)),
366cdf0e10cSrcweir                                          a01 + B2DPoint(1.0,0.0));
367cdf0e10cSrcweir 
368cdf0e10cSrcweir         aCusp 			= B2DCubicBezier(a00 + B2DPoint(2.0,0.0),
369cdf0e10cSrcweir                                          B2DPoint(a11 + B2DPoint(2.0,0.0)),
370cdf0e10cSrcweir                                          B2DPoint(a01 + B2DPoint(2.0,0.0)),
371cdf0e10cSrcweir                                          a10 + B2DPoint(2.0,0.0));
372cdf0e10cSrcweir 
373cdf0e10cSrcweir         aLoop			= B2DCubicBezier(a00 + B2DPoint(3.0,0.0),
374cdf0e10cSrcweir                                          B2DPoint(a01 + B2DPoint(3.0,0.0)),
375cdf0e10cSrcweir                                          B2DPoint(a10 + B2DPoint(3.0,0.0)),
376cdf0e10cSrcweir                                          a00 + B2DPoint(3.0,0.0));
377cdf0e10cSrcweir 
378cdf0e10cSrcweir         aStraightLineDistinctEndPoints  = B2DCubicBezier(a00 + B2DPoint(4.0,0.0),
379cdf0e10cSrcweir                                                          B2DPoint(middle + B2DPoint(4.0,0.0)),
380cdf0e10cSrcweir                                                          B2DPoint(middle + B2DPoint(4.0,0.0)),
381cdf0e10cSrcweir                                                          a11 + B2DPoint(4.0,0.0));
382cdf0e10cSrcweir 
383cdf0e10cSrcweir         aStraightLineDistinctEndPoints2  = B2DCubicBezier(a00 + B2DPoint(5.0,0.0),
384cdf0e10cSrcweir                                                           B2DPoint(quarterDown + B2DPoint(5.0,0.0)),
385cdf0e10cSrcweir                                                           B2DPoint(quarterUp + B2DPoint(5.0,0.0)),
386cdf0e10cSrcweir                                                           a11 + B2DPoint(5.0,0.0));
387cdf0e10cSrcweir 
388cdf0e10cSrcweir         aStraightLineIdenticalEndPoints = B2DCubicBezier(a00 + B2DPoint(6.0,0.0),
389cdf0e10cSrcweir                                                          B2DPoint(a11 + B2DPoint(6.0,0.0)),
390cdf0e10cSrcweir                                                          B2DPoint(a11 + B2DPoint(6.0,0.0)),
391cdf0e10cSrcweir                                                          a00 + B2DPoint(6.0,0.0));
392cdf0e10cSrcweir 
393cdf0e10cSrcweir         aStraightLineIdenticalEndPoints2 = B2DCubicBezier(a00 + B2DPoint(7.0,0.0),
394cdf0e10cSrcweir                                                           B2DPoint(quarterDown + B2DPoint(7.0,0.0)),
395cdf0e10cSrcweir                                                           B2DPoint(quarterUp + B2DPoint(7.0,0.0)),
396cdf0e10cSrcweir                                                           a00 + B2DPoint(7.0,0.0));
397cdf0e10cSrcweir 
398cdf0e10cSrcweir         aCrossing		= B2DCubicBezier(a00 + B2DPoint(8.0,0.0),
399cdf0e10cSrcweir                                          B2DPoint(B2DPoint(2.0,2.0) + B2DPoint(8.0,0.0)),
400cdf0e10cSrcweir                                          B2DPoint(B2DPoint(-1.0,2.0) + B2DPoint(8.0,0.0)),
401cdf0e10cSrcweir                                          a10 + B2DPoint(8.0,0.0));
402cdf0e10cSrcweir 
403cdf0e10cSrcweir         ::std::ofstream output("bez_testcases.gnuplot");
404cdf0e10cSrcweir         DebugPlotter aPlotter( "Original curves",
405cdf0e10cSrcweir                                output );
406cdf0e10cSrcweir 
407cdf0e10cSrcweir         aPlotter.plot( aHalfCircle,
408cdf0e10cSrcweir                        "half circle" );
409cdf0e10cSrcweir         aPlotter.plot( aQuarterCircle,
410cdf0e10cSrcweir                        "quarter circle" );
411cdf0e10cSrcweir         aPlotter.plot( aCusp,
412cdf0e10cSrcweir                        "cusp" );
413cdf0e10cSrcweir         aPlotter.plot( aLoop,
414cdf0e10cSrcweir                        "loop" );
415cdf0e10cSrcweir         aPlotter.plot( aStraightLineDistinctEndPoints,
416cdf0e10cSrcweir                        "straight line 0" );
417cdf0e10cSrcweir         aPlotter.plot( aStraightLineDistinctEndPoints2,
418cdf0e10cSrcweir                        "straight line 1" );
419cdf0e10cSrcweir         aPlotter.plot( aStraightLineIdenticalEndPoints,
420cdf0e10cSrcweir                        "straight line 2" );
421cdf0e10cSrcweir         aPlotter.plot( aStraightLineIdenticalEndPoints2,
422cdf0e10cSrcweir                        "straight line 3" );
423cdf0e10cSrcweir         aPlotter.plot( aCrossing,
424cdf0e10cSrcweir                        "crossing" );
425cdf0e10cSrcweir 
426cdf0e10cSrcweir         // break up a complex bezier (loopy, spiky or self intersecting)
427cdf0e10cSrcweir         // into simple segments (left to right)
428cdf0e10cSrcweir         B2DCubicBezier aSegment = aCrossing;
429cdf0e10cSrcweir 		double fExtremePos(0.0);
430cdf0e10cSrcweir 
431cdf0e10cSrcweir         aPlotter.plot( aSegment, "segment" );
432cdf0e10cSrcweir 		while(aSegment.getMinimumExtremumPosition(fExtremePos))
433cdf0e10cSrcweir 		{
434cdf0e10cSrcweir             aSegment.split(fExtremePos, 0, &aSegment);
435cdf0e10cSrcweir 	        aPlotter.plot( aSegment, "segment" );
436cdf0e10cSrcweir 		}
437cdf0e10cSrcweir     }
438cdf0e10cSrcweir 
439cdf0e10cSrcweir     void tearDown()
440cdf0e10cSrcweir     {
441cdf0e10cSrcweir     }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir     void adaptiveByDistance()
444cdf0e10cSrcweir     {
445cdf0e10cSrcweir         ::std::ofstream output("bez_adaptiveByDistance.gnuplot");
446cdf0e10cSrcweir         DebugPlotter aPlotter( "distance-adaptive subdivision",
447cdf0e10cSrcweir                                output );
448cdf0e10cSrcweir 
449cdf0e10cSrcweir         const double fBound( 0.0001 );
450cdf0e10cSrcweir         B2DPolygon result;
451cdf0e10cSrcweir 
452cdf0e10cSrcweir 		aHalfCircle.adaptiveSubdivideByDistance(result, fBound);
453cdf0e10cSrcweir         aPlotter.plot(result,
454cdf0e10cSrcweir                       "half circle"); result.clear();
455cdf0e10cSrcweir 
456cdf0e10cSrcweir         aQuarterCircle.adaptiveSubdivideByDistance(result, fBound);
457cdf0e10cSrcweir         aPlotter.plot(result,
458cdf0e10cSrcweir                       "quarter circle"); result.clear();
459cdf0e10cSrcweir 
460cdf0e10cSrcweir         aLoop.adaptiveSubdivideByDistance(result, fBound);
461cdf0e10cSrcweir         aPlotter.plot(result,
462cdf0e10cSrcweir                       "loop"); result.clear();
463cdf0e10cSrcweir 
464cdf0e10cSrcweir         aStraightLineDistinctEndPoints.adaptiveSubdivideByDistance(result, fBound);
465cdf0e10cSrcweir         aPlotter.plot(result,
466cdf0e10cSrcweir                       "straight line 0"); result.clear();
467cdf0e10cSrcweir 
468cdf0e10cSrcweir         aStraightLineDistinctEndPoints2.adaptiveSubdivideByDistance(result, fBound);
469cdf0e10cSrcweir         aPlotter.plot(result,
470cdf0e10cSrcweir                       "straight line 1"); result.clear();
471cdf0e10cSrcweir 
472cdf0e10cSrcweir         aStraightLineIdenticalEndPoints.adaptiveSubdivideByDistance(result, fBound);
473cdf0e10cSrcweir         aPlotter.plot(result,
474cdf0e10cSrcweir                       "straight line 2"); result.clear();
475cdf0e10cSrcweir 
476cdf0e10cSrcweir         aStraightLineIdenticalEndPoints2.adaptiveSubdivideByDistance(result, fBound);
477cdf0e10cSrcweir         aPlotter.plot(result,
478cdf0e10cSrcweir                       "straight line 3"); result.clear();
479cdf0e10cSrcweir 
480cdf0e10cSrcweir         aCrossing.adaptiveSubdivideByDistance(result, fBound);
481cdf0e10cSrcweir         aPlotter.plot(result,
482cdf0e10cSrcweir                       "straight line 4"); result.clear();
483cdf0e10cSrcweir 
484cdf0e10cSrcweir         aCusp.adaptiveSubdivideByDistance(result, fBound);
485cdf0e10cSrcweir         aPlotter.plot(result,
486cdf0e10cSrcweir                       "straight line 5"); result.clear();
487cdf0e10cSrcweir 
488cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("adaptiveByDistance", true );
489cdf0e10cSrcweir     }
490cdf0e10cSrcweir 
491cdf0e10cSrcweir     void adaptiveByAngle()
492cdf0e10cSrcweir     {
493cdf0e10cSrcweir         const double fBound( 5.0 );
494cdf0e10cSrcweir         B2DPolygon result;
495cdf0e10cSrcweir 
496cdf0e10cSrcweir         ::std::ofstream output("bez_adaptiveByAngle.gnuplot");
497cdf0e10cSrcweir         DebugPlotter aPlotter( "angle-adaptive subdivision",
498cdf0e10cSrcweir                                output );
499cdf0e10cSrcweir 
500cdf0e10cSrcweir         aHalfCircle.adaptiveSubdivideByAngle(result, fBound, true);
501cdf0e10cSrcweir         aPlotter.plot(result,
502cdf0e10cSrcweir                       "half circle"); result.clear();
503cdf0e10cSrcweir 
504cdf0e10cSrcweir         aQuarterCircle.adaptiveSubdivideByAngle(result, fBound, true);
505cdf0e10cSrcweir         aPlotter.plot(result,
506cdf0e10cSrcweir                       "quarter cirle"); result.clear();
507cdf0e10cSrcweir 
508cdf0e10cSrcweir         aLoop.adaptiveSubdivideByAngle(result, fBound, true);
509cdf0e10cSrcweir         aPlotter.plot(result,
510cdf0e10cSrcweir                       "loop"); result.clear();
511cdf0e10cSrcweir 
512cdf0e10cSrcweir         aStraightLineDistinctEndPoints.adaptiveSubdivideByAngle(result, fBound, true);
513cdf0e10cSrcweir         aPlotter.plot(result,
514cdf0e10cSrcweir                       "straight line 0"); result.clear();
515cdf0e10cSrcweir 
516cdf0e10cSrcweir         aStraightLineDistinctEndPoints2.adaptiveSubdivideByAngle(result, fBound, true);
517cdf0e10cSrcweir         aPlotter.plot(result,
518cdf0e10cSrcweir                       "straight line 1"); result.clear();
519cdf0e10cSrcweir 
520cdf0e10cSrcweir         aStraightLineIdenticalEndPoints.adaptiveSubdivideByAngle(result, fBound, true);
521cdf0e10cSrcweir         aPlotter.plot(result,
522cdf0e10cSrcweir                       "straight line 2"); result.clear();
523cdf0e10cSrcweir 
524cdf0e10cSrcweir         aStraightLineIdenticalEndPoints2.adaptiveSubdivideByAngle(result, fBound, true);
525cdf0e10cSrcweir         aPlotter.plot(result,
526cdf0e10cSrcweir                       "straight line 3"); result.clear();
527cdf0e10cSrcweir 
528cdf0e10cSrcweir         aCrossing.adaptiveSubdivideByAngle(result, fBound, true);
529cdf0e10cSrcweir         aPlotter.plot(result,
530cdf0e10cSrcweir                       "straight line 4"); result.clear();
531cdf0e10cSrcweir 
532cdf0e10cSrcweir         aCusp.adaptiveSubdivideByAngle(result, fBound, true);
533cdf0e10cSrcweir         aPlotter.plot(result,
534cdf0e10cSrcweir                       "straight line 5"); result.clear();
535cdf0e10cSrcweir 
536cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("adaptiveByAngle", true );
537cdf0e10cSrcweir     }
538cdf0e10cSrcweir 
539cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
540cdf0e10cSrcweir     // member functions of the current class,
541cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
542cdf0e10cSrcweir 
543cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dbeziertools);
544cdf0e10cSrcweir     CPPUNIT_TEST(adaptiveByDistance);	// TODO: add tests for quadratic bezier (subdivide and degree reduction)
545cdf0e10cSrcweir     CPPUNIT_TEST(adaptiveByAngle);
546cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
547cdf0e10cSrcweir }; // class b2dcubicbezier
548cdf0e10cSrcweir 
549cdf0e10cSrcweir 
550cdf0e10cSrcweir class b2dcubicbezier : public CppUnit::TestFixture
551cdf0e10cSrcweir {
552cdf0e10cSrcweir public:
553cdf0e10cSrcweir     // initialise your test code values here.
554cdf0e10cSrcweir     void setUp()
555cdf0e10cSrcweir     {
556cdf0e10cSrcweir     }
557cdf0e10cSrcweir 
558cdf0e10cSrcweir     void tearDown()
559cdf0e10cSrcweir     {
560cdf0e10cSrcweir     }
561cdf0e10cSrcweir 
562cdf0e10cSrcweir     // insert your test code here.
563cdf0e10cSrcweir     void EmptyMethod()
564cdf0e10cSrcweir     {
565cdf0e10cSrcweir         // this is demonstration code
566cdf0e10cSrcweir         // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
567cdf0e10cSrcweir     }
568cdf0e10cSrcweir 
569cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
570cdf0e10cSrcweir     // member functions of the current class,
571cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
572cdf0e10cSrcweir 
573cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dcubicbezier);
574cdf0e10cSrcweir     CPPUNIT_TEST(EmptyMethod);
575cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
576cdf0e10cSrcweir }; // class b2dcubicbezier
577cdf0e10cSrcweir 
578cdf0e10cSrcweir 
579cdf0e10cSrcweir class b2dhommatrix : public CppUnit::TestFixture
580cdf0e10cSrcweir {
581cdf0e10cSrcweir private:
582cdf0e10cSrcweir     B2DHomMatrix	maIdentity;
583cdf0e10cSrcweir     B2DHomMatrix	maScale;
584cdf0e10cSrcweir     B2DHomMatrix	maTranslate;
585cdf0e10cSrcweir     B2DHomMatrix	maShear;
586cdf0e10cSrcweir     B2DHomMatrix	maAffine;
587cdf0e10cSrcweir     B2DHomMatrix	maPerspective;
588cdf0e10cSrcweir 
589cdf0e10cSrcweir public:
590cdf0e10cSrcweir     // initialise your test code values here.
591cdf0e10cSrcweir     void setUp()
592cdf0e10cSrcweir     {
593cdf0e10cSrcweir         // setup some test matrices
594cdf0e10cSrcweir         maIdentity.identity(); // force compact layout
595cdf0e10cSrcweir         maIdentity.set(0,0, 1.0);
596cdf0e10cSrcweir         maIdentity.set(0,1, 0.0);
597cdf0e10cSrcweir         maIdentity.set(0,2, 0.0);
598cdf0e10cSrcweir         maIdentity.set(1,0, 0.0);
599cdf0e10cSrcweir         maIdentity.set(1,1, 1.0);
600cdf0e10cSrcweir         maIdentity.set(1,2, 0.0);
601cdf0e10cSrcweir 
602cdf0e10cSrcweir         maScale.identity(); // force compact layout
603cdf0e10cSrcweir         maScale.set(0,0, 2.0);
604cdf0e10cSrcweir         maScale.set(1,1, 20.0);
605cdf0e10cSrcweir 
606cdf0e10cSrcweir         maTranslate.identity(); // force compact layout
607cdf0e10cSrcweir         maTranslate.set(0,2, 20.0);
608cdf0e10cSrcweir         maTranslate.set(1,2, 2.0);
609cdf0e10cSrcweir 
610cdf0e10cSrcweir         maShear.identity(); // force compact layout
611cdf0e10cSrcweir         maShear.set(0,1, 3.0);
612cdf0e10cSrcweir         maShear.set(1,0, 7.0);
613cdf0e10cSrcweir         maShear.set(1,1, 22.0);
614cdf0e10cSrcweir 
615cdf0e10cSrcweir         maAffine.identity(); // force compact layout
616cdf0e10cSrcweir         maAffine.set(0,0, 1.0);
617cdf0e10cSrcweir         maAffine.set(0,1, 2.0);
618cdf0e10cSrcweir         maAffine.set(0,2, 3.0);
619cdf0e10cSrcweir         maAffine.set(1,0, 4.0);
620cdf0e10cSrcweir         maAffine.set(1,1, 5.0);
621cdf0e10cSrcweir         maAffine.set(1,2, 6.0);
622cdf0e10cSrcweir 
623cdf0e10cSrcweir         maPerspective.set(0,0, 1.0);
624cdf0e10cSrcweir         maPerspective.set(0,1, 2.0);
625cdf0e10cSrcweir         maPerspective.set(0,2, 3.0);
626cdf0e10cSrcweir         maPerspective.set(1,0, 4.0);
627cdf0e10cSrcweir         maPerspective.set(1,1, 5.0);
628cdf0e10cSrcweir         maPerspective.set(1,2, 6.0);
629cdf0e10cSrcweir         maPerspective.set(2,0, 7.0);
630cdf0e10cSrcweir         maPerspective.set(2,1, 8.0);
631cdf0e10cSrcweir         maPerspective.set(2,2, 9.0);
632cdf0e10cSrcweir     }
633cdf0e10cSrcweir 
634cdf0e10cSrcweir     void tearDown()
635cdf0e10cSrcweir     {
636cdf0e10cSrcweir     }
637cdf0e10cSrcweir 
638cdf0e10cSrcweir     void equal()
639cdf0e10cSrcweir     {
640cdf0e10cSrcweir         B2DHomMatrix	aIdentity;
641cdf0e10cSrcweir         B2DHomMatrix	aScale;
642cdf0e10cSrcweir         B2DHomMatrix	aTranslate;
643cdf0e10cSrcweir         B2DHomMatrix	aShear;
644cdf0e10cSrcweir         B2DHomMatrix	aAffine;
645cdf0e10cSrcweir         B2DHomMatrix	aPerspective;
646cdf0e10cSrcweir 
647cdf0e10cSrcweir         // setup some test matrices
648cdf0e10cSrcweir         aIdentity.identity(); // force compact layout
649cdf0e10cSrcweir         aIdentity.set(0,0, 1.0);
650cdf0e10cSrcweir         aIdentity.set(0,1, 0.0);
651cdf0e10cSrcweir         aIdentity.set(0,2, 0.0);
652cdf0e10cSrcweir         aIdentity.set(1,0, 0.0);
653cdf0e10cSrcweir         aIdentity.set(1,1, 1.0);
654cdf0e10cSrcweir         aIdentity.set(1,2, 0.0);
655cdf0e10cSrcweir 
656cdf0e10cSrcweir         aScale.identity(); // force compact layout
657cdf0e10cSrcweir         aScale.set(0,0, 2.0);
658cdf0e10cSrcweir         aScale.set(1,1, 20.0);
659cdf0e10cSrcweir 
660cdf0e10cSrcweir         aTranslate.identity(); // force compact layout
661cdf0e10cSrcweir         aTranslate.set(0,2, 20.0);
662cdf0e10cSrcweir         aTranslate.set(1,2, 2.0);
663cdf0e10cSrcweir 
664cdf0e10cSrcweir         aShear.identity(); // force compact layout
665cdf0e10cSrcweir         aShear.set(0,1, 3.0);
666cdf0e10cSrcweir         aShear.set(1,0, 7.0);
667cdf0e10cSrcweir         aShear.set(1,1, 22.0);
668cdf0e10cSrcweir 
669cdf0e10cSrcweir         aAffine.identity(); // force compact layout
670cdf0e10cSrcweir         aAffine.set(0,0, 1.0);
671cdf0e10cSrcweir         aAffine.set(0,1, 2.0);
672cdf0e10cSrcweir         aAffine.set(0,2, 3.0);
673cdf0e10cSrcweir         aAffine.set(1,0, 4.0);
674cdf0e10cSrcweir         aAffine.set(1,1, 5.0);
675cdf0e10cSrcweir         aAffine.set(1,2, 6.0);
676cdf0e10cSrcweir 
677cdf0e10cSrcweir         aPerspective.set(0,0, 1.0);
678cdf0e10cSrcweir         aPerspective.set(0,1, 2.0);
679cdf0e10cSrcweir         aPerspective.set(0,2, 3.0);
680cdf0e10cSrcweir         aPerspective.set(1,0, 4.0);
681cdf0e10cSrcweir         aPerspective.set(1,1, 5.0);
682cdf0e10cSrcweir         aPerspective.set(1,2, 6.0);
683cdf0e10cSrcweir         aPerspective.set(2,0, 7.0);
684cdf0e10cSrcweir         aPerspective.set(2,1, 8.0);
685cdf0e10cSrcweir         aPerspective.set(2,2, 9.0);
686cdf0e10cSrcweir 
687cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("operator==: identity matrix", aIdentity == maIdentity);
688cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("operator==: scale matrix", aScale == maScale);
689cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("operator==: translate matrix", aTranslate == maTranslate);
690cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("operator==: shear matrix", aShear == maShear);
691cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("operator==: affine matrix", aAffine == maAffine);
692cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("operator==: perspective matrix", aPerspective == maPerspective);
693cdf0e10cSrcweir     }
694cdf0e10cSrcweir 
695cdf0e10cSrcweir     void identity()
696cdf0e10cSrcweir     {
697cdf0e10cSrcweir         B2DHomMatrix ident;
698cdf0e10cSrcweir 
699cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("identity", maIdentity == ident);
700cdf0e10cSrcweir     }
701cdf0e10cSrcweir 
702cdf0e10cSrcweir     void scale()
703cdf0e10cSrcweir     {
704cdf0e10cSrcweir         B2DHomMatrix mat;
705cdf0e10cSrcweir         mat.scale(2.0,20.0);
706cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("scale", maScale == mat);
707cdf0e10cSrcweir     }
708cdf0e10cSrcweir 
709cdf0e10cSrcweir     void translate()
710cdf0e10cSrcweir     {
711cdf0e10cSrcweir         B2DHomMatrix mat;
712cdf0e10cSrcweir         mat.translate(20.0,2.0);
713cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("translate", maTranslate == mat);
714cdf0e10cSrcweir     }
715cdf0e10cSrcweir 
716cdf0e10cSrcweir     void shear()
717cdf0e10cSrcweir     {
718cdf0e10cSrcweir         B2DHomMatrix mat;
719cdf0e10cSrcweir         mat.shearX(3.0);
720cdf0e10cSrcweir         mat.shearY(7.0);
721cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("translate", maShear == mat);
722cdf0e10cSrcweir     }
723cdf0e10cSrcweir 
724cdf0e10cSrcweir     void multiply()
725cdf0e10cSrcweir     {
726cdf0e10cSrcweir         B2DHomMatrix affineAffineProd;
727cdf0e10cSrcweir 
728cdf0e10cSrcweir         affineAffineProd.set(0,0, 9);
729cdf0e10cSrcweir         affineAffineProd.set(0,1, 12);
730cdf0e10cSrcweir         affineAffineProd.set(0,2, 18);
731cdf0e10cSrcweir         affineAffineProd.set(1,0, 24);
732cdf0e10cSrcweir         affineAffineProd.set(1,1, 33);
733cdf0e10cSrcweir         affineAffineProd.set(1,2, 48);
734cdf0e10cSrcweir 
735cdf0e10cSrcweir         B2DHomMatrix affinePerspectiveProd;
736cdf0e10cSrcweir 
737cdf0e10cSrcweir         affinePerspectiveProd.set(0,0, 30);
738cdf0e10cSrcweir         affinePerspectiveProd.set(0,1, 36);
739cdf0e10cSrcweir         affinePerspectiveProd.set(0,2, 42);
740cdf0e10cSrcweir         affinePerspectiveProd.set(1,0, 66);
741cdf0e10cSrcweir         affinePerspectiveProd.set(1,1, 81);
742cdf0e10cSrcweir         affinePerspectiveProd.set(1,2, 96);
743cdf0e10cSrcweir         affinePerspectiveProd.set(2,0, 7);
744cdf0e10cSrcweir         affinePerspectiveProd.set(2,1, 8);
745cdf0e10cSrcweir         affinePerspectiveProd.set(2,2, 9);
746cdf0e10cSrcweir 
747cdf0e10cSrcweir         B2DHomMatrix perspectiveAffineProd;
748cdf0e10cSrcweir 
749cdf0e10cSrcweir         perspectiveAffineProd.set(0,0, 9);
750cdf0e10cSrcweir         perspectiveAffineProd.set(0,1, 12);
751cdf0e10cSrcweir         perspectiveAffineProd.set(0,2, 18);
752cdf0e10cSrcweir         perspectiveAffineProd.set(1,0, 24);
753cdf0e10cSrcweir         perspectiveAffineProd.set(1,1, 33);
754cdf0e10cSrcweir         perspectiveAffineProd.set(1,2, 48);
755cdf0e10cSrcweir         perspectiveAffineProd.set(2,0, 39);
756cdf0e10cSrcweir         perspectiveAffineProd.set(2,1, 54);
757cdf0e10cSrcweir         perspectiveAffineProd.set(2,2, 78);
758cdf0e10cSrcweir 
759cdf0e10cSrcweir         B2DHomMatrix perspectivePerspectiveProd;
760cdf0e10cSrcweir 
761cdf0e10cSrcweir         perspectivePerspectiveProd.set(0,0, 30);
762cdf0e10cSrcweir         perspectivePerspectiveProd.set(0,1, 36);
763cdf0e10cSrcweir         perspectivePerspectiveProd.set(0,2, 42);
764cdf0e10cSrcweir         perspectivePerspectiveProd.set(1,0, 66);
765cdf0e10cSrcweir         perspectivePerspectiveProd.set(1,1, 81);
766cdf0e10cSrcweir         perspectivePerspectiveProd.set(1,2, 96);
767cdf0e10cSrcweir         perspectivePerspectiveProd.set(2,0, 102);
768cdf0e10cSrcweir         perspectivePerspectiveProd.set(2,1, 126);
769cdf0e10cSrcweir         perspectivePerspectiveProd.set(2,2, 150);
770cdf0e10cSrcweir 
771cdf0e10cSrcweir         B2DHomMatrix temp;
772cdf0e10cSrcweir 
773cdf0e10cSrcweir         temp = maAffine;
774cdf0e10cSrcweir         temp*=maAffine;
775cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("multiply: both compact", temp == affineAffineProd);
776cdf0e10cSrcweir 
777cdf0e10cSrcweir         temp = maPerspective;
778cdf0e10cSrcweir         temp*=maAffine;
779cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("multiply: first compact", temp == affinePerspectiveProd);
780cdf0e10cSrcweir 
781cdf0e10cSrcweir         temp = maAffine;
782cdf0e10cSrcweir         temp*=maPerspective;
783cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("multiply: second compact", temp == perspectiveAffineProd);
784cdf0e10cSrcweir 
785cdf0e10cSrcweir         temp = maPerspective;
786cdf0e10cSrcweir         temp*=maPerspective;
787cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("multiply: none compact", temp == perspectivePerspectiveProd);
788cdf0e10cSrcweir     }
789cdf0e10cSrcweir 
790cdf0e10cSrcweir 	void impFillMatrix(B2DHomMatrix& rSource, double fScaleX, double fScaleY, double fShearX, double fRotate)
791cdf0e10cSrcweir 	{
792cdf0e10cSrcweir 		// fill rSource with a linear combination of scale, shear and rotate
793cdf0e10cSrcweir 		rSource.identity();
794cdf0e10cSrcweir 		rSource.scale(fScaleX, fScaleY);
795cdf0e10cSrcweir 		rSource.shearX(fShearX);
796cdf0e10cSrcweir 		rSource.rotate(fRotate);
797cdf0e10cSrcweir 	}
798cdf0e10cSrcweir 
799cdf0e10cSrcweir 	bool impDecomposeComposeTest(double fScaleX, double fScaleY, double fShearX, double fRotate)
800cdf0e10cSrcweir 	{
801cdf0e10cSrcweir 		// linear combine matrix with given values
802cdf0e10cSrcweir 		B2DHomMatrix aSource;
803cdf0e10cSrcweir 		impFillMatrix(aSource, fScaleX, fScaleY, fShearX, fRotate);
804cdf0e10cSrcweir 
805cdf0e10cSrcweir 		// decompose that matrix
806cdf0e10cSrcweir 		B2DTuple aDScale;
807cdf0e10cSrcweir 		B2DTuple aDTrans;
808cdf0e10cSrcweir 		double fDRot;
809cdf0e10cSrcweir 		double fDShX;
810cdf0e10cSrcweir 		bool bWorked = aSource.decompose(aDScale, aDTrans, fDRot, fDShX);
811cdf0e10cSrcweir 
812cdf0e10cSrcweir 		// linear combine another matrix with decomposition results
813cdf0e10cSrcweir 		B2DHomMatrix aRecombined;
814cdf0e10cSrcweir 		impFillMatrix(aRecombined, aDScale.getX(), aDScale.getY(), fDShX, fDRot);
815cdf0e10cSrcweir 
816cdf0e10cSrcweir 		// if decomposition worked, matrices need to be the same
817cdf0e10cSrcweir 		return bWorked && aSource == aRecombined;
818cdf0e10cSrcweir 	}
819cdf0e10cSrcweir 
820cdf0e10cSrcweir     void decompose()
821cdf0e10cSrcweir     {
822cdf0e10cSrcweir 		// test matrix decompositions. Each matrix decomposed and rebuilt
823cdf0e10cSrcweir 		// using the decompose result should be the same as before. Test
824cdf0e10cSrcweir 		// with all ranges of values. Translations are not tested since these
825cdf0e10cSrcweir 		// are just the two rightmost values and uncritical
826cdf0e10cSrcweir 		static double fSX(10.0);
827cdf0e10cSrcweir 		static double fSY(12.0);
828cdf0e10cSrcweir 		static double fR(45.0 * F_PI180);
829cdf0e10cSrcweir 		static double fS(15.0 * F_PI180);
830cdf0e10cSrcweir 
831cdf0e10cSrcweir 		// check all possible scaling combinations
832cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test A1", impDecomposeComposeTest(fSX, fSY, 0.0, 0.0));
833cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test A2", impDecomposeComposeTest(-fSX, fSY, 0.0, 0.0));
834cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test A3", impDecomposeComposeTest(fSX, -fSY, 0.0, 0.0));
835cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test A4", impDecomposeComposeTest(-fSX, -fSY, 0.0, 0.0));
836cdf0e10cSrcweir 
837cdf0e10cSrcweir 		// check all possible scaling combinations with positive rotation
838cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test B1", impDecomposeComposeTest(fSX, fSY, 0.0, fR));
839cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test B2", impDecomposeComposeTest(-fSX, fSY, 0.0, fR));
840cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test B3", impDecomposeComposeTest(fSX, -fSY, 0.0, fR));
841cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test B4", impDecomposeComposeTest(-fSX, -fSY, 0.0, fR));
842cdf0e10cSrcweir 
843cdf0e10cSrcweir 		// check all possible scaling combinations with negative rotation
844cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test C1", impDecomposeComposeTest(fSX, fSY, 0.0, -fR));
845cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test C2", impDecomposeComposeTest(-fSX, fSY, 0.0, -fR));
846cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test C3", impDecomposeComposeTest(fSX, -fSY, 0.0, -fR));
847cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test C4", impDecomposeComposeTest(-fSX, -fSY, 0.0, -fR));
848cdf0e10cSrcweir 
849cdf0e10cSrcweir 		// check all possible scaling combinations with positive shear
850cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test D1", impDecomposeComposeTest(fSX, fSY, tan(fS), 0.0));
851cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test D2", impDecomposeComposeTest(-fSX, fSY, tan(fS), 0.0));
852cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test D3", impDecomposeComposeTest(fSX, -fSY, tan(fS), 0.0));
853cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test D4", impDecomposeComposeTest(-fSX, -fSY, tan(fS), 0.0));
854cdf0e10cSrcweir 
855cdf0e10cSrcweir 		// check all possible scaling combinations with negative shear
856cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test E1", impDecomposeComposeTest(fSX, fSY, tan(-fS), 0.0));
857cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test E2", impDecomposeComposeTest(-fSX, fSY, tan(-fS), 0.0));
858cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test E3", impDecomposeComposeTest(fSX, -fSY, tan(-fS), 0.0));
859cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test E4", impDecomposeComposeTest(-fSX, -fSY, tan(-fS), 0.0));
860cdf0e10cSrcweir 
861cdf0e10cSrcweir 		// check all possible scaling combinations with positive rotate and positive shear
862cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test F1", impDecomposeComposeTest(fSX, fSY, tan(fS), fR));
863cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test F2", impDecomposeComposeTest(-fSX, fSY, tan(fS), fR));
864cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test F3", impDecomposeComposeTest(fSX, -fSY, tan(fS), fR));
865cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test F4", impDecomposeComposeTest(-fSX, -fSY, tan(fS), fR));
866cdf0e10cSrcweir 
867cdf0e10cSrcweir 		// check all possible scaling combinations with negative rotate and positive shear
868cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test G1", impDecomposeComposeTest(fSX, fSY, tan(fS), -fR));
869cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test G2", impDecomposeComposeTest(-fSX, fSY, tan(fS), -fR));
870cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test G3", impDecomposeComposeTest(fSX, -fSY, tan(fS), -fR));
871cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test G4", impDecomposeComposeTest(-fSX, -fSY, tan(fS), -fR));
872cdf0e10cSrcweir 
873cdf0e10cSrcweir 		// check all possible scaling combinations with positive rotate and negative shear
874cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test H1", impDecomposeComposeTest(fSX, fSY, tan(-fS), fR));
875cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test H2", impDecomposeComposeTest(-fSX, fSY, tan(-fS), fR));
876cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test H3", impDecomposeComposeTest(fSX, -fSY, tan(-fS), fR));
877cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test H4", impDecomposeComposeTest(-fSX, -fSY, tan(-fS), fR));
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 		// check all possible scaling combinations with negative rotate and negative shear
880cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test I1", impDecomposeComposeTest(fSX, fSY, tan(-fS), -fR));
881cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test I2", impDecomposeComposeTest(-fSX, fSY, tan(-fS), -fR));
882cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test I3", impDecomposeComposeTest(fSX, -fSY, tan(-fS), -fR));
883cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE("decompose: error test I4", impDecomposeComposeTest(-fSX, -fSY, tan(-fS), -fR));
884cdf0e10cSrcweir 	}
885cdf0e10cSrcweir 
886cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
887cdf0e10cSrcweir     // member functions of the current class,
888cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
889cdf0e10cSrcweir 
890cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dhommatrix);
891cdf0e10cSrcweir     CPPUNIT_TEST(equal);
892cdf0e10cSrcweir     CPPUNIT_TEST(identity);
893cdf0e10cSrcweir     CPPUNIT_TEST(scale);
894cdf0e10cSrcweir     CPPUNIT_TEST(translate);
895cdf0e10cSrcweir     CPPUNIT_TEST(shear);
896cdf0e10cSrcweir     CPPUNIT_TEST(multiply);
897cdf0e10cSrcweir     CPPUNIT_TEST(decompose);
898cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
899cdf0e10cSrcweir 
900cdf0e10cSrcweir }; // class b2dhommatrix
901cdf0e10cSrcweir 
902cdf0e10cSrcweir 
903cdf0e10cSrcweir class b2dhompoint : public CppUnit::TestFixture
904cdf0e10cSrcweir {
905cdf0e10cSrcweir public:
906cdf0e10cSrcweir     // initialise your test code values here.
907cdf0e10cSrcweir     void setUp()
908cdf0e10cSrcweir     {
909cdf0e10cSrcweir     }
910cdf0e10cSrcweir 
911cdf0e10cSrcweir     void tearDown()
912cdf0e10cSrcweir     {
913cdf0e10cSrcweir     }
914cdf0e10cSrcweir 
915cdf0e10cSrcweir     // insert your test code here.
916cdf0e10cSrcweir     void EmptyMethod()
917cdf0e10cSrcweir     {
918cdf0e10cSrcweir     }
919cdf0e10cSrcweir 
920cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
921cdf0e10cSrcweir     // member functions of the current class,
922cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
923cdf0e10cSrcweir 
924cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dhompoint);
925cdf0e10cSrcweir     CPPUNIT_TEST(EmptyMethod);
926cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
927cdf0e10cSrcweir }; // class b2dhompoint
928cdf0e10cSrcweir 
929cdf0e10cSrcweir 
930cdf0e10cSrcweir class b2dpoint : public CppUnit::TestFixture
931cdf0e10cSrcweir {
932cdf0e10cSrcweir public:
933cdf0e10cSrcweir     // initialise your test code values here.
934cdf0e10cSrcweir     void setUp()
935cdf0e10cSrcweir     {
936cdf0e10cSrcweir     }
937cdf0e10cSrcweir 
938cdf0e10cSrcweir     void tearDown()
939cdf0e10cSrcweir     {
940cdf0e10cSrcweir     }
941cdf0e10cSrcweir 
942cdf0e10cSrcweir     // insert your test code here.
943cdf0e10cSrcweir     // this is only demonstration code
944cdf0e10cSrcweir     void EmptyMethod()
945cdf0e10cSrcweir     {
946cdf0e10cSrcweir     	  // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
947cdf0e10cSrcweir     }
948cdf0e10cSrcweir 
949cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
950cdf0e10cSrcweir     // member functions of the current class,
951cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
952cdf0e10cSrcweir 
953cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dpoint);
954cdf0e10cSrcweir     CPPUNIT_TEST(EmptyMethod);
955cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
956cdf0e10cSrcweir }; // class b2dpoint
957cdf0e10cSrcweir 
958cdf0e10cSrcweir 
959cdf0e10cSrcweir class b2dpolygon : public CppUnit::TestFixture
960cdf0e10cSrcweir {
961cdf0e10cSrcweir public:
962cdf0e10cSrcweir     // initialise your test code values here.
963cdf0e10cSrcweir     void setUp()
964cdf0e10cSrcweir     {
965cdf0e10cSrcweir     }
966cdf0e10cSrcweir 
967cdf0e10cSrcweir     void tearDown()
968cdf0e10cSrcweir     {
969cdf0e10cSrcweir     }
970cdf0e10cSrcweir 
971cdf0e10cSrcweir     // insert your test code here.
972cdf0e10cSrcweir     void testBasics()
973cdf0e10cSrcweir     {
974cdf0e10cSrcweir         B2DPolygon aPoly;
975cdf0e10cSrcweir 
976cdf0e10cSrcweir         aPoly.appendBezierSegment(B2DPoint(1,1),B2DPoint(2,2),B2DPoint(3,3));
977cdf0e10cSrcweir 
978cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#1 first polygon point wrong",
979cdf0e10cSrcweir                                aPoly.getB2DPoint(0) == B2DPoint(3,3));
980cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#1 first control point wrong",
981cdf0e10cSrcweir                                aPoly.getPrevControlPoint(0) == B2DPoint(2,2));
982cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#1 second control point wrong",
983cdf0e10cSrcweir                                aPoly.getNextControlPoint(0) == B2DPoint(3,3));
984cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("next control point not used",
985cdf0e10cSrcweir                                aPoly.isNextControlPointUsed(0) == false);
986cdf0e10cSrcweir 
987cdf0e10cSrcweir 		aPoly.setNextControlPoint(0,B2DPoint(4,4));
988cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#1.1 second control point wrong",
989cdf0e10cSrcweir                                aPoly.getNextControlPoint(0) == B2DPoint(4,4));
990cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("next control point used",
991cdf0e10cSrcweir                                aPoly.isNextControlPointUsed(0) == true);
992cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("areControlPointsUsed() wrong",
993cdf0e10cSrcweir                                aPoly.areControlPointsUsed() == true);
994cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("getContinuityInPoint() wrong",
995cdf0e10cSrcweir                                aPoly.getContinuityInPoint(0) == CONTINUITY_C2);
996cdf0e10cSrcweir 
997cdf0e10cSrcweir 		aPoly.resetControlPoints();
998cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("resetControlPoints() did not clear",
999cdf0e10cSrcweir                                aPoly.getB2DPoint(0) == B2DPoint(3,3));
1000cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("resetControlPoints() did not clear",
1001cdf0e10cSrcweir                                aPoly.getPrevControlPoint(0) == B2DPoint(3,3));
1002cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("resetControlPoints() did not clear",
1003cdf0e10cSrcweir                                aPoly.getNextControlPoint(0) == B2DPoint(3,3));
1004cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("areControlPointsUsed() wrong #2",
1005cdf0e10cSrcweir                                aPoly.areControlPointsUsed() == false);
1006cdf0e10cSrcweir 
1007cdf0e10cSrcweir         aPoly.clear();
1008cdf0e10cSrcweir         aPoly.append(B2DPoint(0,0));
1009cdf0e10cSrcweir         aPoly.appendBezierSegment(B2DPoint(1,1),B2DPoint(2,2),B2DPoint(3,3));
1010cdf0e10cSrcweir 
1011cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#2 first polygon point wrong",
1012cdf0e10cSrcweir                                aPoly.getB2DPoint(0) == B2DPoint(0,0));
1013cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#2 first control point wrong",
1014cdf0e10cSrcweir                                aPoly.getPrevControlPoint(0) == B2DPoint(0,0));
1015cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#2 second control point wrong",
1016cdf0e10cSrcweir                                aPoly.getNextControlPoint(0) == B2DPoint(1,1));
1017cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#2 third control point wrong",
1018cdf0e10cSrcweir                                aPoly.getPrevControlPoint(1) == B2DPoint(2,2));
1019cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#2 fourth control point wrong",
1020cdf0e10cSrcweir                                aPoly.getNextControlPoint(1) == B2DPoint(3,3));
1021cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("#2 second polygon point wrong",
1022cdf0e10cSrcweir                                aPoly.getB2DPoint(1) == B2DPoint(3,3));
1023cdf0e10cSrcweir     }
1024cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
1025cdf0e10cSrcweir     // member functions of the current class,
1026cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
1027cdf0e10cSrcweir 
1028cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dpolygon);
1029cdf0e10cSrcweir     CPPUNIT_TEST(testBasics);
1030cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
1031cdf0e10cSrcweir }; // class b2dpolygon
1032cdf0e10cSrcweir 
1033cdf0e10cSrcweir 
1034cdf0e10cSrcweir class b2dpolygontools : public CppUnit::TestFixture
1035cdf0e10cSrcweir {
1036cdf0e10cSrcweir public:
1037cdf0e10cSrcweir     // initialise your test code values here.
1038cdf0e10cSrcweir     void setUp()
1039cdf0e10cSrcweir     {
1040cdf0e10cSrcweir     }
1041cdf0e10cSrcweir 
1042cdf0e10cSrcweir     void tearDown()
1043cdf0e10cSrcweir     {
1044cdf0e10cSrcweir     }
1045cdf0e10cSrcweir 
1046cdf0e10cSrcweir     // insert your test code here.
1047cdf0e10cSrcweir     // this is only demonstration code
1048cdf0e10cSrcweir     void testIsRectangle()
1049cdf0e10cSrcweir     {
1050cdf0e10cSrcweir         B2DPolygon aRect1(
1051cdf0e10cSrcweir             tools::createPolygonFromRect(
1052cdf0e10cSrcweir                 B2DRange(0,0,1,1) ) );
1053cdf0e10cSrcweir 
1054cdf0e10cSrcweir         B2DPolygon aRect2;
1055cdf0e10cSrcweir         aRect2.append( B2DPoint(0,0) );
1056cdf0e10cSrcweir         aRect2.append( B2DPoint(1,0) );
1057cdf0e10cSrcweir         aRect2.append( B2DPoint(1,.5));
1058cdf0e10cSrcweir         aRect2.append( B2DPoint(1,1) );
1059cdf0e10cSrcweir         aRect2.append( B2DPoint(0,1) );
1060cdf0e10cSrcweir         aRect2.setClosed(true);
1061cdf0e10cSrcweir 
1062cdf0e10cSrcweir         B2DPolygon aNonRect1;
1063cdf0e10cSrcweir         aNonRect1.append( B2DPoint(0,0) );
1064cdf0e10cSrcweir         aNonRect1.append( B2DPoint(1,0) );
1065cdf0e10cSrcweir         aNonRect1.append( B2DPoint(1,1) );
1066cdf0e10cSrcweir         aNonRect1.append( B2DPoint(0.5,1) );
1067cdf0e10cSrcweir         aNonRect1.append( B2DPoint(0.5,0) );
1068cdf0e10cSrcweir         aNonRect1.setClosed(true);
1069cdf0e10cSrcweir 
1070cdf0e10cSrcweir         B2DPolygon aNonRect2;
1071cdf0e10cSrcweir         aNonRect2.append( B2DPoint(0,0) );
1072cdf0e10cSrcweir         aNonRect2.append( B2DPoint(1,1) );
1073cdf0e10cSrcweir         aNonRect2.append( B2DPoint(1,0) );
1074cdf0e10cSrcweir         aNonRect2.append( B2DPoint(0,1) );
1075cdf0e10cSrcweir         aNonRect2.setClosed(true);
1076cdf0e10cSrcweir 
1077cdf0e10cSrcweir         B2DPolygon aNonRect3;
1078cdf0e10cSrcweir         aNonRect3.append( B2DPoint(0,0) );
1079cdf0e10cSrcweir         aNonRect3.append( B2DPoint(1,0) );
1080cdf0e10cSrcweir         aNonRect3.append( B2DPoint(1,1) );
1081cdf0e10cSrcweir         aNonRect3.setClosed(true);
1082cdf0e10cSrcweir 
1083cdf0e10cSrcweir         B2DPolygon aNonRect4;
1084cdf0e10cSrcweir         aNonRect4.append( B2DPoint(0,0) );
1085cdf0e10cSrcweir         aNonRect4.append( B2DPoint(1,0) );
1086cdf0e10cSrcweir         aNonRect4.append( B2DPoint(1,1) );
1087cdf0e10cSrcweir         aNonRect4.append( B2DPoint(0,1) );
1088cdf0e10cSrcweir 
1089cdf0e10cSrcweir         B2DPolygon aNonRect5;
1090cdf0e10cSrcweir         aNonRect5.append( B2DPoint(0,0) );
1091cdf0e10cSrcweir         aNonRect5.append( B2DPoint(1,0) );
1092cdf0e10cSrcweir         aNonRect5.append( B2DPoint(1,1) );
1093cdf0e10cSrcweir         aNonRect5.append( B2DPoint(0,1) );
1094cdf0e10cSrcweir         aNonRect5.setControlPoints(1,B2DPoint(1,0),B2DPoint(-11,0));
1095cdf0e10cSrcweir         aNonRect5.setClosed(true);
1096cdf0e10cSrcweir 
1097cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("checking rectangle-ness of rectangle 1",
1098cdf0e10cSrcweir                                tools::isRectangle( aRect1 ));
1099cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("checking rectangle-ness of rectangle 2",
1100cdf0e10cSrcweir                                tools::isRectangle( aRect2 ));
1101cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 1",
1102cdf0e10cSrcweir                                !tools::isRectangle( aNonRect1 ));
1103cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 2",
1104cdf0e10cSrcweir                                !tools::isRectangle( aNonRect2 ));
1105cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 3",
1106cdf0e10cSrcweir                                !tools::isRectangle( aNonRect3 ));
1107cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 4",
1108cdf0e10cSrcweir                                !tools::isRectangle( aNonRect4 ));
1109cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 5",
1110cdf0e10cSrcweir                                !tools::isRectangle( aNonRect5 ));
1111cdf0e10cSrcweir     }
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
1114cdf0e10cSrcweir     // member functions of the current class,
1115cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
1116cdf0e10cSrcweir 
1117cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dpolygontools);
1118cdf0e10cSrcweir     CPPUNIT_TEST(testIsRectangle);
1119cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
1120cdf0e10cSrcweir }; // class b2dpolygontools
1121cdf0e10cSrcweir 
1122cdf0e10cSrcweir 
1123cdf0e10cSrcweir class b2dpolypolygon : public CppUnit::TestFixture
1124cdf0e10cSrcweir {
1125cdf0e10cSrcweir public:
1126cdf0e10cSrcweir     // initialise your test code values here.
1127cdf0e10cSrcweir     void setUp()
1128cdf0e10cSrcweir     {
1129cdf0e10cSrcweir     }
1130cdf0e10cSrcweir 
1131cdf0e10cSrcweir     void tearDown()
1132cdf0e10cSrcweir     {
1133cdf0e10cSrcweir     }
1134cdf0e10cSrcweir 
1135cdf0e10cSrcweir     // insert your test code here.
1136cdf0e10cSrcweir     void EmptyMethod()
1137cdf0e10cSrcweir     {
1138cdf0e10cSrcweir     }
1139cdf0e10cSrcweir 
1140cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
1141cdf0e10cSrcweir     // member functions of the current class,
1142cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
1143cdf0e10cSrcweir 
1144cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dpolypolygon);
1145cdf0e10cSrcweir     CPPUNIT_TEST(EmptyMethod);
1146cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
1147cdf0e10cSrcweir }; // class b2dpolypolygon
1148cdf0e10cSrcweir 
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir class b2dquadraticbezier : public CppUnit::TestFixture
1151cdf0e10cSrcweir {
1152cdf0e10cSrcweir public:
1153cdf0e10cSrcweir     // initialise your test code values here.
1154cdf0e10cSrcweir     void setUp()
1155cdf0e10cSrcweir     {
1156cdf0e10cSrcweir     }
1157cdf0e10cSrcweir 
1158cdf0e10cSrcweir     void tearDown()
1159cdf0e10cSrcweir     {
1160cdf0e10cSrcweir     }
1161cdf0e10cSrcweir 
1162cdf0e10cSrcweir     // insert your test code here.
1163cdf0e10cSrcweir     // this is only demonstration code
1164cdf0e10cSrcweir     void EmptyMethod()
1165cdf0e10cSrcweir     {
1166cdf0e10cSrcweir     	  // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
1167cdf0e10cSrcweir     }
1168cdf0e10cSrcweir 
1169cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
1170cdf0e10cSrcweir     // member functions of the current class,
1171cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
1172cdf0e10cSrcweir 
1173cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dquadraticbezier);
1174cdf0e10cSrcweir     CPPUNIT_TEST(EmptyMethod);
1175cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
1176cdf0e10cSrcweir }; // class b2dquadraticbezier
1177cdf0e10cSrcweir 
1178cdf0e10cSrcweir 
1179cdf0e10cSrcweir class b2drange : public CppUnit::TestFixture
1180cdf0e10cSrcweir {
1181cdf0e10cSrcweir public:
1182cdf0e10cSrcweir     // initialise your test code values here.
1183cdf0e10cSrcweir     void setUp()
1184cdf0e10cSrcweir     {
1185cdf0e10cSrcweir     }
1186cdf0e10cSrcweir 
1187cdf0e10cSrcweir     void tearDown()
1188cdf0e10cSrcweir     {
1189cdf0e10cSrcweir     }
1190cdf0e10cSrcweir 
1191cdf0e10cSrcweir     // insert your test code here.
1192cdf0e10cSrcweir     void EmptyMethod()
1193cdf0e10cSrcweir     {
1194cdf0e10cSrcweir     }
1195cdf0e10cSrcweir 
1196cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
1197cdf0e10cSrcweir     // member functions of the current class,
1198cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
1199cdf0e10cSrcweir 
1200cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2drange);
1201cdf0e10cSrcweir     CPPUNIT_TEST(EmptyMethod);
1202cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
1203cdf0e10cSrcweir }; // class b2drange
1204cdf0e10cSrcweir 
1205cdf0e10cSrcweir 
1206cdf0e10cSrcweir class b2dtuple : public CppUnit::TestFixture
1207cdf0e10cSrcweir {
1208cdf0e10cSrcweir public:
1209cdf0e10cSrcweir     // initialise your test code values here.
1210cdf0e10cSrcweir     void setUp()
1211cdf0e10cSrcweir     {
1212cdf0e10cSrcweir     }
1213cdf0e10cSrcweir 
1214cdf0e10cSrcweir     void tearDown()
1215cdf0e10cSrcweir     {
1216cdf0e10cSrcweir     }
1217cdf0e10cSrcweir 
1218cdf0e10cSrcweir     // insert your test code here.
1219cdf0e10cSrcweir     // this is only demonstration code
1220cdf0e10cSrcweir     void EmptyMethod()
1221cdf0e10cSrcweir     {
1222cdf0e10cSrcweir     	  // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
1223cdf0e10cSrcweir     }
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
1226cdf0e10cSrcweir     // member functions of the current class,
1227cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
1228cdf0e10cSrcweir 
1229cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dtuple);
1230cdf0e10cSrcweir     CPPUNIT_TEST(EmptyMethod);
1231cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
1232cdf0e10cSrcweir }; // class b2dtuple
1233cdf0e10cSrcweir 
1234cdf0e10cSrcweir 
1235cdf0e10cSrcweir class b2dvector : public CppUnit::TestFixture
1236cdf0e10cSrcweir {
1237cdf0e10cSrcweir public:
1238cdf0e10cSrcweir     // initialise your test code values here.
1239cdf0e10cSrcweir     void setUp()
1240cdf0e10cSrcweir     {
1241cdf0e10cSrcweir     }
1242cdf0e10cSrcweir 
1243cdf0e10cSrcweir     void tearDown()
1244cdf0e10cSrcweir     {
1245cdf0e10cSrcweir     }
1246cdf0e10cSrcweir 
1247cdf0e10cSrcweir     // insert your test code here.
1248cdf0e10cSrcweir     void EmptyMethod()
1249cdf0e10cSrcweir     {
1250cdf0e10cSrcweir     }
1251cdf0e10cSrcweir 
1252cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
1253cdf0e10cSrcweir     // member functions of the current class,
1254cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
1255cdf0e10cSrcweir 
1256cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(b2dvector);
1257cdf0e10cSrcweir     CPPUNIT_TEST(EmptyMethod);
1258cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
1259cdf0e10cSrcweir }; // class b2dvector
1260cdf0e10cSrcweir 
1261cdf0e10cSrcweir class bcolor : public CppUnit::TestFixture
1262cdf0e10cSrcweir {
1263cdf0e10cSrcweir     BColor maWhite;
1264cdf0e10cSrcweir     BColor maBlack;
1265cdf0e10cSrcweir     BColor maRed;
1266cdf0e10cSrcweir     BColor maGreen;
1267cdf0e10cSrcweir     BColor maBlue;
1268cdf0e10cSrcweir     BColor maYellow;
1269cdf0e10cSrcweir     BColor maMagenta;
1270cdf0e10cSrcweir     BColor maCyan;
1271cdf0e10cSrcweir 
1272cdf0e10cSrcweir public:
1273cdf0e10cSrcweir     bcolor() :
1274cdf0e10cSrcweir         maWhite(1,1,1),
1275cdf0e10cSrcweir         maBlack(0,0,0),
1276cdf0e10cSrcweir         maRed(1,0,0),
1277cdf0e10cSrcweir         maGreen(0,1,0),
1278cdf0e10cSrcweir         maBlue(0,0,1),
1279cdf0e10cSrcweir         maYellow(1,1,0),
1280cdf0e10cSrcweir         maMagenta(1,0,1),
1281cdf0e10cSrcweir         maCyan(0,1,1)
1282cdf0e10cSrcweir     {}
1283cdf0e10cSrcweir 
1284cdf0e10cSrcweir 
1285cdf0e10cSrcweir     // initialise your test code values here.
1286cdf0e10cSrcweir     void setUp()
1287cdf0e10cSrcweir     {
1288cdf0e10cSrcweir     }
1289cdf0e10cSrcweir 
1290cdf0e10cSrcweir     void tearDown()
1291cdf0e10cSrcweir     {
1292cdf0e10cSrcweir     }
1293cdf0e10cSrcweir 
1294cdf0e10cSrcweir     // insert your test code here.
1295cdf0e10cSrcweir     void hslTest()
1296cdf0e10cSrcweir     {
1297cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("white",
1298cdf0e10cSrcweir                                tools::rgb2hsl(maWhite) == BColor(0,0,1));
1299cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("black",
1300cdf0e10cSrcweir                                tools::rgb2hsl(maBlack) == BColor(0,0,0));
1301cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("red",
1302cdf0e10cSrcweir                                tools::rgb2hsl(maRed) == BColor(0,1,0.5));
1303cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("green",
1304cdf0e10cSrcweir                                tools::rgb2hsl(maGreen) == BColor(120,1,0.5));
1305cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("blue",
1306cdf0e10cSrcweir                                tools::rgb2hsl(maBlue) == BColor(240,1,0.5));
1307cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("yellow",
1308cdf0e10cSrcweir                                tools::rgb2hsl(maYellow) == BColor(60,1,0.5));
1309cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("magenta",
1310cdf0e10cSrcweir                                tools::rgb2hsl(maMagenta) == BColor(300,1,0.5));
1311cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("cyan",
1312cdf0e10cSrcweir                                tools::rgb2hsl(maCyan) == BColor(180,1,0.5));
1313cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("third hue case",
1314cdf0e10cSrcweir                                tools::rgb2hsl(BColor(0,0.5,1)) == BColor(210,1,0.5));
1315cdf0e10cSrcweir 
1316cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip white",
1317cdf0e10cSrcweir                                tools::hsl2rgb(tools::rgb2hsl(maWhite)) == maWhite);
1318cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip black",
1319cdf0e10cSrcweir                                tools::hsl2rgb(tools::rgb2hsl(maBlack)) == maBlack);
1320cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip red",
1321cdf0e10cSrcweir                                tools::hsl2rgb(tools::rgb2hsl(maRed)) == maRed);
1322cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip green",
1323cdf0e10cSrcweir                                tools::hsl2rgb(tools::rgb2hsl(maGreen)) == maGreen);
1324cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip blue",
1325cdf0e10cSrcweir                                tools::hsl2rgb(tools::rgb2hsl(maBlue)) == maBlue);
1326cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip yellow",
1327cdf0e10cSrcweir                                tools::hsl2rgb(tools::rgb2hsl(maYellow)) == maYellow);
1328cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip magenta",
1329cdf0e10cSrcweir                                tools::hsl2rgb(tools::rgb2hsl(maMagenta)) == maMagenta);
1330cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip cyan",
1331cdf0e10cSrcweir                                tools::hsl2rgb(tools::rgb2hsl(maCyan)) == maCyan);
1332cdf0e10cSrcweir 
1333cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("grey10",
1334cdf0e10cSrcweir                                tools::rgb2hsl(maWhite*.1) == BColor(0,0,.1));
1335cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("grey90",
1336cdf0e10cSrcweir                                tools::rgb2hsl(maWhite*.9) == BColor(0,0,.9));
1337cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("red/2",
1338cdf0e10cSrcweir                                tools::rgb2hsl(maRed*.5) == BColor(0,1,0.25));
1339cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("green/2",
1340cdf0e10cSrcweir                                tools::rgb2hsl(maGreen*.5) == BColor(120,1,0.25));
1341cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("blue/2",
1342cdf0e10cSrcweir                                tools::rgb2hsl(maBlue*.5) == BColor(240,1,0.25));
1343cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("yellow/2",
1344cdf0e10cSrcweir                                tools::rgb2hsl(maYellow*.5) == BColor(60,1,0.25));
1345cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("magenta/2",
1346cdf0e10cSrcweir                                tools::rgb2hsl(maMagenta*.5) == BColor(300,1,0.25));
1347cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("cyan/2",
1348cdf0e10cSrcweir                                tools::rgb2hsl(maCyan*.5) == BColor(180,1,0.25));
1349cdf0e10cSrcweir 
1350cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("pastel",
1351cdf0e10cSrcweir                                tools::rgb2hsl(BColor(.75,.25,.25)) == BColor(0,.5,.5));
1352cdf0e10cSrcweir     }
1353cdf0e10cSrcweir 
1354cdf0e10cSrcweir     // insert your test code here.
1355cdf0e10cSrcweir     void hsvTest()
1356cdf0e10cSrcweir     {
1357cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("white",
1358cdf0e10cSrcweir                                tools::rgb2hsv(maWhite) == BColor(0,0,1));
1359cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("black",
1360cdf0e10cSrcweir                                tools::rgb2hsv(maBlack) == BColor(0,0,0));
1361cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("red",
1362cdf0e10cSrcweir                                tools::rgb2hsv(maRed) == BColor(0,1,1));
1363cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("green",
1364cdf0e10cSrcweir                                tools::rgb2hsv(maGreen) == BColor(120,1,1));
1365cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("blue",
1366cdf0e10cSrcweir                                tools::rgb2hsv(maBlue) == BColor(240,1,1));
1367cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("yellow",
1368cdf0e10cSrcweir                                tools::rgb2hsv(maYellow) == BColor(60,1,1));
1369cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("magenta",
1370cdf0e10cSrcweir                                tools::rgb2hsv(maMagenta) == BColor(300,1,1));
1371cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("cyan",
1372cdf0e10cSrcweir                                tools::rgb2hsv(maCyan) == BColor(180,1,1));
1373cdf0e10cSrcweir 
1374cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip white",
1375cdf0e10cSrcweir                                tools::hsv2rgb(tools::rgb2hsv(maWhite)) == maWhite);
1376cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip black",
1377cdf0e10cSrcweir                                tools::hsv2rgb(tools::rgb2hsv(maBlack)) == maBlack);
1378cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip red",
1379cdf0e10cSrcweir                                tools::hsv2rgb(tools::rgb2hsv(maRed)) == maRed);
1380cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip green",
1381cdf0e10cSrcweir                                tools::hsv2rgb(tools::rgb2hsv(maGreen)) == maGreen);
1382cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip blue",
1383cdf0e10cSrcweir                                tools::hsv2rgb(tools::rgb2hsv(maBlue)) == maBlue);
1384cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip yellow",
1385cdf0e10cSrcweir                                tools::hsv2rgb(tools::rgb2hsv(maYellow)) == maYellow);
1386cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip magenta",
1387cdf0e10cSrcweir                                tools::hsv2rgb(tools::rgb2hsv(maMagenta)) == maMagenta);
1388cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("roundtrip cyan",
1389cdf0e10cSrcweir                                tools::hsv2rgb(tools::rgb2hsv(maCyan)) == maCyan);
1390cdf0e10cSrcweir 
1391cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("grey10",
1392cdf0e10cSrcweir                                tools::rgb2hsv(maWhite*.1) == BColor(0,0,.1));
1393cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("grey90",
1394cdf0e10cSrcweir                                tools::rgb2hsv(maWhite*.9) == BColor(0,0,.9));
1395cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("red/2",
1396cdf0e10cSrcweir                                tools::rgb2hsv(maRed*.5) == BColor(0,1,0.5));
1397cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("green/2",
1398cdf0e10cSrcweir                                tools::rgb2hsv(maGreen*.5) == BColor(120,1,0.5));
1399cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("blue/2",
1400cdf0e10cSrcweir                                tools::rgb2hsv(maBlue*.5) == BColor(240,1,0.5));
1401cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("yellow/2",
1402cdf0e10cSrcweir                                tools::rgb2hsv(maYellow*.5) == BColor(60,1,0.5));
1403cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("magenta/2",
1404cdf0e10cSrcweir                                tools::rgb2hsv(maMagenta*.5) == BColor(300,1,0.5));
1405cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("cyan/2",
1406cdf0e10cSrcweir                                tools::rgb2hsv(maCyan*.5) == BColor(180,1,0.5));
1407cdf0e10cSrcweir 
1408cdf0e10cSrcweir         CPPUNIT_ASSERT_MESSAGE("pastel",
1409cdf0e10cSrcweir                                tools::rgb2hsv(BColor(.5,.25,.25)) == BColor(0,.5,.5));
1410cdf0e10cSrcweir     }
1411cdf0e10cSrcweir 
1412cdf0e10cSrcweir     void ciexyzTest()
1413cdf0e10cSrcweir     {
1414cdf0e10cSrcweir         tools::rgb2ciexyz(maWhite);
1415cdf0e10cSrcweir         tools::rgb2ciexyz(maBlack);
1416cdf0e10cSrcweir         tools::rgb2ciexyz(maRed);
1417cdf0e10cSrcweir         tools::rgb2ciexyz(maGreen);
1418cdf0e10cSrcweir         tools::rgb2ciexyz(maBlue);
1419cdf0e10cSrcweir         tools::rgb2ciexyz(maYellow);
1420cdf0e10cSrcweir         tools::rgb2ciexyz(maMagenta);
1421cdf0e10cSrcweir         tools::rgb2ciexyz(maCyan);
1422cdf0e10cSrcweir     }
1423cdf0e10cSrcweir 
1424cdf0e10cSrcweir     // Change the following lines only, if you add, remove or rename
1425cdf0e10cSrcweir     // member functions of the current class,
1426cdf0e10cSrcweir     // because these macros are need by auto register mechanism.
1427cdf0e10cSrcweir 
1428cdf0e10cSrcweir     CPPUNIT_TEST_SUITE(bcolor);
1429cdf0e10cSrcweir     CPPUNIT_TEST(hslTest);
1430cdf0e10cSrcweir     CPPUNIT_TEST(hsvTest);
1431cdf0e10cSrcweir     CPPUNIT_TEST(ciexyzTest);
1432cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_END();
1433cdf0e10cSrcweir }; // class b2dvector
1434cdf0e10cSrcweir 
1435cdf0e10cSrcweir // -----------------------------------------------------------------------------
1436cdf0e10cSrcweir 
1437cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dsvgdimpex);
1438cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dpolyrange);
1439cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dcubicbezier);
1440cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dhommatrix);
1441cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dhompoint);
1442cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dpoint);
1443cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dpolygon);
1444cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dpolygontools);
1445cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dpolypolygon);
1446cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dquadraticbezier);
1447cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2drange);
1448cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dtuple);
1449cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dvector);
1450cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::bcolor);
1451cdf0e10cSrcweir } // namespace basegfx2d
1452cdf0e10cSrcweir 
1453cdf0e10cSrcweir 
1454cdf0e10cSrcweir // -----------------------------------------------------------------------------
1455cdf0e10cSrcweir 
1456cdf0e10cSrcweir // this macro creates an empty function, which will called by the RegisterAllFunctions()
1457cdf0e10cSrcweir // to let the user the possibility to also register some functions by hand.
1458cdf0e10cSrcweir // NOADDITIONAL;
1459cdf0e10cSrcweir 
1460