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:
parent
8797094194
commit
28d1831d24
1 changed files with 12 additions and 70 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue