summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2008-08-19 23:45:25 +0000
committerVladimir Glazounov <vg@openoffice.org>2008-08-19 23:45:25 +0000
commit28d1831d24d5c730f7fecd206370a579bc44747f (patch)
treed9fa567bb3cdbd280c0bd5aed7228f232324dbc2 /tools
parent8797094194acced88f5c73521421798be222af0b (diff)
INTEGRATION: CWS aw033 (1.17.10); FILE MERGED
2008/07/11 11:45:08 aw 1.17.10.7: RESYNC: (1.21-1.22); FILE MERGED 2008/06/25 13:13:40 aw 1.17.10.6: RESYNC: (1.19-1.21); FILE MERGED 2008/05/14 15:20:50 aw 1.17.10.5: RESYNC: (1.17-1.19); FILE MERGED 2008/02/06 15:34:02 thb 1.17.10.4: #i10000# Fix build break for vanilla OOo 2007/12/12 13:28:18 aw 1.17.10.3: #i39532# clipping changes 2007/12/04 17:20:33 aw 1.17.10.2: #i39532# changes after resync 2007/11/22 15:04:41 aw 1.17.10.1: #i39532# wntmsci10 correction
Diffstat (limited to 'tools')
-rw-r--r--tools/source/generic/poly2.cxx82
1 files changed, 12 insertions, 70 deletions
diff --git a/tools/source/generic/poly2.cxx b/tools/source/generic/poly2.cxx
index 51da9147f097..a560c961f481 100644
--- a/tools/source/generic/poly2.cxx
+++ b/tools/source/generic/poly2.cxx
@@ -7,7 +7,7 @@
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: poly2.cxx,v $
- * $Revision: 1.22 $
+ * $Revision: 1.23 $
*
* This file is part of OpenOffice.org.
*
@@ -45,23 +45,15 @@ extern "C"
#endif // HAVE_GPC_H
}
-/*
-#include <cstring>
-#include <cmath>
-*/
+#include <rtl/math.hxx>
#include <poly.h>
-#ifndef _POLY_HXX
#include <tools/poly.hxx>
-#endif
#include <tools/debug.hxx>
#include <tools/stream.hxx>
#include <tools/vcompat.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx>
#include <basegfx/polygon/b2dpolygon.hxx>
-
-#ifndef _BGFX_POLYGON_B2DPOLYPOLYGONTOOLS_HXX
-#include <basegfx/polygon/b2dpolypolygontools.hxx>
-#endif
+#include <basegfx/polygon/b2dpolypolygoncutter.hxx>
// ---------------
// - PolyPolygon -
@@ -514,13 +506,8 @@ void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rR
// normalize the two polypolygons before. Force properly oriented
// polygons.
- if( aMergePolyPolygonA.areControlPointsUsed() )
- aMergePolyPolygonA = basegfx::tools::adaptiveSubdivideByAngle(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::correctOrientations( aMergePolyPolygonA );
-
- if( aMergePolyPolygonB.areControlPointsUsed() )
- aMergePolyPolygonB = basegfx::tools::adaptiveSubdivideByAngle(aMergePolyPolygonB);
- aMergePolyPolygonB = basegfx::tools::correctOrientations( aMergePolyPolygonB );
+ aMergePolyPolygonA = basegfx::tools::prepareForPolygonOperation( aMergePolyPolygonA );
+ aMergePolyPolygonB = basegfx::tools::prepareForPolygonOperation( aMergePolyPolygonB );
switch( nOperation )
{
@@ -529,61 +516,22 @@ void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rR
case GPC_UNION:
{
- // simple merge all contained parts (OR)
- aMergePolyPolygonA.append(aMergePolyPolygonB);
- aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_True);
+ // merge A and B (OR)
+ aMergePolyPolygonA = basegfx::tools::solvePolygonOperationOr(aMergePolyPolygonA, aMergePolyPolygonB);
break;
}
case GPC_DIFF:
{
- // take selected poly 2..n (is in Polygon B), merge them, flipdirections
- // and merge with poly 1
- aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_True);
- aMergePolyPolygonB = basegfx::tools::removeAllIntersections(aMergePolyPolygonB);
- aMergePolyPolygonB = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonB, sal_True);
- aMergePolyPolygonB.flip();
- aMergePolyPolygonA.append(aMergePolyPolygonB);
- aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_True);
-
- // #72995# one more call to resolve self intersections which
- // may have been built by substracting (see bug)
- //aMergePolyPolygonA.Merge(FALSE);
- aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_True);
+ // substract B from A (DIFF)
+ aMergePolyPolygonA = basegfx::tools::solvePolygonOperationDiff(aMergePolyPolygonA, aMergePolyPolygonB);
break;
}
case GPC_XOR:
{
- // compute XOR between poly A and B. As basegfx clipper
- // has no direct support for this, we first compute the
- // intersection and the union of the two polygons, and
- // then subtract the intersection from the union
- aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_True);
- aMergePolyPolygonB = basegfx::tools::removeAllIntersections(aMergePolyPolygonB);
- aMergePolyPolygonB = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonB, sal_True);
- basegfx::B2DPolyPolygon aAintersectsB( aMergePolyPolygonA );
-
- // A /\ B
- aAintersectsB.append(aMergePolyPolygonB);
- aAintersectsB = basegfx::tools::removeAllIntersections(aAintersectsB);
- aAintersectsB = basegfx::tools::removeNeutralPolygons(aAintersectsB, sal_False);
-
- // A + B
- aMergePolyPolygonA.append(aMergePolyPolygonB);
- aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_True);
-
- // (A+B) \ (A/\B)
- aAintersectsB.flip();
- aMergePolyPolygonA.append(aAintersectsB);
- aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_True);
+ // compute XOR between poly A and B
+ aMergePolyPolygonA = basegfx::tools::solvePolygonOperationXor(aMergePolyPolygonA, aMergePolyPolygonB);
break;
}
@@ -591,13 +539,7 @@ void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rR
case GPC_INT:
{
// cut poly 1 against polys 2..n (AND)
- aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_True);
- aMergePolyPolygonB = basegfx::tools::removeAllIntersections(aMergePolyPolygonB);
- aMergePolyPolygonB = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonB, sal_True);
- aMergePolyPolygonA.append(aMergePolyPolygonB);
- aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
- aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_False);
+ aMergePolyPolygonA = basegfx::tools::solvePolygonOperationAnd(aMergePolyPolygonA, aMergePolyPolygonB);
break;
}
}