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