Added Append/Inserts for polygons, expanded constructors, expanded possibilities for appending/inserting only parts of source poly
This commit is contained in:
@@ -16,6 +16,7 @@ hedabu: ..\inc\b2dvector.hxx %_DEST%\inc%_EXT%\basegfx\b2dvector.hxx
|
||||
hedabu: ..\inc\b2dpoint.hxx %_DEST%\inc%_EXT%\basegfx\b2dpoint.hxx
|
||||
hedabu: ..\inc\b2dhompoint.hxx %_DEST%\inc%_EXT%\basegfx\b2dhompoint.hxx
|
||||
hedabu: ..\inc\b2dhommatrix.hxx %_DEST%\inc%_EXT%\basegfx\b2dhommatrix.hxx
|
||||
hedabu: ..\inc\b2dpolygon.hxx %_DEST%\inc%_EXT%\basegfx\b2dpolygon.hxx
|
||||
|
||||
hedabu: ..\inc\b3drange.hxx %_DEST%\inc%_EXT%\basegfx\b3drange.hxx
|
||||
hedabu: ..\inc\b3dtuple.hxx %_DEST%\inc%_EXT%\basegfx\b3dtuple.hxx
|
||||
|
683
basegfx/source/inc/PolygonPoint.hxx
Normal file
683
basegfx/source/inc/PolygonPoint.hxx
Normal file
@@ -0,0 +1,683 @@
|
||||
/*************************************************************************
|
||||
*
|
||||
* $RCSfile: PolygonPoint.hxx,v $
|
||||
*
|
||||
* $Revision: 1.1 $
|
||||
*
|
||||
* last change: $Author: aw $ $Date: 2003-02-27 15:42:05 $
|
||||
*
|
||||
* The Contents of this file are made available subject to the terms of
|
||||
* either of the following licenses
|
||||
*
|
||||
* - GNU Lesser General Public License Version 2.1
|
||||
* - Sun Industry Standards Source License Version 1.1
|
||||
*
|
||||
* Sun Microsystems Inc., October, 2000
|
||||
*
|
||||
* GNU Lesser General Public License Version 2.1
|
||||
* =============================================
|
||||
* Copyright 2000 by Sun Microsystems, Inc.
|
||||
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License version 2.1, as published by the Free Software Foundation.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
*
|
||||
* Sun Industry Standards Source License Version 1.1
|
||||
* =================================================
|
||||
* The contents of this file are subject to the Sun Industry Standards
|
||||
* Source License Version 1.1 (the "License"); You may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of the
|
||||
* License at http://www.openoffice.org/license.html.
|
||||
*
|
||||
* Software provided under this License is provided on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
||||
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
||||
* See the License for the specific provisions governing your rights and
|
||||
* obligations concerning the Software.
|
||||
*
|
||||
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
||||
*
|
||||
* Copyright: 2000 by Sun Microsystems, Inc.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): _______________________________________
|
||||
*
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifndef _POLYGON_POINT_HXX
|
||||
#define _POLYGON_POINT_HXX
|
||||
|
||||
#include <vector>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template < class Point, class Vector > class SimplePolygonPoint
|
||||
{
|
||||
Point maPoint;
|
||||
|
||||
public:
|
||||
SimplePolygonPoint()
|
||||
: maPoint()
|
||||
{
|
||||
}
|
||||
|
||||
SimplePolygonPoint(const Point& rInitPoint)
|
||||
: maPoint(rInitPoint)
|
||||
{
|
||||
}
|
||||
|
||||
const Point& GetPoint() const
|
||||
{
|
||||
return maPoint;
|
||||
}
|
||||
|
||||
void SetPoint(const Point& rValue)
|
||||
{
|
||||
maPoint = rValue;
|
||||
}
|
||||
|
||||
const Vector& GetBackwardVector() const
|
||||
{
|
||||
return Vector::GetEmptyVector();
|
||||
}
|
||||
|
||||
void SetBackwardVector(const Vector& rValue)
|
||||
{
|
||||
DBG_ASSERT(Vector::GetEmptyVector() == rValue, "Setting backward vector different from zero vector not allowed at SimpleNode (!)");
|
||||
}
|
||||
|
||||
const Vector& GetForwardVector() const
|
||||
{
|
||||
return Vector::GetEmptyVector();
|
||||
}
|
||||
|
||||
void SetForwardVector(const Vector& rValue)
|
||||
{
|
||||
DBG_ASSERT(Vector::GetEmptyVector() == rValue, "Setting forward vector different from zero vector not allowed at SimpleNode (!)");
|
||||
}
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template < class Point, class Vector > class BezierPolygonPoint
|
||||
{
|
||||
Point maPoint;
|
||||
Vector maBackward;
|
||||
Vector maForward;
|
||||
|
||||
public:
|
||||
BezierPolygonPoint()
|
||||
: maPoint(),
|
||||
maBackward(),
|
||||
maForward()
|
||||
{
|
||||
}
|
||||
|
||||
BezierPolygonPoint(const Point& rInitPoint)
|
||||
: maPoint(rInitPoint),
|
||||
maBackward(),
|
||||
maForward()
|
||||
{
|
||||
}
|
||||
|
||||
const Point& GetPoint() const
|
||||
{
|
||||
return maPoint;
|
||||
}
|
||||
|
||||
void SetPoint(const Point& rValue)
|
||||
{
|
||||
maPoint = rValue;
|
||||
}
|
||||
|
||||
const Vector& GetBackwardVector() const
|
||||
{
|
||||
return maBackward;
|
||||
}
|
||||
|
||||
void SetBackwardVector(const Vector& rValue)
|
||||
{
|
||||
maBackward = rValue;
|
||||
}
|
||||
|
||||
const Vector& GetForwardVector() const
|
||||
{
|
||||
return maForward;
|
||||
}
|
||||
|
||||
void SetForwardVector(const Vector& rValue)
|
||||
{
|
||||
maForward = rValue;
|
||||
}
|
||||
|
||||
sal_Bool IsBezierNeeded()
|
||||
{
|
||||
if(maBackward != Vector::GetEmptyVector() || maForward != Vector::GetEmptyVector())
|
||||
return sal_True;
|
||||
return sal_False;
|
||||
}
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template < class Point, class Vector > class PolygonPointList
|
||||
{
|
||||
typedef SimplePolygonPoint< Point, Vector > LocalSimplePolygonPoint;
|
||||
typedef BezierPolygonPoint< Point, Vector > LocalBezierPolygonPoint;
|
||||
typedef ::std::vector< LocalSimplePolygonPoint > SimplePolygonVector;
|
||||
typedef ::std::vector< LocalBezierPolygonPoint > BezierPolygonVector;
|
||||
|
||||
sal_uInt32 mnCount;
|
||||
sal_uInt32 mnBezierCount;
|
||||
|
||||
union
|
||||
{
|
||||
SimplePolygonVector* mpSimple;
|
||||
BezierPolygonVector* mpBezier;
|
||||
}
|
||||
maList;
|
||||
|
||||
unsigned mbBezierFormat : 1;
|
||||
unsigned mbIsClosed : 1;
|
||||
|
||||
void ImplCopyToBezierVector(BezierPolygonVector* pBezier, SimplePolygonVector* pSimple)
|
||||
{
|
||||
SimplePolygonVector::iterator aSimpleIter(pSimple->begin());
|
||||
const SimplePolygonVector::iterator aSimpleEnd(pSimple->end());
|
||||
BezierPolygonVector::iterator aBezierIter(pBezier->begin());
|
||||
|
||||
for( ; aSimpleIter != aSimpleEnd; ++aSimpleIter , ++aBezierIter)
|
||||
{
|
||||
aBezierIter->SetPoint(aSimpleIter->GetPoint());
|
||||
}
|
||||
}
|
||||
|
||||
void ImplForceToBezier()
|
||||
{
|
||||
if(!mbBezierFormat)
|
||||
{
|
||||
SimplePolygonVector* pOldSimple = maList.mpSimple;
|
||||
|
||||
if(mnCount)
|
||||
{
|
||||
maList.mpBezier = new BezierPolygonVector(mnCount);
|
||||
ImplCopyToBezierVector(maList.mpBezier, pOldSimple);
|
||||
}
|
||||
|
||||
delete pOldSimple;
|
||||
mbBezierFormat = sal_True;
|
||||
}
|
||||
}
|
||||
|
||||
sal_Bool ImplCompareDifferentFormats(SimplePolygonVector* pSimple, BezierPolygonVector* pBezier) const
|
||||
{
|
||||
SimplePolygonVector::iterator aSimpleIter(pSimple->begin());
|
||||
const SimplePolygonVector::iterator aSimpleEnd(pSimple->end());
|
||||
BezierPolygonVector::iterator aBezierIter(pBezier->begin());
|
||||
|
||||
for( ; aSimpleIter != aSimpleEnd; ++aSimpleIter , ++aBezierIter)
|
||||
{
|
||||
if(aBezierIter->GetPoint() != aSimpleIter->GetPoint())
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
return sal_True;
|
||||
}
|
||||
|
||||
void ImplCopyToSimpleVector(SimplePolygonVector* pSimple, BezierPolygonVector* pBezier)
|
||||
{
|
||||
BezierPolygonVector::iterator aBezierIter(pBezier->begin());
|
||||
const BezierPolygonVector::iterator aBezierEnd(pBezier->end());
|
||||
SimplePolygonVector::iterator aSimpleIter(pSimple->begin());
|
||||
|
||||
for( ; aBezierIter != aBezierEnd; ++aBezierIter , ++aSimpleIter)
|
||||
{
|
||||
aSimpleIter->SetPoint(aBezierIter->GetPoint());
|
||||
}
|
||||
}
|
||||
|
||||
void ImplTryToChangeToSimple()
|
||||
{
|
||||
if(mbBezierFormat && !mnBezierCount)
|
||||
{
|
||||
BezierPolygonVector* pOldBezier = maList.mpBezier;
|
||||
|
||||
if(mnCount)
|
||||
{
|
||||
maList.mpSimple = new SimplePolygonVector(mnCount);
|
||||
ImplCopyToSimpleVector(maList.mpSimple, pOldBezier);
|
||||
}
|
||||
|
||||
delete pOldBezier;
|
||||
mbBezierFormat = sal_False;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
sal_Bool IsBezier() const
|
||||
{
|
||||
return sal_Bool(mnBezierCount);
|
||||
}
|
||||
|
||||
sal_Bool IsClosed() const
|
||||
{
|
||||
return sal_Bool(mbIsClosed);
|
||||
}
|
||||
|
||||
void SetClosed(sal_Bool bNew)
|
||||
{
|
||||
mbIsClosed = bNew;
|
||||
}
|
||||
|
||||
sal_uInt32 GetPointCount() const
|
||||
{
|
||||
return mnCount;
|
||||
}
|
||||
|
||||
PolygonPointList(sal_Bool bBezier)
|
||||
: mnCount(0L),
|
||||
mnBezierCount(0L),
|
||||
mbBezierFormat(bBezier),
|
||||
mbIsClosed(sal_False)
|
||||
{
|
||||
// complete initialization with defaults
|
||||
maList.mpSimple = 0L;
|
||||
}
|
||||
|
||||
PolygonPointList(const PolygonPointList& rSource)
|
||||
: mnCount(rSource.mnCount),
|
||||
mnBezierCount(rSource.mnBezierCount),
|
||||
mbBezierFormat(rSource.mbBezierFormat),
|
||||
mbIsClosed(sal_False)
|
||||
{
|
||||
// complete initialization using copy
|
||||
maList.mpSimple = 0L;
|
||||
|
||||
if(mnCount)
|
||||
{
|
||||
if(mbBezierFormat)
|
||||
{
|
||||
if(mnBezierCount)
|
||||
{
|
||||
maList.mpBezier = new BezierPolygonVector(*rSource.maList.mpBezier);
|
||||
}
|
||||
else
|
||||
{
|
||||
// here, a reduction at copy time can be done
|
||||
maList.mpSimple = new SimplePolygonVector(mnCount);
|
||||
ImplCopyToSimpleVector(maList.mpSimple, rSource.maList.mpBezier);
|
||||
mbBezierFormat = sal_False;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
maList.mpSimple = new SimplePolygonVector(*rSource.maList.mpSimple);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PolygonPointList(const PolygonPointList& rSource, sal_uInt32 nIndex, sal_uInt32 nCount)
|
||||
: mnCount(0L),
|
||||
mnBezierCount(0L),
|
||||
mbBezierFormat(rSource.mbBezierFormat),
|
||||
mbIsClosed(sal_False)
|
||||
{
|
||||
// complete initialization using partly copy
|
||||
maList.mpSimple = 0L;
|
||||
|
||||
if(nCount)
|
||||
{
|
||||
if(rSource.IsBezier())
|
||||
{
|
||||
maList.mpBezier = new BezierPolygonVector();
|
||||
maList.mpBezier->reserve(nCount);
|
||||
|
||||
BezierPolygonVector::iterator aStart(rSource.maList.mpBezier->begin());
|
||||
aStart += nIndex;
|
||||
BezierPolygonVector::iterator aEnd(aStart);
|
||||
aEnd += nCount;
|
||||
|
||||
for( ; aStart != aEnd; ++aStart )
|
||||
{
|
||||
if(aStart->IsBezierNeeded())
|
||||
{
|
||||
mnBezierCount++;
|
||||
}
|
||||
|
||||
maList.mpBezier->push_back(*aStart);
|
||||
}
|
||||
|
||||
// maybe 0L == mbBezierCount, try to reduce
|
||||
mnCount = nCount;
|
||||
ImplTryToChangeToSimple();
|
||||
}
|
||||
else
|
||||
{
|
||||
maList.mpSimple = new SimplePolygonVector();
|
||||
maList.mpSimple->reserve(nCount);
|
||||
|
||||
SimplePolygonVector::iterator aStart(rSource.maList.mpSimple->begin());
|
||||
aStart += nIndex;
|
||||
SimplePolygonVector::iterator aEnd(aStart);
|
||||
aEnd += nCount;
|
||||
|
||||
maList.mpSimple->insert(0L, aStart, aEnd);
|
||||
mnCount = nCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
~PolygonPointList()
|
||||
{
|
||||
if(mbBezierFormat)
|
||||
{
|
||||
if(maList.mpBezier)
|
||||
{
|
||||
delete maList.mpBezier;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(maList.mpSimple)
|
||||
{
|
||||
delete maList.mpSimple;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sal_Bool IsEqual(const PolygonPointList& rPointList) const
|
||||
{
|
||||
// same point count?
|
||||
if(mnCount != rPointList.mnCount)
|
||||
return sal_False;
|
||||
|
||||
// if zero points the polys are equal
|
||||
if(!mnCount)
|
||||
return sal_True;
|
||||
|
||||
// if bezier count used it needs to be equal
|
||||
if(mnBezierCount != rPointList.mnBezierCount)
|
||||
return sal_False;
|
||||
|
||||
// compare content if same format
|
||||
if(mbBezierFormat && rPointList.mbBezierFormat)
|
||||
return (maList.mpBezier == rPointList.maList.mpBezier);
|
||||
|
||||
if(!mbBezierFormat && !rPointList.mbBezierFormat)
|
||||
return (maList.mpSimple == rPointList.maList.mpSimple);
|
||||
|
||||
// here we have a combination of bezier and simple. Thus, mnBezierCount
|
||||
// needs to be zero, else we have an error here.
|
||||
DBG_ASSERT(0L == mnBezierCount, "Error: Bezier count needs to be zero here (!)");
|
||||
|
||||
if(mbBezierFormat)
|
||||
{
|
||||
// Hint: here would be another chance for reduction, but this method should stay const
|
||||
return ImplCompareDifferentFormats(rPointList.maList.mpSimple, maList.mpBezier);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ImplCompareDifferentFormats(maList.mpSimple, rPointList.maList.mpBezier);
|
||||
}
|
||||
}
|
||||
|
||||
const Point& GetPoint(sal_uInt32 nIndex) const
|
||||
{
|
||||
if(mbBezierFormat)
|
||||
return ((*maList.mpBezier)[nIndex]).GetPoint();
|
||||
else
|
||||
return ((*maList.mpSimple)[nIndex]).GetPoint();
|
||||
}
|
||||
|
||||
void SetPoint(sal_uInt32 nIndex, const Point& rValue)
|
||||
{
|
||||
if(mbBezierFormat)
|
||||
((*maList.mpBezier)[nIndex]).SetPoint(rValue);
|
||||
else
|
||||
((*maList.mpSimple)[nIndex]).SetPoint(rValue);
|
||||
}
|
||||
|
||||
const Vector& GetBackwardVector(sal_uInt32 nIndex) const
|
||||
{
|
||||
if(mbBezierFormat)
|
||||
return ((*maList.mpBezier)[nIndex]).GetBackwardVector();
|
||||
else
|
||||
return Vector::GetEmptyVector();
|
||||
}
|
||||
|
||||
void SetBackwardVector(sal_uInt32 nIndex, const Vector& rValue)
|
||||
{
|
||||
if(!mbBezierFormat && rValue != Vector::GetEmptyVector())
|
||||
ImplForceToBezier();
|
||||
|
||||
if(mbBezierFormat)
|
||||
{
|
||||
LocalBezierPolygonPoint& rDest = (*maList.mpBezier)[nIndex];
|
||||
sal_Bool bBezierNeededBefore(rDest.IsBezierNeeded());
|
||||
|
||||
rDest.SetBackwardVector(rValue);
|
||||
|
||||
sal_Bool bBezierNeededAfter(rDest.IsBezierNeeded());
|
||||
|
||||
if(bBezierNeededBefore != bBezierNeededAfter)
|
||||
{
|
||||
if(bBezierNeededAfter)
|
||||
mnBezierCount++;
|
||||
else
|
||||
mnBezierCount--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const Vector& GetForwardVector(sal_uInt32 nIndex) const
|
||||
{
|
||||
if(mbBezierFormat)
|
||||
return ((*maList.mpBezier)[nIndex]).GetForwardVector();
|
||||
else
|
||||
return Vector::GetEmptyVector();
|
||||
}
|
||||
|
||||
void SetForwardVector(sal_uInt32 nIndex, const Vector& rValue)
|
||||
{
|
||||
if(!mbBezierFormat && rValue != Vector::GetEmptyVector())
|
||||
ImplForceToBezier();
|
||||
|
||||
if(mbBezierFormat)
|
||||
{
|
||||
LocalBezierPolygonPoint& rDest = (*maList.mpBezier)[nIndex];
|
||||
sal_Bool bBezierNeededBefore(rDest.IsBezierNeeded());
|
||||
|
||||
rDest.SetForwardVector(rValue);
|
||||
|
||||
sal_Bool bBezierNeededAfter(rDest.IsBezierNeeded());
|
||||
|
||||
if(bBezierNeededBefore != bBezierNeededAfter)
|
||||
{
|
||||
if(bBezierNeededAfter)
|
||||
mnBezierCount++;
|
||||
else
|
||||
mnBezierCount--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Insert(sal_uInt32 nIndex, const Point& rPoint, sal_uInt32 nCount)
|
||||
{
|
||||
if(nCount)
|
||||
{
|
||||
// before inserting, eventually reduce memory usage
|
||||
ImplTryToChangeToSimple();
|
||||
|
||||
if(mbBezierFormat)
|
||||
{
|
||||
LocalBezierPolygonPoint aNode(rPoint);
|
||||
|
||||
if(!maList.mpBezier)
|
||||
{
|
||||
maList.mpBezier = new BezierPolygonVector(mnCount, aNode);
|
||||
}
|
||||
else
|
||||
{
|
||||
BezierPolygonVector::iterator aIndex(maList.mpBezier->begin());
|
||||
aIndex += nIndex;
|
||||
maList.mpBezier->insert(aIndex, nCount, aNode);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LocalSimplePolygonPoint aNode(rPoint);
|
||||
|
||||
if(!maList.mpSimple)
|
||||
{
|
||||
maList.mpSimple = new SimplePolygonVector(mnCount, aNode);
|
||||
}
|
||||
else
|
||||
{
|
||||
SimplePolygonVector::iterator aIndex(maList.mpSimple->begin());
|
||||
aIndex += nIndex;
|
||||
maList.mpSimple->insert(aIndex, nCount, aNode);
|
||||
}
|
||||
}
|
||||
|
||||
mnCount += nCount;
|
||||
}
|
||||
}
|
||||
|
||||
void Insert(sal_uInt32 nIndex, const PolygonPointList& rSource)
|
||||
{
|
||||
const sal_uInt32 nCount(rSource.mnCount);
|
||||
|
||||
if(nCount)
|
||||
{
|
||||
if(rSource.IsBezier())
|
||||
{
|
||||
ImplForceToBezier();
|
||||
|
||||
if(!maList.mpBezier)
|
||||
{
|
||||
// copy other bezier
|
||||
maList.mpBezier = new BezierPolygonVector(*rSource.maList.mpBezier);
|
||||
mnBezierCount = rSource.mnBezierCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
// insert bezier into bezier
|
||||
BezierPolygonVector::iterator aIndex(maList.mpBezier->begin());
|
||||
aIndex += nIndex;
|
||||
|
||||
BezierPolygonVector::iterator aStart(rSource.maList.mpBezier->begin());
|
||||
BezierPolygonVector::iterator aEnd(rSource.maList.mpBezier->end());
|
||||
|
||||
maList.mpBezier->insert(aIndex, aStart, aEnd);
|
||||
mnBezierCount += rSource.mnBezierCount;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// before inserting, eventually reduce memory usage
|
||||
ImplTryToChangeToSimple();
|
||||
|
||||
if(mnBezierCount)
|
||||
{
|
||||
// local is still bezier, source is simple. Insert
|
||||
// simple into bezier.
|
||||
LocalBezierPolygonPoint aNode(Point::GetEmptyPoint());
|
||||
BezierPolygonVector::iterator aIndex(maList.mpBezier->begin());
|
||||
aIndex += nIndex;
|
||||
|
||||
// insert nCount empty elements
|
||||
maList.mpBezier->insert(aIndex, nCount, aNode);
|
||||
|
||||
// copy coordinate data to new locations
|
||||
SimplePolygonVector::iterator aSimpleIter(rSource.maList.mpSimple->begin());
|
||||
const SimplePolygonVector::iterator aSimpleEnd(rSource.maList.mpSimple->end());
|
||||
|
||||
for( ; aSimpleIter != aSimpleEnd; ++aSimpleIter , ++aIndex)
|
||||
{
|
||||
aIndex->SetPoint(aSimpleIter->GetPoint());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// insert simple into simple
|
||||
if(!maList.mpSimple)
|
||||
{
|
||||
maList.mpSimple = new SimplePolygonVector(*rSource.maList.mpSimple);
|
||||
}
|
||||
else
|
||||
{
|
||||
SimplePolygonVector::iterator aIndex(maList.mpSimple->begin());
|
||||
aIndex += nIndex;
|
||||
|
||||
SimplePolygonVector::iterator aStart(rSource.maList.mpSimple->begin());
|
||||
SimplePolygonVector::iterator aEnd(rSource.maList.mpSimple->end());
|
||||
|
||||
maList.mpSimple->insert(aIndex, aStart, aEnd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mnCount += nCount;
|
||||
}
|
||||
}
|
||||
|
||||
void Remove(sal_uInt32 nIndex, sal_uInt32 nCount)
|
||||
{
|
||||
if(nCount)
|
||||
{
|
||||
if(mbBezierFormat)
|
||||
{
|
||||
BezierPolygonVector::iterator aStart(maList.mpBezier->begin());
|
||||
aStart += nIndex;
|
||||
const BezierPolygonVector::iterator aEnd(aStart + nCount);
|
||||
|
||||
// take care for correct mnBezierCount BEFORE erase
|
||||
if(mnBezierCount)
|
||||
{
|
||||
BezierPolygonVector::iterator aTestIter(aStart);
|
||||
|
||||
for( ; mnBezierCount && aTestIter != aEnd; ++aTestIter)
|
||||
{
|
||||
if(aTestIter->IsBezierNeeded())
|
||||
mnBezierCount--;
|
||||
}
|
||||
}
|
||||
|
||||
// erase nodes
|
||||
maList.mpBezier->erase(aStart, aEnd);
|
||||
|
||||
// try to reduce, maybe 0L == mnBezierCount
|
||||
ImplTryToChangeToSimple();
|
||||
}
|
||||
else
|
||||
{
|
||||
SimplePolygonVector::iterator aStart(maList.mpSimple->begin());
|
||||
aStart += nIndex;
|
||||
const SimplePolygonVector::iterator aEnd(aStart + nCount);
|
||||
|
||||
maList.mpSimple->erase(aStart, aEnd);
|
||||
}
|
||||
|
||||
mnCount -= nCount;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#endif _POLYGON_POINT_HXX
|
Reference in New Issue
Block a user