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