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/curve/b2dcubicbezier.hxx>
37*b1cdbd2cSJim Jagielski #include <basegfx/curve/b2dbeziertools.hxx>
38*b1cdbd2cSJim Jagielski #include <basegfx/range/b2dpolyrange.hxx>
39*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
40*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx>
41*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygontools.hxx>
42*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygoncutter.hxx>
43*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygonclipper.hxx>
44*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygon.hxx>
45*b1cdbd2cSJim Jagielski #include <basegfx/numeric/ftools.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <boost/bind.hpp>
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski using namespace ::basegfx;
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski namespace basegfx2d
53*b1cdbd2cSJim Jagielski {
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski class genericclipper : public CppUnit::TestFixture
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski private:
58*b1cdbd2cSJim Jagielski     B2DPolygon aSelfIntersecting;
59*b1cdbd2cSJim Jagielski     B2DPolygon aShiftedRectangle;
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski public:
62*b1cdbd2cSJim Jagielski     // initialise your test code values here.
setUp()63*b1cdbd2cSJim Jagielski     void setUp()
64*b1cdbd2cSJim Jagielski     {
65*b1cdbd2cSJim Jagielski         aSelfIntersecting.append(B2DPoint(0,  0));
66*b1cdbd2cSJim Jagielski         aSelfIntersecting.append(B2DPoint(0,  100));
67*b1cdbd2cSJim Jagielski         aSelfIntersecting.append(B2DPoint(75, 100));
68*b1cdbd2cSJim Jagielski         aSelfIntersecting.append(B2DPoint(75, 50));
69*b1cdbd2cSJim Jagielski         aSelfIntersecting.append(B2DPoint(25, 50));
70*b1cdbd2cSJim Jagielski         aSelfIntersecting.append(B2DPoint(25, 150));
71*b1cdbd2cSJim Jagielski         aSelfIntersecting.append(B2DPoint(100,150));
72*b1cdbd2cSJim Jagielski         aSelfIntersecting.append(B2DPoint(100,0));
73*b1cdbd2cSJim Jagielski         aSelfIntersecting.setClosed(true);
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski         aShiftedRectangle = tools::createPolygonFromRect(
76*b1cdbd2cSJim Jagielski             B2DRange(0,90,20,150));
77*b1cdbd2cSJim Jagielski     }
78*b1cdbd2cSJim Jagielski 
tearDown()79*b1cdbd2cSJim Jagielski     void tearDown()
80*b1cdbd2cSJim Jagielski     {}
81*b1cdbd2cSJim Jagielski 
validate(const char * pName,const char * pValidSvgD,B2DPolyPolygon (* pFunc)(const B2DPolyPolygon &,const B2DPolyPolygon &))82*b1cdbd2cSJim Jagielski     void validate(const char* pName,
83*b1cdbd2cSJim Jagielski                   const char* pValidSvgD,
84*b1cdbd2cSJim Jagielski                   B2DPolyPolygon (*pFunc)(const B2DPolyPolygon&, const B2DPolyPolygon&))
85*b1cdbd2cSJim Jagielski     {
86*b1cdbd2cSJim Jagielski         const B2DPolyPolygon aSelfIntersect(
87*b1cdbd2cSJim Jagielski             tools::prepareForPolygonOperation(aSelfIntersecting));
88*b1cdbd2cSJim Jagielski         const B2DPolyPolygon aRect(
89*b1cdbd2cSJim Jagielski             tools::prepareForPolygonOperation(aShiftedRectangle));
90*b1cdbd2cSJim Jagielski #if defined(VERBOSE)
91*b1cdbd2cSJim Jagielski         fprintf(stderr, "%s input LHS - svg:d=\"%s\"\n",
92*b1cdbd2cSJim Jagielski                 pName, rtl::OUStringToOString(
93*b1cdbd2cSJim Jagielski                     basegfx::tools::exportToSvgD(
94*b1cdbd2cSJim Jagielski                         aSelfIntersect, true, true, false),
95*b1cdbd2cSJim Jagielski                     RTL_TEXTENCODING_UTF8).getStr() );
96*b1cdbd2cSJim Jagielski         fprintf(stderr, "%s input RHS - svg:d=\"%s\"\n",
97*b1cdbd2cSJim Jagielski                 pName, rtl::OUStringToOString(
98*b1cdbd2cSJim Jagielski                     basegfx::tools::exportToSvgD(
99*b1cdbd2cSJim Jagielski                         aRect, true, true, false),
100*b1cdbd2cSJim Jagielski                     RTL_TEXTENCODING_UTF8).getStr() );
101*b1cdbd2cSJim Jagielski #endif
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski         const B2DPolyPolygon aRes=
104*b1cdbd2cSJim Jagielski             pFunc(aSelfIntersect, aRect);
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski #if defined(VERBOSE)
107*b1cdbd2cSJim Jagielski         fprintf(stderr, "%s - svg:d=\"%s\"\n",
108*b1cdbd2cSJim Jagielski                 pName, rtl::OUStringToOString(
109*b1cdbd2cSJim Jagielski                     basegfx::tools::exportToSvgD(aRes, true, true, false),
110*b1cdbd2cSJim Jagielski                     RTL_TEXTENCODING_UTF8).getStr() );
111*b1cdbd2cSJim Jagielski #endif
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski         rtl::OUString aValid=rtl::OUString::createFromAscii(pValidSvgD);
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski         CPPUNIT_ASSERT_MESSAGE(pName,
116*b1cdbd2cSJim Jagielski                                basegfx::tools::exportToSvgD(aRes, true, true, false) == aValid);
117*b1cdbd2cSJim Jagielski     }
118*b1cdbd2cSJim Jagielski 
validateOr()119*b1cdbd2cSJim Jagielski     void validateOr()
120*b1cdbd2cSJim Jagielski     {
121*b1cdbd2cSJim Jagielski         const char* pValid="m0 0h100v150h-75v-50h-5v50h-20v-50-10zm75 10v-50h-50v50z";
122*b1cdbd2cSJim Jagielski         validate("validateOr", pValid, &tools::solvePolygonOperationOr);
123*b1cdbd2cSJim Jagielski     }
124*b1cdbd2cSJim Jagielski 
validateXor()125*b1cdbd2cSJim Jagielski     void validateXor()
126*b1cdbd2cSJim Jagielski     {
127*b1cdbd2cSJim Jagielski         const char* pValid="m0 0h100v150h-75v-50h-5v50h-20v-50-10zm0 10h20v-10h-20zm75 10v-50h-50v50z";
128*b1cdbd2cSJim Jagielski         validate("validateXor", pValid, &tools::solvePolygonOperationXor);
129*b1cdbd2cSJim Jagielski     }
130*b1cdbd2cSJim Jagielski 
validateAnd()131*b1cdbd2cSJim Jagielski     void validateAnd()
132*b1cdbd2cSJim Jagielski     {
133*b1cdbd2cSJim Jagielski         const char* pValid="m0 100v-10h20v10z";
134*b1cdbd2cSJim Jagielski         validate("validateAnd", pValid, &tools::solvePolygonOperationAnd);
135*b1cdbd2cSJim Jagielski     }
136*b1cdbd2cSJim Jagielski 
validateDiff()137*b1cdbd2cSJim Jagielski     void validateDiff()
138*b1cdbd2cSJim Jagielski     {
139*b1cdbd2cSJim Jagielski         const char* pValid="m0 90v-90h100v150h-75v-50h-5v-10zm55 10v-50h-50v50z";
140*b1cdbd2cSJim Jagielski         validate("validateDiff", pValid, &tools::solvePolygonOperationDiff);
141*b1cdbd2cSJim Jagielski     }
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski     // Change the following lines only, if you add, remove or rename
144*b1cdbd2cSJim Jagielski     // member functions of the current class,
145*b1cdbd2cSJim Jagielski     // because these macros are need by auto register mechanism.
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE(genericclipper);
148*b1cdbd2cSJim Jagielski     CPPUNIT_TEST(validateOr);
149*b1cdbd2cSJim Jagielski     CPPUNIT_TEST(validateXor);
150*b1cdbd2cSJim Jagielski     CPPUNIT_TEST(validateAnd);
151*b1cdbd2cSJim Jagielski     CPPUNIT_TEST(validateDiff);
152*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_END();
153*b1cdbd2cSJim Jagielski };
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
156*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::genericclipper);
157*b1cdbd2cSJim Jagielski } // namespace basegfx2d
158