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