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