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