LCOV - code coverage report
Current view: top level - basegfx/test - boxclipper.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 188 188 100.0 %
Date: 2014-11-03 Functions: 19 19 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sal/types.h>
      21             : #include <cppunit/TestAssert.h>
      22             : #include <cppunit/TestFixture.h>
      23             : #include <cppunit/extensions/HelperMacros.h>
      24             : 
      25             : #include <basegfx/matrix/b2dhommatrix.hxx>
      26             : #include <basegfx/curve/b2dcubicbezier.hxx>
      27             : #include <basegfx/curve/b2dbeziertools.hxx>
      28             : #include <basegfx/range/b2dpolyrange.hxx>
      29             : #include <basegfx/polygon/b2dpolygon.hxx>
      30             : #include <basegfx/polygon/b2dpolygontools.hxx>
      31             : #include <basegfx/polygon/b2dpolypolygontools.hxx>
      32             : #include <basegfx/polygon/b2dpolypolygoncutter.hxx>
      33             : #include <basegfx/polygon/b2dpolygonclipper.hxx>
      34             : #include <basegfx/polygon/b2dpolypolygon.hxx>
      35             : #include <basegfx/numeric/ftools.hxx>
      36             : #include <comphelper/random.hxx>
      37             : 
      38             : #include <boost/bind.hpp>
      39             : 
      40             : #include <boxclipper.hxx>
      41             : 
      42             : using namespace ::basegfx;
      43             : 
      44             : namespace basegfx2d
      45             : {
      46             : /// Gets a random ordinal [0,n)
      47        2560 : double getRandomOrdinal( const ::std::size_t n )
      48             : {
      49             :     // use this one when displaying polygons in OOo, which still sucks
      50             :     // great rocks when trying to import non-integer svg:d attributes
      51        2560 :     return comphelper::rng::uniform_size_distribution(0, n-1);
      52             : }
      53             : 
      54        3590 : inline bool compare(const B2DPoint& left, const B2DPoint& right)
      55             : {
      56        3590 :     return left.getX()<right.getX()
      57        3590 :         || (left.getX()==right.getX() && left.getY()<right.getY());
      58             : }
      59             : 
      60          18 : class boxclipper : public CppUnit::TestFixture
      61             : {
      62             : private:
      63             :     B2DPolyRange aDisjunctRanges;
      64             :     B2DPolyRange aEqualRanges;
      65             :     B2DPolyRange aIntersectionN;
      66             :     B2DPolyRange aIntersectionE;
      67             :     B2DPolyRange aIntersectionS;
      68             :     B2DPolyRange aIntersectionW;
      69             :     B2DPolyRange aIntersectionNE;
      70             :     B2DPolyRange aIntersectionSE;
      71             :     B2DPolyRange aIntersectionSW;
      72             :     B2DPolyRange aIntersectionNW;
      73             :     B2DPolyRange aRingIntersection;
      74             :     B2DPolyRange aRingIntersection2;
      75             :     B2DPolyRange aRingIntersectExtraStrip;
      76             :     B2DPolyRange aComplexIntersections;
      77             :     B2DPolyRange aRandomIntersections;
      78             : 
      79             : public:
      80             :     // initialise your test code values here.
      81           6 :     void setUp() SAL_OVERRIDE
      82             :     {
      83           6 :         B2DRange aCenter(100, 100, -100, -100);
      84           6 :         B2DRange aOffside(800, 800, 1000, 1000);
      85           6 :         B2DRange aNorth(100, 0, -100, -200);
      86           6 :         B2DRange aSouth(100, 200, -100, 0);
      87           6 :         B2DRange aEast(0, 100, 200, -100);
      88           6 :         B2DRange aWest(-200, 100, 0, -100);
      89           6 :         B2DRange aNorthEast(0, 0, 200, -200);
      90           6 :         B2DRange aSouthEast(0, 0, 200, 200);
      91           6 :         B2DRange aSouthWest(0, 0, -200, 200);
      92           6 :         B2DRange aNorthWest(0, 0, -200, -200);
      93             : 
      94           6 :         B2DRange aNorth2(-150, 50,  150,  350);
      95           6 :         B2DRange aSouth2(-150, -50, 150, -350);
      96           6 :         B2DRange aEast2 (50,  -150, 350,  150);
      97           6 :         B2DRange aWest2 (-50, -150,-350,  150);
      98             : 
      99           6 :         aDisjunctRanges.appendElement( aCenter, ORIENTATION_NEGATIVE );
     100           6 :         aDisjunctRanges.appendElement( aOffside, ORIENTATION_NEGATIVE );
     101             : 
     102           6 :         aEqualRanges.appendElement( aCenter, ORIENTATION_NEGATIVE );
     103           6 :         aEqualRanges.appendElement( aCenter, ORIENTATION_NEGATIVE );
     104             : 
     105           6 :         aIntersectionN.appendElement( aCenter, ORIENTATION_NEGATIVE );
     106           6 :         aIntersectionN.appendElement( aNorth, ORIENTATION_NEGATIVE );
     107             : 
     108           6 :         aIntersectionE.appendElement( aCenter, ORIENTATION_NEGATIVE );
     109           6 :         aIntersectionE.appendElement( aEast, ORIENTATION_NEGATIVE );
     110             : 
     111           6 :         aIntersectionS.appendElement( aCenter, ORIENTATION_NEGATIVE );
     112           6 :         aIntersectionS.appendElement( aSouth, ORIENTATION_NEGATIVE );
     113             : 
     114           6 :         aIntersectionW.appendElement( aCenter, ORIENTATION_NEGATIVE );
     115           6 :         aIntersectionW.appendElement( aWest, ORIENTATION_NEGATIVE );
     116             : 
     117           6 :         aIntersectionNE.appendElement( aCenter, ORIENTATION_NEGATIVE );
     118           6 :         aIntersectionNE.appendElement( aNorthEast, ORIENTATION_NEGATIVE );
     119             : 
     120           6 :         aIntersectionSE.appendElement( aCenter, ORIENTATION_NEGATIVE );
     121           6 :         aIntersectionSE.appendElement( aSouthEast, ORIENTATION_NEGATIVE );
     122             : 
     123           6 :         aIntersectionSW.appendElement( aCenter, ORIENTATION_NEGATIVE );
     124           6 :         aIntersectionSW.appendElement( aSouthWest, ORIENTATION_NEGATIVE );
     125             : 
     126           6 :         aIntersectionNW.appendElement( aCenter, ORIENTATION_NEGATIVE );
     127           6 :         aIntersectionNW.appendElement( aNorthWest, ORIENTATION_NEGATIVE );
     128             : 
     129           6 :         aRingIntersection.appendElement( aNorth2, ORIENTATION_NEGATIVE );
     130           6 :         aRingIntersection.appendElement( aEast2, ORIENTATION_NEGATIVE );
     131           6 :         aRingIntersection.appendElement( aSouth2, ORIENTATION_NEGATIVE );
     132             : 
     133           6 :         aRingIntersection2 = aRingIntersection;
     134           6 :         aRingIntersection2.appendElement( aWest2, ORIENTATION_NEGATIVE );
     135             : 
     136           6 :         aRingIntersectExtraStrip = aRingIntersection2;
     137             :         aRingIntersectExtraStrip.appendElement( B2DRange(0, -25, 200, 25),
     138           6 :                                                 ORIENTATION_NEGATIVE );
     139             : 
     140           6 :         aComplexIntersections.appendElement( aCenter, ORIENTATION_NEGATIVE );
     141           6 :         aComplexIntersections.appendElement( aOffside, ORIENTATION_NEGATIVE );
     142           6 :         aComplexIntersections.appendElement( aCenter, ORIENTATION_NEGATIVE );
     143           6 :         aComplexIntersections.appendElement( aNorth, ORIENTATION_NEGATIVE );
     144           6 :         aComplexIntersections.appendElement( aEast, ORIENTATION_NEGATIVE );
     145           6 :         aComplexIntersections.appendElement( aSouth, ORIENTATION_NEGATIVE );
     146           6 :         aComplexIntersections.appendElement( aWest, ORIENTATION_NEGATIVE );
     147           6 :         aComplexIntersections.appendElement( aNorthEast, ORIENTATION_NEGATIVE );
     148           6 :         aComplexIntersections.appendElement( aSouthEast, ORIENTATION_NEGATIVE );
     149           6 :         aComplexIntersections.appendElement( aSouthWest, ORIENTATION_NEGATIVE );
     150           6 :         aComplexIntersections.appendElement( aNorthWest, ORIENTATION_NEGATIVE );
     151             : 
     152             : #ifdef GENERATE_RANDOM
     153             :         for( int i=0; i<800; ++i )
     154             :         {
     155             :             B2DRange aRandomRange(
     156             :                 getRandomOrdinal( 1000 ),
     157             :                 getRandomOrdinal( 1000 ),
     158             :                 getRandomOrdinal( 1000 ),
     159             :                 getRandomOrdinal( 1000 ) );
     160             : 
     161             :             aRandomIntersections.appendElement( aRandomRange, ORIENTATION_NEGATIVE );
     162             :         }
     163             : #else
     164           6 :         const char* randomSvg="m394 783h404v57h-404zm-197-505h571v576h-571zm356-634h75v200h-75zm-40-113h403v588h-403zm93-811h111v494h-111zm-364-619h562v121h-562zm-134-8h292v27h-292zm110 356h621v486h-621zm78-386h228v25h-228zm475-345h201v201h-201zm-2-93h122v126h-122zm-417-243h567v524h-567zm-266-738h863v456h-863zm262-333h315v698h-315zm-328-826h43v393h-43zm830-219h120v664h-120zm-311-636h221v109h-221zm-500 137h628v19h-628zm681-94h211v493h-211zm-366-646h384v355h-384zm-189-199h715v247h-715zm165-459h563v601h-563zm258-479h98v606h-98zm270-517h65v218h-65zm-44-259h96v286h-96zm-599-202h705v468h-705zm216-803h450v494h-450zm-150-22h26v167h-26zm-55-599h50v260h-50zm190-278h490v387h-490zm-290-453h634v392h-634zm257 189h552v300h-552zm-151-690h136v455h-136zm12-597h488v432h-488zm501-459h48v39h-48zm-224-112h429v22h-429zm-281 102h492v621h-492zm519-158h208v17h-208zm-681-563h56v427h-56zm126-451h615v392h-615zm-47-410h598v522h-598zm-32 316h79v110h-79zm-71-129h18v127h-18zm126-993h743v589h-743zm211-430h428v750h-428zm61-554h100v220h-100zm-353-49h658v157h-658zm778-383h115v272h-115zm-249-541h119v712h-119zm203 86h94v40h-94z";
     165           6 :         B2DPolyPolygon randomPoly;
     166             :         tools::importFromSvgD(
     167             :             randomPoly,
     168           6 :             OUString::createFromAscii(randomSvg), false, 0);
     169             :         std::for_each(randomPoly.begin(),
     170             :                       randomPoly.end(),
     171             :                       boost::bind(
     172             :              &B2DPolyRange::appendElement,
     173             :                           boost::ref(aRandomIntersections),
     174             :                           boost::bind(
     175             :                  &B2DPolygon::getB2DRange,
     176             :                               _1),
     177             :                           ORIENTATION_NEGATIVE,
     178           6 :                           1));
     179             : #endif
     180           6 :     }
     181             : 
     182           6 :     void tearDown() SAL_OVERRIDE
     183             :     {
     184           6 :     }
     185             : 
     186         100 :     B2DPolyPolygon normalizePoly( const B2DPolyPolygon& rPoly )
     187             :     {
     188         100 :         B2DPolyPolygon aRes;
     189         568 :         for( sal_uInt32 i=0; i<rPoly.count(); ++i )
     190             :         {
     191         468 :             B2DPolygon aTmp=rPoly.getB2DPolygon(i);
     192         468 :             if( ORIENTATION_NEGATIVE == tools::getOrientation(aTmp) )
     193         436 :                 aTmp.flip();
     194             : 
     195         468 :             aTmp=tools::removeNeutralPoints(aTmp);
     196         936 :             std::vector<B2DPoint> aTmp2(aTmp.count());
     197        2868 :             for(sal_uInt32 j=0; j<aTmp.count(); ++j)
     198        2400 :                 aTmp2[j] = aTmp.getB2DPoint(j);
     199             : 
     200         468 :             std::vector<B2DPoint>::iterator pSmallest=aTmp2.end();
     201        2868 :             for(std::vector<B2DPoint>::iterator pCurr=aTmp2.begin(); pCurr!=aTmp2.end(); ++pCurr)
     202             :             {
     203        2400 :                 if( pSmallest == aTmp2.end() || compare(*pCurr, *pSmallest) )
     204             :                 {
     205         932 :                     pSmallest=pCurr;
     206             :                 }
     207             :             }
     208             : 
     209         468 :             if( pSmallest != aTmp2.end() )
     210         456 :                 std::rotate(aTmp2.begin(),pSmallest,aTmp2.end());
     211             : 
     212         468 :             aTmp.clear();
     213        2868 :             for(std::vector<B2DPoint>::iterator pCurr=aTmp2.begin(); pCurr!=aTmp2.end(); ++pCurr)
     214        2400 :                 aTmp.append(*pCurr);
     215             : 
     216         468 :             aRes.append(aTmp);
     217         468 :         }
     218             : 
     219             :         // boxclipper & generic clipper disagree slightly on area-less
     220             :         // polygons (one or two points only)
     221         100 :         aRes = tools::stripNeutralPolygons(aRes);
     222             : 
     223             :         // now, sort all polygons with increasing 0th point
     224             :         std::sort(aRes.begin(),
     225             :                   aRes.end(),
     226             :                   boost::bind(
     227             :                       &compare,
     228             :                       boost::bind(
     229             :                           &B2DPolygon::getB2DPoint,
     230             :                           _1,0),
     231             :                       boost::bind(
     232             :                           &B2DPolygon::getB2DPoint,
     233         100 :                           _2,0)));
     234             : 
     235         100 :         return aRes;
     236             :     }
     237             : 
     238          30 :     void verifyPoly(const char* sName, const char* sSvg, const B2DPolyRange& toTest)
     239             :     {
     240          30 :         B2DPolyPolygon aTmp1;
     241          60 :         CPPUNIT_ASSERT_MESSAGE(sName,
     242             :                                tools::importFromSvgD(
     243          30 :                                    aTmp1, OUString::createFromAscii(sSvg), false, 0));
     244             : 
     245             :         const OUString aSvg=
     246          60 :             tools::exportToSvgD(toTest.solveCrossovers(), true, true, false);
     247          60 :         B2DPolyPolygon aTmp2;
     248          60 :         CPPUNIT_ASSERT_MESSAGE(sName,
     249             :                                tools::importFromSvgD(
     250          30 :                                    aTmp2, aSvg, false, 0));
     251             : 
     252          60 :         CPPUNIT_ASSERT_MESSAGE(
     253             :             sName,
     254          60 :             normalizePoly(aTmp2) == normalizePoly(aTmp1));
     255          30 :     }
     256             : 
     257           2 :     void verifyPoly()
     258             :     {
     259           2 :         const char* disjunct="m-100-100v200h200v-200zm900 900v200h200v-200z";
     260           2 :         const char* equal="m-100-100v200h200v-200zm200 0h-200v200h200v-200z";
     261           2 :         const char* intersectionN="m-100-100v100h200v-100zm200 0v-100h-200v100 200h200v-200z";
     262           2 :         const char* intersectionE="m0-100v200h100v-200zm0 0h-100v200h100 200v-200z";
     263           2 :         const char* intersectionS="m-100 0v100h200v-100zm0-100v200 100h200v-100-200z";
     264           2 :         const char* intersectionW="m-100-100v200h100v-200zm0 0h-100v200h100 200v-200z";
     265           2 :         const char* intersectionNE="m0-100v100h100v-100zm0-100v100h-100v200h200v-100h100v-200z";
     266           2 :         const char* intersectionSE="m0 0v100h100v-100zm100 0v-100h-200v200h100v100h200v-200z";
     267           2 :         const char* intersectionSW="m-100 0v100h100v-100zm0-100v100h-100v200h200v-100h100v-200z";
     268           2 :         const char* intersectionNW="m-100-100v100h100v-100zm100 0v-100h-200v200h100v100h200v-200z";
     269           2 :         const char* ringIntersection="m50-150v100h100v-100zm0 200v100h100v-100zm100-200v-200h-300v300h200v100h-200v300h300v-200h200v-300z";
     270             :         const char* ringIntersection2="m-150 50v100h100v-100zm0-200v100h100v-100zm100 200v-100h100v100z"
     271           2 :                                       "m100-200v100h100v-100zm0 200v100h100v-100zm100-200v-200h-300v200h-200v300h200v200h300v-200h200v-300z";
     272             :         const char* ringIntersectExtraStrip="m-150 50v100h100v-100zm0-200v100h100v-100zm100 200v-100h100v25h-50v50h50v25z"
     273             :                                             "m100-200v100h100v-100zm0 200v100h100v-100zm0-75v50h150v-50z"
     274           2 :                                             "m100-125v-200h-300v200h-200v300h200v200h300v-200h200v-300z";
     275             :         const char* complexIntersections="m0 0zm0 0zm0 0zm0 0v-100 100h-100 100v100-100h100zm0 0v-100 100h-100 100v100-100h100z"
     276             :                                          "m100 0v-100h-100-100v100 100h100 100v-100zm0 0v-100h-100-100v100 100h100 100v-100z"
     277             :                                          "m0 0v-100h-100v-100 100h-100v100h-100 100v100h100v100-100h100v-100h100z"
     278             :                                          "m0-100v-100h-100-100v100h-100v100 100h100v100h100 100v-100h100v-100-100z"
     279           2 :                                          "m100 0v-100h-200-100-100v100 200 100h100 100 200v-100-200zm600 900v200h200v-200z";
     280             :         const char* randomIntersections="m20-4515v393h43v-393zm34-8690v127h18v-127zm24 674v427h56v-427zm126-451v16-16z"
     281             :                                          "m22 3470v260h50v-260zm55 599v167h26v-167zm-49-1831v455h136v-455z"
     282             :                                          "m10 8845v19h158v-19zm54-38v25h228v-25zm156-13245v108h100v-108z"
     283             :                                          "m101 14826v200h75v-200zm-205-3000v365h315v-365zm-309-1877v19h628v-19z"
     284             :                                          "m549-1398v127h98v-127zm18 5351v215h111v-215zm-362-10061v152h488v-152z"
     285             :                                          "m488 0v-469h-492v621h4v280h488v-432zm-378 5368v48h384v-48zm274-10182v712h119v-712z"
     286             :                                          "m-424 3173v-94h-47v110h47v96h551v-112zm-105-2249v157h353v112h100v-112h205v-157z"
     287             :                                          "m284 5177v203h377v-203zm337 4727v66h40v-66zm-326 6110v57h374v-57zm351-12583v39h48v-39z"
     288             :                                          "m23 12583v-505h-571v576h571v-14h30v-57zm-368-2682v-8h-292v27h134v102h562v-121z"
     289             :                                          "m-9-12299v320h428v-320zm364 1216v-410h-598v316h-32v110h32v96h47v280h615v-392z"
     290             :                                          "m-537 11431v486h388v279h111v-279h122v-486zm112-4621v142h550v-142zm101-2719v494h450v-494z"
     291             :                                          "m340 6609v33h120v-33zm-85-4349v-479h-98v479h-258v459h-165v247h189v307h384v-307h142v-105h13v-601z"
     292             :                                          "m-270-3159v36h490v-36zm442 2163v7h52v-7zm-345 7158v588h403v-588zm378-1813v-93h-122v126h2v155h148v-188z"
     293             :                                          "m19-5345v-259h-96v266h44v20h52v-20h10v-7zm-91-6571v-430h-428v430h-211v589h743v-589z"
     294             :                                          "m101 6571v-461h-705v468h599v20h44v191h65v-218zm-89-8442v40h94v-40zm-71 10742v-43h-221v109h181v427h211v-493z"
     295             :                                          "m0-4727v-189h-634v392h257v97h33v351h490v-351h29v-300zm-97 6698v-333h-315v333h-262v456h863v-456z"
     296             :                                          "m-142-8556v22h429v-22zm238-56v17h208v-17zm91 7234v664h120v-664zm69 2452v-336h-567v524h419v13h201v-201z"
     297           2 :                                          "m-42-13332v272h115v-272z";
     298             : 
     299           2 :         verifyPoly("disjunct", disjunct, aDisjunctRanges);
     300           2 :         verifyPoly("equal", equal, aEqualRanges);
     301           2 :         verifyPoly("intersectionN", intersectionN, aIntersectionN);
     302           2 :         verifyPoly("intersectionE", intersectionE, aIntersectionE);
     303           2 :         verifyPoly("intersectionS", intersectionS, aIntersectionS);
     304           2 :         verifyPoly("intersectionW", intersectionW, aIntersectionW);
     305           2 :         verifyPoly("intersectionNE", intersectionNE, aIntersectionNE);
     306           2 :         verifyPoly("intersectionSE", intersectionSE, aIntersectionSE);
     307           2 :         verifyPoly("intersectionSW", intersectionSW, aIntersectionSW);
     308           2 :         verifyPoly("intersectionNW", intersectionNW, aIntersectionNW);
     309           2 :         verifyPoly("ringIntersection", ringIntersection, aRingIntersection);
     310           2 :         verifyPoly("ringIntersection2", ringIntersection2, aRingIntersection2);
     311           2 :         verifyPoly("ringIntersectExtraStrip", ringIntersectExtraStrip, aRingIntersectExtraStrip);
     312           2 :         verifyPoly("complexIntersections", complexIntersections, aComplexIntersections);
     313           2 :         verifyPoly("randomIntersections", randomIntersections, aRandomIntersections);
     314           2 :     }
     315             : 
     316          30 :     void dumpSvg(const char* pName,
     317             :                  const ::basegfx::B2DPolyPolygon& rPoly)
     318             :     {
     319             :         (void)pName; (void)rPoly;
     320             : #if OSL_DEBUG_LEVEL > 2
     321             :         fprintf(stderr, "%s - svg:d=\"%s\"\n",
     322             :                 pName, OUStringToOString(
     323             :                     basegfx::tools::exportToSvgD(rPoly, , true, true, false),
     324             :                     RTL_TEXTENCODING_UTF8).getStr() );
     325             : #endif
     326          30 :     }
     327             : 
     328           2 :     void getPolyPolygon()
     329             :     {
     330           2 :         dumpSvg("disjunct",aDisjunctRanges.solveCrossovers());
     331           2 :         dumpSvg("equal",aEqualRanges.solveCrossovers());
     332           2 :         dumpSvg("intersectionN",aIntersectionN.solveCrossovers());
     333           2 :         dumpSvg("intersectionE",aIntersectionE.solveCrossovers());
     334           2 :         dumpSvg("intersectionS",aIntersectionS.solveCrossovers());
     335           2 :         dumpSvg("intersectionW",aIntersectionW.solveCrossovers());
     336           2 :         dumpSvg("intersectionNE",aIntersectionNE.solveCrossovers());
     337           2 :         dumpSvg("intersectionSE",aIntersectionSE.solveCrossovers());
     338           2 :         dumpSvg("intersectionSW",aIntersectionSW.solveCrossovers());
     339           2 :         dumpSvg("intersectionNW",aIntersectionNW.solveCrossovers());
     340           2 :         dumpSvg("ringIntersection",aRingIntersection.solveCrossovers());
     341           2 :         dumpSvg("ringIntersection2",aRingIntersection2.solveCrossovers());
     342           2 :         dumpSvg("aRingIntersectExtraStrip",aRingIntersectExtraStrip.solveCrossovers());
     343           2 :         dumpSvg("complexIntersections",aComplexIntersections.solveCrossovers());
     344           2 :         dumpSvg("randomIntersections",aRandomIntersections.solveCrossovers());
     345             : 
     346           2 :         CPPUNIT_ASSERT_MESSAGE("getPolyPolygon", true );
     347           2 :     }
     348             : 
     349          20 :     void validatePoly( const char* pName, const B2DPolyRange& rRange )
     350             :     {
     351          20 :         B2DPolyPolygon genericClip;
     352          20 :         const sal_uInt32 nCount=rRange.count();
     353          60 :         for( sal_uInt32 i=0; i<nCount; ++i )
     354             :         {
     355             :             B2DPolygon aRect=tools::createPolygonFromRect(
     356          40 :                 rRange.getElement(i).head);
     357          40 :             if( rRange.getElement(i).tail.head == ORIENTATION_NEGATIVE )
     358          40 :                 aRect.flip();
     359             : 
     360          40 :             genericClip.append(aRect);
     361          40 :         }
     362             : 
     363             : #if OSL_DEBUG_LEVEL > 2
     364             :         fprintf(stderr, "%s input      - svg:d=\"%s\"\n",
     365             :                 pName, OUStringToOString(
     366             :                     basegfx::tools::exportToSvgD(
     367             :                         genericClip, , true, true, false),
     368             :                     RTL_TEXTENCODING_UTF8).getStr() );
     369             : #endif
     370             : 
     371          40 :         const B2DPolyPolygon boxClipResult=rRange.solveCrossovers();
     372             :         const OUString boxClipSvg(
     373             :             basegfx::tools::exportToSvgD(
     374          40 :                 normalizePoly(boxClipResult), true, true, false));
     375             : #if OSL_DEBUG_LEVEL > 2
     376             :         fprintf(stderr, "%s boxclipper - svg:d=\"%s\"\n",
     377             :                 pName, OUStringToOString(
     378             :                     boxClipSvg,
     379             :                     RTL_TEXTENCODING_UTF8).getStr() );
     380             : #endif
     381             : 
     382          20 :         genericClip = tools::solveCrossovers(genericClip);
     383             :         const OUString genericClipSvg(
     384             :             basegfx::tools::exportToSvgD(
     385          40 :                 normalizePoly(genericClip), true, true, false));
     386             : #if OSL_DEBUG_LEVEL > 2
     387             :         fprintf(stderr, "%s genclipper - svg:d=\"%s\"\n",
     388             :                 pName, OUStringToOString(
     389             :                     genericClipSvg,
     390             :                     RTL_TEXTENCODING_UTF8).getStr() );
     391             : #endif
     392             : 
     393          40 :         CPPUNIT_ASSERT_MESSAGE(pName,
     394          40 :                                genericClipSvg == boxClipSvg);
     395          20 :     }
     396             : 
     397           2 :     void validatePoly()
     398             :     {
     399           2 :         validatePoly("disjunct", aDisjunctRanges);
     400           2 :         validatePoly("equal", aEqualRanges);
     401           2 :         validatePoly("intersectionN", aIntersectionN);
     402           2 :         validatePoly("intersectionE", aIntersectionE);
     403           2 :         validatePoly("intersectionS", aIntersectionS);
     404           2 :         validatePoly("intersectionW", aIntersectionW);
     405           2 :         validatePoly("intersectionNE", aIntersectionNE);
     406           2 :         validatePoly("intersectionSE", aIntersectionSE);
     407           2 :         validatePoly("intersectionSW", aIntersectionSW);
     408           2 :         validatePoly("intersectionNW", aIntersectionNW);
     409             :         // subtle differences on Solaris Intel, comparison not smart enough
     410             :         // (due to floating point inaccuracies)
     411             :         //validatePoly("ringIntersection", aRingIntersection);
     412             :         //validatePoly("ringIntersection2", aRingIntersection2);
     413             :         //validatePoly("ringIntersectExtraStrip", aRingIntersectExtraStrip);
     414             :         // generic clipper buggy here, likely
     415             :         //validatePoly("complexIntersections", aComplexIntersections);
     416             :         //validatePoly("randomIntersections", aRandomIntersections);
     417           2 :     }
     418             : 
     419             :     // Change the following lines only, if you add, remove or rename
     420             :     // member functions of the current class,
     421             :     // because these macros are need by auto register mechanism.
     422             : 
     423           4 :     CPPUNIT_TEST_SUITE(boxclipper);
     424           2 :     CPPUNIT_TEST(validatePoly);
     425           2 :     CPPUNIT_TEST(verifyPoly);
     426           2 :     CPPUNIT_TEST(getPolyPolygon);
     427           4 :     CPPUNIT_TEST_SUITE_END();
     428             : };
     429             : 
     430           2 : CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::boxclipper);
     431           6 : } // namespace basegfx2d
     432             : 
     433             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10