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
This commit is contained in:
Vladimir Glazounov 2008-08-19 23:45:25 +00:00
parent 8797094194
commit 28d1831d24

View file

@ -7,7 +7,7 @@
* OpenOffice.org - a multi-platform office productivity suite * OpenOffice.org - a multi-platform office productivity suite
* *
* $RCSfile: poly2.cxx,v $ * $RCSfile: poly2.cxx,v $
* $Revision: 1.22 $ * $Revision: 1.23 $
* *
* This file is part of OpenOffice.org. * This file is part of OpenOffice.org.
* *
@ -45,23 +45,15 @@ extern "C"
#endif // HAVE_GPC_H #endif // HAVE_GPC_H
} }
/* #include <rtl/math.hxx>
#include <cstring>
#include <cmath>
*/
#include <poly.h> #include <poly.h>
#ifndef _POLY_HXX
#include <tools/poly.hxx> #include <tools/poly.hxx>
#endif
#include <tools/debug.hxx> #include <tools/debug.hxx>
#include <tools/stream.hxx> #include <tools/stream.hxx>
#include <tools/vcompat.hxx> #include <tools/vcompat.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx> #include <basegfx/polygon/b2dpolypolygon.hxx>
#include <basegfx/polygon/b2dpolygon.hxx> #include <basegfx/polygon/b2dpolygon.hxx>
#include <basegfx/polygon/b2dpolypolygoncutter.hxx>
#ifndef _BGFX_POLYGON_B2DPOLYPOLYGONTOOLS_HXX
#include <basegfx/polygon/b2dpolypolygontools.hxx>
#endif
// --------------- // ---------------
// - PolyPolygon - // - PolyPolygon -
@ -514,13 +506,8 @@ void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rR
// normalize the two polypolygons before. Force properly oriented // normalize the two polypolygons before. Force properly oriented
// polygons. // polygons.
if( aMergePolyPolygonA.areControlPointsUsed() ) aMergePolyPolygonA = basegfx::tools::prepareForPolygonOperation( aMergePolyPolygonA );
aMergePolyPolygonA = basegfx::tools::adaptiveSubdivideByAngle(aMergePolyPolygonA); aMergePolyPolygonB = basegfx::tools::prepareForPolygonOperation( aMergePolyPolygonB );
aMergePolyPolygonA = basegfx::tools::correctOrientations( aMergePolyPolygonA );
if( aMergePolyPolygonB.areControlPointsUsed() )
aMergePolyPolygonB = basegfx::tools::adaptiveSubdivideByAngle(aMergePolyPolygonB);
aMergePolyPolygonB = basegfx::tools::correctOrientations( aMergePolyPolygonB );
switch( nOperation ) switch( nOperation )
{ {
@ -529,61 +516,22 @@ void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rR
case GPC_UNION: case GPC_UNION:
{ {
// simple merge all contained parts (OR) // merge A and B (OR)
aMergePolyPolygonA.append(aMergePolyPolygonB); aMergePolyPolygonA = basegfx::tools::solvePolygonOperationOr(aMergePolyPolygonA, aMergePolyPolygonB);
aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA);
aMergePolyPolygonA = basegfx::tools::removeNeutralPolygons(aMergePolyPolygonA, sal_True);
break; break;
} }
case GPC_DIFF: case GPC_DIFF:
{ {
// take selected poly 2..n (is in Polygon B), merge them, flipdirections // substract B from A (DIFF)
// and merge with poly 1 aMergePolyPolygonA = basegfx::tools::solvePolygonOperationDiff(aMergePolyPolygonA, aMergePolyPolygonB);
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);
break; break;
} }
case GPC_XOR: case GPC_XOR:
{ {
// compute XOR between poly A and B. As basegfx clipper // compute XOR between poly A and B
// has no direct support for this, we first compute the aMergePolyPolygonA = basegfx::tools::solvePolygonOperationXor(aMergePolyPolygonA, aMergePolyPolygonB);
// 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);
break; break;
} }
@ -591,13 +539,7 @@ void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rR
case GPC_INT: case GPC_INT:
{ {
// cut poly 1 against polys 2..n (AND) // cut poly 1 against polys 2..n (AND)
aMergePolyPolygonA = basegfx::tools::removeAllIntersections(aMergePolyPolygonA); aMergePolyPolygonA = basegfx::tools::solvePolygonOperationAnd(aMergePolyPolygonA, aMergePolyPolygonB);
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);
break; break;
} }
} }