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: */
|