1*ce9c7ef7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*ce9c7ef7SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*ce9c7ef7SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*ce9c7ef7SAndrew Rist  * distributed with this work for additional information
6*ce9c7ef7SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*ce9c7ef7SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*ce9c7ef7SAndrew Rist  * "License"); you may not use this file except in compliance
9*ce9c7ef7SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*ce9c7ef7SAndrew Rist  *
11*ce9c7ef7SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*ce9c7ef7SAndrew Rist  *
13*ce9c7ef7SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*ce9c7ef7SAndrew Rist  * software distributed under the License is distributed on an
15*ce9c7ef7SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*ce9c7ef7SAndrew Rist  * KIND, either express or implied.  See the License for the
17*ce9c7ef7SAndrew Rist  * specific language governing permissions and limitations
18*ce9c7ef7SAndrew Rist  * under the License.
19*ce9c7ef7SAndrew Rist  *
20*ce9c7ef7SAndrew Rist  *************************************************************/
21*ce9c7ef7SAndrew Rist 
22*ce9c7ef7SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _POLYGON_POINT_HXX
25cdf0e10cSrcweir #define _POLYGON_POINT_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <vector>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
30cdf0e10cSrcweir 
31cdf0e10cSrcweir template < class Point > class SimplePointEntry
32cdf0e10cSrcweir {
33cdf0e10cSrcweir 	Point											maPoint;
34cdf0e10cSrcweir 
35cdf0e10cSrcweir public:
SimplePointEntry()36cdf0e10cSrcweir 	SimplePointEntry()
37cdf0e10cSrcweir 	:	maPoint(Point::getEmptyPoint())
38cdf0e10cSrcweir 	{
39cdf0e10cSrcweir 	}
40cdf0e10cSrcweir 
SimplePointEntry(const Point & rInitPoint)41cdf0e10cSrcweir 	SimplePointEntry(const Point& rInitPoint)
42cdf0e10cSrcweir 	:	maPoint(rInitPoint)
43cdf0e10cSrcweir 	{
44cdf0e10cSrcweir 	}
45cdf0e10cSrcweir 
getPoint() const46cdf0e10cSrcweir 	const Point& getPoint() const
47cdf0e10cSrcweir 	{
48cdf0e10cSrcweir 		return maPoint;
49cdf0e10cSrcweir 	}
50cdf0e10cSrcweir 
setPoint(const Point & rValue)51cdf0e10cSrcweir 	void setPoint(const Point& rValue)
52cdf0e10cSrcweir 	{
53cdf0e10cSrcweir 		maPoint = rValue;
54cdf0e10cSrcweir 	}
55cdf0e10cSrcweir 
operator ==(const SimplePointEntry & rEntry) const56cdf0e10cSrcweir 	bool operator==(const SimplePointEntry& rEntry) const
57cdf0e10cSrcweir 	{
58cdf0e10cSrcweir 		return (maPoint == rEntry.maPoint);
59cdf0e10cSrcweir 	}
60cdf0e10cSrcweir };
61cdf0e10cSrcweir 
62cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
63cdf0e10cSrcweir 
64cdf0e10cSrcweir template < class Vector > class SimpleBezierEntry
65cdf0e10cSrcweir {
66cdf0e10cSrcweir 	Vector											maBackward;
67cdf0e10cSrcweir 	Vector											maForward;
68cdf0e10cSrcweir 
69cdf0e10cSrcweir public:
SimpleBezierEntry()70cdf0e10cSrcweir 	SimpleBezierEntry()
71cdf0e10cSrcweir 	:	maBackward(Vector::getEmptyVector()),
72cdf0e10cSrcweir 		maForward(Vector::getEmptyVector())
73cdf0e10cSrcweir 	{
74cdf0e10cSrcweir 	}
75cdf0e10cSrcweir 
SimpleBezierEntry(const Vector & rInitBackward,const Vector & rInitForward)76cdf0e10cSrcweir 	SimpleBezierEntry(const Vector& rInitBackward, const Vector& rInitForward)
77cdf0e10cSrcweir 	:	maBackward(rInitBackward),
78cdf0e10cSrcweir 		maForward(rInitForward)
79cdf0e10cSrcweir 	{
80cdf0e10cSrcweir 	}
81cdf0e10cSrcweir 
getBackwardVector() const82cdf0e10cSrcweir 	const Vector& getBackwardVector() const
83cdf0e10cSrcweir 	{
84cdf0e10cSrcweir 		return maBackward;
85cdf0e10cSrcweir 	}
86cdf0e10cSrcweir 
setBackwardVector(const Vector & rValue)87cdf0e10cSrcweir 	void setBackwardVector(const Vector& rValue)
88cdf0e10cSrcweir 	{
89cdf0e10cSrcweir 		maBackward = rValue;
90cdf0e10cSrcweir 	}
91cdf0e10cSrcweir 
getForwardVector() const92cdf0e10cSrcweir 	const Vector& getForwardVector() const
93cdf0e10cSrcweir 	{
94cdf0e10cSrcweir 		return maForward;
95cdf0e10cSrcweir 	}
96cdf0e10cSrcweir 
setForwardVector(const Vector & rValue)97cdf0e10cSrcweir 	void setForwardVector(const Vector& rValue)
98cdf0e10cSrcweir 	{
99cdf0e10cSrcweir 		maForward = rValue;
100cdf0e10cSrcweir 	}
101cdf0e10cSrcweir 
isBezierNeeded()102cdf0e10cSrcweir 	bool isBezierNeeded()
103cdf0e10cSrcweir 	{
104cdf0e10cSrcweir 		if(maBackward != Vector::getEmptyVector() || maForward != Vector::getEmptyVector())
105cdf0e10cSrcweir 			return true;
106cdf0e10cSrcweir 		return false;
107cdf0e10cSrcweir 	}
108cdf0e10cSrcweir 
operator ==(const SimpleBezierEntry & rEntry) const109cdf0e10cSrcweir 	bool operator==(const SimpleBezierEntry& rEntry) const
110cdf0e10cSrcweir 	{
111cdf0e10cSrcweir 		return ((maBackward == rEntry.maBackward) && (maForward == rEntry.maForward));
112cdf0e10cSrcweir 	}
113cdf0e10cSrcweir 
doInvertForFlip()114cdf0e10cSrcweir 	void doInvertForFlip()
115cdf0e10cSrcweir 	{
116cdf0e10cSrcweir 		maBackward = -maBackward;
117cdf0e10cSrcweir 		maForward = -maForward;
118cdf0e10cSrcweir 	}
119cdf0e10cSrcweir };
120cdf0e10cSrcweir 
121cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
122cdf0e10cSrcweir 
123cdf0e10cSrcweir template < class Point, class Vector > class PolygonPointList
124cdf0e10cSrcweir {
125cdf0e10cSrcweir 	typedef SimplePointEntry< Point > LocalSimplePointEntry;
126cdf0e10cSrcweir 	typedef SimpleBezierEntry< Vector > LocalSimpleBezierEntry;
127cdf0e10cSrcweir 	typedef ::std::vector< LocalSimplePointEntry > SimplePointVector;
128cdf0e10cSrcweir 	typedef ::std::vector< LocalSimpleBezierEntry > SimpleBezierVector;
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 	sal_uInt32										mnBezierCount;
131cdf0e10cSrcweir 	SimplePointVector								maPoints;
132cdf0e10cSrcweir 	SimpleBezierVector*								mpVectors;
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 	unsigned										mbIsClosed : 1;
135cdf0e10cSrcweir 
implTryToReduceToPointVector()136cdf0e10cSrcweir 	void implTryToReduceToPointVector()
137cdf0e10cSrcweir 	{
138cdf0e10cSrcweir 		if(!mnBezierCount && mpVectors)
139cdf0e10cSrcweir 		{
140cdf0e10cSrcweir 			delete mpVectors;
141cdf0e10cSrcweir 			mpVectors = 0L;
142cdf0e10cSrcweir 		}
143cdf0e10cSrcweir 	}
144cdf0e10cSrcweir 
145cdf0e10cSrcweir public:
isBezier() const146cdf0e10cSrcweir 	bool isBezier() const
147cdf0e10cSrcweir 	{
148cdf0e10cSrcweir 		return bool(mnBezierCount);
149cdf0e10cSrcweir 	}
150cdf0e10cSrcweir 
isClosed() const151cdf0e10cSrcweir 	bool isClosed() const
152cdf0e10cSrcweir 	{
153cdf0e10cSrcweir 		return bool(mbIsClosed);
154cdf0e10cSrcweir 	}
155cdf0e10cSrcweir 
setClosed(bool bNew)156cdf0e10cSrcweir 	void setClosed(bool bNew)
157cdf0e10cSrcweir 	{
158cdf0e10cSrcweir 		mbIsClosed = bNew;
159cdf0e10cSrcweir 	}
160cdf0e10cSrcweir 
count() const161cdf0e10cSrcweir 	sal_uInt32 count() const
162cdf0e10cSrcweir 	{
163cdf0e10cSrcweir 		return maPoints.size();
164cdf0e10cSrcweir 	}
165cdf0e10cSrcweir 
PolygonPointList()166cdf0e10cSrcweir 	PolygonPointList()
167cdf0e10cSrcweir 	:	mnBezierCount(0L),
168cdf0e10cSrcweir 		mpVectors(0L),
169cdf0e10cSrcweir 		mbIsClosed(false)
170cdf0e10cSrcweir 	{
171cdf0e10cSrcweir 		// complete initialization with defaults
172cdf0e10cSrcweir 	}
173cdf0e10cSrcweir 
PolygonPointList(const PolygonPointList & rSource)174cdf0e10cSrcweir 	PolygonPointList(const PolygonPointList& rSource)
175cdf0e10cSrcweir 	:	mnBezierCount(0L),
176cdf0e10cSrcweir 		maPoints(rSource.maPoints),
177cdf0e10cSrcweir 		mpVectors(0L),
178cdf0e10cSrcweir 		mbIsClosed(rSource.mbIsClosed)
179cdf0e10cSrcweir 	{
180cdf0e10cSrcweir 		// complete initialization using copy
181cdf0e10cSrcweir 		if(rSource.mpVectors && rSource.mnBezierCount)
182cdf0e10cSrcweir 		{
183cdf0e10cSrcweir 			mpVectors = new SimpleBezierVector(*rSource.mpVectors);
184cdf0e10cSrcweir 			mnBezierCount = rSource.mnBezierCount;
185cdf0e10cSrcweir 		}
186cdf0e10cSrcweir 	}
187cdf0e10cSrcweir 
PolygonPointList(const PolygonPointList & rSource,sal_uInt32 nIndex,sal_uInt32 nCount)188cdf0e10cSrcweir 	PolygonPointList(const PolygonPointList& rSource, sal_uInt32 nIndex, sal_uInt32 nCount)
189cdf0e10cSrcweir 	:	mnBezierCount(0L),
190cdf0e10cSrcweir 		maPoints(nCount),
191cdf0e10cSrcweir 		mpVectors(0L),
192cdf0e10cSrcweir 		mbIsClosed(rSource.mbIsClosed)
193cdf0e10cSrcweir 	{
194cdf0e10cSrcweir 		// complete initialization using partly copy
195cdf0e10cSrcweir 		if(nCount)
196cdf0e10cSrcweir 		{
197cdf0e10cSrcweir 			// copy point data
198cdf0e10cSrcweir 			{
199cdf0e10cSrcweir 				SimplePointVector::const_iterator aStart(rSource.maPoints.begin());
200cdf0e10cSrcweir 				aStart += nIndex;
201cdf0e10cSrcweir 				SimplePointVector::const_iterator aEnd(aStart);
202cdf0e10cSrcweir 				aEnd += nCount;
203cdf0e10cSrcweir 				maPoints.insert(0L, aStart, aEnd);
204cdf0e10cSrcweir 			}
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 			// copy bezier data
207cdf0e10cSrcweir 			if(rSource.mpVectors && rSource.mnBezierCount)
208cdf0e10cSrcweir 			{
209cdf0e10cSrcweir 				mpVectors = new SimpleBezierVector();
210cdf0e10cSrcweir 				mpVectors->reserve(nCount);
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 				SimpleBezierVector::iterator aStart(mpVectors->begin());
213cdf0e10cSrcweir 				aStart += nIndex;
214cdf0e10cSrcweir 				SimpleBezierVector::iterator aEnd(aStart);
215cdf0e10cSrcweir 				aEnd += nCount;
216cdf0e10cSrcweir 
217cdf0e10cSrcweir 				for( ; aStart != aEnd; ++aStart )
218cdf0e10cSrcweir 				{
219cdf0e10cSrcweir 					if(aStart->IsBezierNeeded())
220cdf0e10cSrcweir 					{
221cdf0e10cSrcweir 						mnBezierCount++;
222cdf0e10cSrcweir 					}
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 					mpVectors->push_back(*aStart);
225cdf0e10cSrcweir 				}
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 				// maybe vectors are not needed anymore, try to reduce memory footprint
228cdf0e10cSrcweir 				implTryToReduceToPointVector();
229cdf0e10cSrcweir 			}
230cdf0e10cSrcweir 		}
231cdf0e10cSrcweir 	}
232cdf0e10cSrcweir 
~PolygonPointList()233cdf0e10cSrcweir 	~PolygonPointList()
234cdf0e10cSrcweir 	{
235cdf0e10cSrcweir 		if(mpVectors)
236cdf0e10cSrcweir 		{
237cdf0e10cSrcweir 			delete mpVectors;
238cdf0e10cSrcweir 		}
239cdf0e10cSrcweir 	}
240cdf0e10cSrcweir 
isEqual(const PolygonPointList & rPointList) const241cdf0e10cSrcweir 	bool isEqual(const PolygonPointList& rPointList) const
242cdf0e10cSrcweir 	{
243cdf0e10cSrcweir 		// same point count?
244cdf0e10cSrcweir 		if(maPoints.size() != rPointList.maPoints.size())
245cdf0e10cSrcweir 			return false;
246cdf0e10cSrcweir 
247cdf0e10cSrcweir 		// if zero points the polys are equal
248cdf0e10cSrcweir 		if(!maPoints.size())
249cdf0e10cSrcweir 			return true;
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 		// if bezier count used it needs to be equal
252cdf0e10cSrcweir 		if(mnBezierCount != rPointList.mnBezierCount)
253cdf0e10cSrcweir 			return false;
254cdf0e10cSrcweir 
255cdf0e10cSrcweir 		// compare point content
256cdf0e10cSrcweir 		if(maPoints != rPointList.maPoints)
257cdf0e10cSrcweir 			return false;
258cdf0e10cSrcweir 
259cdf0e10cSrcweir 		// beziercounts are equal: if it's zero, we are done
260cdf0e10cSrcweir 		if(!mnBezierCount)
261cdf0e10cSrcweir 			return true;
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 		// beziercounts are equal and not zero; compare them
264cdf0e10cSrcweir 		OSL_ENSURE(0L != mpVectors, "Error: Bezier list needs to exist here(!)");
265cdf0e10cSrcweir 		OSL_ENSURE(0L != rPointList.mpVectors, "Error: Bezier list needs to exist here(!)");
266cdf0e10cSrcweir 
267cdf0e10cSrcweir 		return (*mpVectors == *rPointList.mpVectors);
268cdf0e10cSrcweir 	}
269cdf0e10cSrcweir 
getPoint(sal_uInt32 nIndex) const270cdf0e10cSrcweir 	const Point& getPoint(sal_uInt32 nIndex) const
271cdf0e10cSrcweir 	{
272cdf0e10cSrcweir 		return maPoints[nIndex].getPoint();
273cdf0e10cSrcweir 	}
274cdf0e10cSrcweir 
setPoint(sal_uInt32 nIndex,const Point & rValue)275cdf0e10cSrcweir 	void setPoint(sal_uInt32 nIndex, const Point& rValue)
276cdf0e10cSrcweir 	{
277cdf0e10cSrcweir 		maPoints[nIndex].setPoint(rValue);
278cdf0e10cSrcweir 	}
279cdf0e10cSrcweir 
getBackwardVector(sal_uInt32 nIndex) const280cdf0e10cSrcweir 	const Vector& getBackwardVector(sal_uInt32 nIndex) const
281cdf0e10cSrcweir 	{
282cdf0e10cSrcweir 		if(mpVectors)
283cdf0e10cSrcweir 			return ((*mpVectors)[nIndex]).getBackwardVector();
284cdf0e10cSrcweir 		else
285cdf0e10cSrcweir 			return Vector::getEmptyVector();
286cdf0e10cSrcweir 	}
287cdf0e10cSrcweir 
setBackwardVector(sal_uInt32 nIndex,const Vector & rValue)288cdf0e10cSrcweir 	void setBackwardVector(sal_uInt32 nIndex, const Vector& rValue)
289cdf0e10cSrcweir 	{
290cdf0e10cSrcweir 		if(mpVectors)
291cdf0e10cSrcweir 		{
292cdf0e10cSrcweir 			LocalSimpleBezierEntry& rDest = (*mpVectors)[nIndex];
293cdf0e10cSrcweir 			bool bBezierNeededBefore(rDest.isBezierNeeded());
294cdf0e10cSrcweir 			((*mpVectors)[nIndex]).setBackwardVector(rValue);
295cdf0e10cSrcweir 			bool bBezierNeededAfter(rDest.isBezierNeeded());
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 			if(bBezierNeededBefore != bBezierNeededAfter)
298cdf0e10cSrcweir 			{
299cdf0e10cSrcweir 				if(bBezierNeededAfter)
300cdf0e10cSrcweir 					mnBezierCount++;
301cdf0e10cSrcweir 				else
302cdf0e10cSrcweir 					mnBezierCount--;
303cdf0e10cSrcweir 			}
304cdf0e10cSrcweir 		}
305cdf0e10cSrcweir 		else
306cdf0e10cSrcweir 		{
307cdf0e10cSrcweir 			bool bEmptyVector(rValue == Vector::getEmptyVector());
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 			if(bEmptyVector)
310cdf0e10cSrcweir 				return;
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 			mpVectors = new SimpleBezierVector(maPoints.size());
313cdf0e10cSrcweir 			((*mpVectors)[nIndex]).setBackwardVector(rValue);
314cdf0e10cSrcweir 			mnBezierCount++;
315cdf0e10cSrcweir 		}
316cdf0e10cSrcweir 	}
317cdf0e10cSrcweir 
getForwardVector(sal_uInt32 nIndex) const318cdf0e10cSrcweir 	const Vector& getForwardVector(sal_uInt32 nIndex) const
319cdf0e10cSrcweir 	{
320cdf0e10cSrcweir 		if(mpVectors)
321cdf0e10cSrcweir 			return ((*mpVectors)[nIndex]).getForwardVector();
322cdf0e10cSrcweir 		else
323cdf0e10cSrcweir 			return Vector::getEmptyVector();
324cdf0e10cSrcweir 	}
325cdf0e10cSrcweir 
setForwardVector(sal_uInt32 nIndex,const Vector & rValue)326cdf0e10cSrcweir 	void setForwardVector(sal_uInt32 nIndex, const Vector& rValue)
327cdf0e10cSrcweir 	{
328cdf0e10cSrcweir 		if(mpVectors)
329cdf0e10cSrcweir 		{
330cdf0e10cSrcweir 			LocalSimpleBezierEntry& rDest = (*mpVectors)[nIndex];
331cdf0e10cSrcweir 			bool bBezierNeededBefore(rDest.isBezierNeeded());
332cdf0e10cSrcweir 			((*mpVectors)[nIndex]).setForwardVector(rValue);
333cdf0e10cSrcweir 			bool bBezierNeededAfter(rDest.isBezierNeeded());
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 			if(bBezierNeededBefore != bBezierNeededAfter)
336cdf0e10cSrcweir 			{
337cdf0e10cSrcweir 				if(bBezierNeededAfter)
338cdf0e10cSrcweir 					mnBezierCount++;
339cdf0e10cSrcweir 				else
340cdf0e10cSrcweir 					mnBezierCount--;
341cdf0e10cSrcweir 			}
342cdf0e10cSrcweir 		}
343cdf0e10cSrcweir 		else
344cdf0e10cSrcweir 		{
345cdf0e10cSrcweir 			bool bEmptyVector(rValue == Vector::getEmptyVector());
346cdf0e10cSrcweir 
347cdf0e10cSrcweir 			if(bEmptyVector)
348cdf0e10cSrcweir 				return;
349cdf0e10cSrcweir 
350cdf0e10cSrcweir 			mpVectors = new SimpleBezierVector(maPoints.size());
351cdf0e10cSrcweir 			((*mpVectors)[nIndex]).setForwardVector(rValue);
352cdf0e10cSrcweir 			mnBezierCount++;
353cdf0e10cSrcweir 		}
354cdf0e10cSrcweir 	}
355cdf0e10cSrcweir 
insert(sal_uInt32 nIndex,const Point & rPoint,sal_uInt32 nCount)356cdf0e10cSrcweir 	void insert(sal_uInt32 nIndex, const Point& rPoint, sal_uInt32 nCount)
357cdf0e10cSrcweir 	{
358cdf0e10cSrcweir 		if(nCount)
359cdf0e10cSrcweir 		{
360cdf0e10cSrcweir 			// maybe vectors are not needed anymore, try to reduce memory footprint
361cdf0e10cSrcweir 			implTryToReduceToPointVector();
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 			// add nCount copies of rPoint
364cdf0e10cSrcweir 			{
365cdf0e10cSrcweir 				LocalSimplePointEntry aNode(rPoint);
366cdf0e10cSrcweir 				SimplePointVector::iterator aIndex(maPoints.begin());
367cdf0e10cSrcweir 				aIndex += nIndex;
368cdf0e10cSrcweir 				maPoints.insert(aIndex, nCount, aNode);
369cdf0e10cSrcweir 			}
370cdf0e10cSrcweir 
371cdf0e10cSrcweir 			// add nCount empty entries to keep indices synchronized
372cdf0e10cSrcweir 			if(mpVectors)
373cdf0e10cSrcweir 			{
374cdf0e10cSrcweir 				LocalSimpleBezierEntry aNode;
375cdf0e10cSrcweir 				SimpleBezierVector::iterator aIndex(mpVectors->begin());
376cdf0e10cSrcweir 				aIndex += nIndex;
377cdf0e10cSrcweir 				mpVectors->insert(aIndex, nCount, aNode);
378cdf0e10cSrcweir 			}
379cdf0e10cSrcweir 		}
380cdf0e10cSrcweir 	}
381cdf0e10cSrcweir 
insert(sal_uInt32 nIndex,const PolygonPointList & rSource)382cdf0e10cSrcweir 	void insert(sal_uInt32 nIndex, const PolygonPointList& rSource)
383cdf0e10cSrcweir 	{
384cdf0e10cSrcweir 		const sal_uInt32 nCount(rSource.maPoints.size());
385cdf0e10cSrcweir 
386cdf0e10cSrcweir 		if(nCount)
387cdf0e10cSrcweir 		{
388cdf0e10cSrcweir 			// instert point data
389cdf0e10cSrcweir 			{
390cdf0e10cSrcweir 				SimplePointVector::iterator aIndex(maPoints.begin());
391cdf0e10cSrcweir 				aIndex += nIndex;
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 				SimplePointVector::const_iterator aStart(rSource.maPoints.begin());
394cdf0e10cSrcweir 				SimplePointVector::const_iterator aEnd(rSource.maPoints.end());
395cdf0e10cSrcweir 
396cdf0e10cSrcweir 				maPoints.insert(aIndex, aStart, aEnd);
397cdf0e10cSrcweir 			}
398cdf0e10cSrcweir 
399cdf0e10cSrcweir 			// insert bezier data
400cdf0e10cSrcweir 			if(rSource.mpVectors && rSource.mnBezierCount)
401cdf0e10cSrcweir 			{
402cdf0e10cSrcweir 				SimpleBezierVector::iterator aIndex(mpVectors->begin());
403cdf0e10cSrcweir 				aIndex += nIndex;
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 				SimpleBezierVector::iterator aStart(rSource.mpVectors->begin());
406cdf0e10cSrcweir 				SimpleBezierVector::iterator aEnd(rSource.mpVectors->end());
407cdf0e10cSrcweir 
408cdf0e10cSrcweir 				if(!mpVectors)
409cdf0e10cSrcweir 				{
410cdf0e10cSrcweir 					mpVectors = new SimpleBezierVector(maPoints.size() - nCount);
411cdf0e10cSrcweir 				}
412cdf0e10cSrcweir 
413cdf0e10cSrcweir 				mpVectors->insert(aIndex, aStart, aEnd);
414cdf0e10cSrcweir 
415cdf0e10cSrcweir 				mnBezierCount += rSource.mnBezierCount;
416cdf0e10cSrcweir 			}
417cdf0e10cSrcweir 			else
418cdf0e10cSrcweir 			{
419cdf0e10cSrcweir 				// maybe vectors are not needed anymore, try to reduce memory footprint
420cdf0e10cSrcweir 				implTryToReduceToPointVector();
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 				// add nCount empty entries to keep indices synchronized
423cdf0e10cSrcweir 				if(mpVectors)
424cdf0e10cSrcweir 				{
425cdf0e10cSrcweir 					LocalSimpleBezierEntry aNode;
426cdf0e10cSrcweir 					SimpleBezierVector::iterator aIndex(mpVectors->begin());
427cdf0e10cSrcweir 					aIndex += nIndex;
428cdf0e10cSrcweir 					mpVectors->insert(aIndex, nCount, aNode);
429cdf0e10cSrcweir 				}
430cdf0e10cSrcweir 			}
431cdf0e10cSrcweir 		}
432cdf0e10cSrcweir 	}
433cdf0e10cSrcweir 
remove(sal_uInt32 nIndex,sal_uInt32 nCount)434cdf0e10cSrcweir 	void remove(sal_uInt32 nIndex, sal_uInt32 nCount)
435cdf0e10cSrcweir 	{
436cdf0e10cSrcweir 		if(nCount)
437cdf0e10cSrcweir 		{
438cdf0e10cSrcweir 			// maybe vectors are not needed anymore, try to reduce memory footprint
439cdf0e10cSrcweir 			implTryToReduceToPointVector();
440cdf0e10cSrcweir 
441cdf0e10cSrcweir 			// remove point data
442cdf0e10cSrcweir 			{
443cdf0e10cSrcweir 				SimplePointVector::iterator aStart(maPoints.begin());
444cdf0e10cSrcweir 				aStart += nIndex;
445cdf0e10cSrcweir 				const SimplePointVector::iterator aEnd(aStart + nCount);
446cdf0e10cSrcweir 
447cdf0e10cSrcweir 				maPoints.erase(aStart, aEnd);
448cdf0e10cSrcweir 			}
449cdf0e10cSrcweir 
450cdf0e10cSrcweir 			// remove bezier data
451cdf0e10cSrcweir 			if(mpVectors)
452cdf0e10cSrcweir 			{
453cdf0e10cSrcweir 				SimpleBezierVector::iterator aStart(mpVectors->begin());
454cdf0e10cSrcweir 				aStart += nIndex;
455cdf0e10cSrcweir 				const SimpleBezierVector::iterator aEnd(aStart + nCount);
456cdf0e10cSrcweir 
457cdf0e10cSrcweir 				// take care for correct mnBezierCount BEFORE erase
458cdf0e10cSrcweir 				if(mnBezierCount)
459cdf0e10cSrcweir 				{
460cdf0e10cSrcweir 					SimpleBezierVector::iterator aTestIter(aStart);
461cdf0e10cSrcweir 
462cdf0e10cSrcweir 					for( ; mnBezierCount && aTestIter != aEnd; ++aTestIter)
463cdf0e10cSrcweir 					{
464cdf0e10cSrcweir 						if(aTestIter->isBezierNeeded())
465cdf0e10cSrcweir 							mnBezierCount--;
466cdf0e10cSrcweir 					}
467cdf0e10cSrcweir 				}
468cdf0e10cSrcweir 
469cdf0e10cSrcweir 				if(mnBezierCount)
470cdf0e10cSrcweir 				{
471cdf0e10cSrcweir 					// erase nodes
472cdf0e10cSrcweir 					mpVectors->erase(aStart, aEnd);
473cdf0e10cSrcweir 				}
474cdf0e10cSrcweir 				else
475cdf0e10cSrcweir 				{
476cdf0e10cSrcweir 					// try to reduce, maybe 0L == mnBezierCount
477cdf0e10cSrcweir 					implTryToReduceToPointVector();
478cdf0e10cSrcweir 				}
479cdf0e10cSrcweir 			}
480cdf0e10cSrcweir 		}
481cdf0e10cSrcweir 	}
482cdf0e10cSrcweir 
flip()483cdf0e10cSrcweir 	void flip()
484cdf0e10cSrcweir 	{
485cdf0e10cSrcweir 		if(maPoints.size() > 1)
486cdf0e10cSrcweir 		{
487cdf0e10cSrcweir 			// maybe vectors are not needed anymore, try to reduce memory footprint
488cdf0e10cSrcweir 			implTryToReduceToPointVector();
489cdf0e10cSrcweir 
490cdf0e10cSrcweir 			// calculate half size
491cdf0e10cSrcweir 			const sal_uInt32 nHalfSize(maPoints.size() >> 1L);
492cdf0e10cSrcweir 
493cdf0e10cSrcweir 			// flip point data
494cdf0e10cSrcweir 			{
495cdf0e10cSrcweir 				SimplePointVector::iterator aStart(maPoints.begin());
496cdf0e10cSrcweir 				SimplePointVector::iterator aEnd(maPoints.end());
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 				for(sal_uInt32 a(0); a < nHalfSize; a++)
499cdf0e10cSrcweir 				{
500cdf0e10cSrcweir 					LocalSimplePointEntry aTemp = *aStart;
501cdf0e10cSrcweir 					*aStart++ = *aEnd;
502cdf0e10cSrcweir 					*aEnd-- = aTemp;
503cdf0e10cSrcweir 				}
504cdf0e10cSrcweir 			}
505cdf0e10cSrcweir 
506cdf0e10cSrcweir 			// flip bezier data
507cdf0e10cSrcweir 			if(mpVectors)
508cdf0e10cSrcweir 			{
509cdf0e10cSrcweir 				SimpleBezierVector::iterator aStart(mpVectors->begin());
510cdf0e10cSrcweir 				SimpleBezierVector::iterator aEnd(mpVectors->end());
511cdf0e10cSrcweir 
512cdf0e10cSrcweir 				for(sal_uInt32 a(0); a < nHalfSize; a++)
513cdf0e10cSrcweir 				{
514cdf0e10cSrcweir 					LocalSimpleBezierEntry aTemp = *aStart;
515cdf0e10cSrcweir 					aTemp.doInvertForFlip();
516cdf0e10cSrcweir 					*aStart = *aEnd;
517cdf0e10cSrcweir 					aStart->doInvertForFlip();
518cdf0e10cSrcweir 					aStart++;
519cdf0e10cSrcweir 					*aEnd-- = aTemp;
520cdf0e10cSrcweir 				}
521cdf0e10cSrcweir 
522cdf0e10cSrcweir 				// also flip vectors of middle point (if existing)
523cdf0e10cSrcweir 				if(maPoints.size() % 2)
524cdf0e10cSrcweir 				{
525cdf0e10cSrcweir 					(*mpVectors)[nHalfSize].doInvertForFlip();
526cdf0e10cSrcweir 				}
527cdf0e10cSrcweir 			}
528cdf0e10cSrcweir 		}
529cdf0e10cSrcweir 	}
530cdf0e10cSrcweir };
531cdf0e10cSrcweir 
532cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
533cdf0e10cSrcweir 
534cdf0e10cSrcweir #endif _POLYGON_POINT_HXX
535