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