xref: /aoo41x/main/vcl/source/gdi/lineinfo.cxx (revision 5aaf853b)
19f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
39f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
49f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
59f62ea84SAndrew Rist  * distributed with this work for additional information
69f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
79f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
89f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
99f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
109f62ea84SAndrew Rist  *
119f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
129f62ea84SAndrew Rist  *
139f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
149f62ea84SAndrew Rist  * software distributed under the License is distributed on an
159f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
179f62ea84SAndrew Rist  * specific language governing permissions and limitations
189f62ea84SAndrew Rist  * under the License.
199f62ea84SAndrew Rist  *
209f62ea84SAndrew Rist  *************************************************************/
219f62ea84SAndrew Rist 
229f62ea84SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir #include <tools/stream.hxx>
27cdf0e10cSrcweir #include <tools/vcompat.hxx>
28cdf0e10cSrcweir #include <tools/debug.hxx>
29cdf0e10cSrcweir #include <vcl/lineinfo.hxx>
30cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygon.hxx>
31cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx>
32cdf0e10cSrcweir #include <basegfx/polygon/b2dlinegeometry.hxx>
33cdf0e10cSrcweir #include <numeric>
34cdf0e10cSrcweir 
DBG_NAME(LineInfo)35cdf0e10cSrcweir DBG_NAME( LineInfo )
36cdf0e10cSrcweir 
37cdf0e10cSrcweir // ----------------
38cdf0e10cSrcweir // - ImplLineInfo -
39cdf0e10cSrcweir // ----------------
40cdf0e10cSrcweir 
41cdf0e10cSrcweir ImplLineInfo::ImplLineInfo() :
42cdf0e10cSrcweir     mnRefCount	( 1 ),
43cdf0e10cSrcweir     meStyle		( LINE_SOLID ),
44cdf0e10cSrcweir 	mnWidth		( 0 ),
45cdf0e10cSrcweir 	mnDashCount	( 0 ),
46cdf0e10cSrcweir 	mnDashLen	( 0 ),
47cdf0e10cSrcweir 	mnDotCount	( 0 ),
48cdf0e10cSrcweir 	mnDotLen	( 0 ),
49cdf0e10cSrcweir 	mnDistance	( 0 ),
50*5aaf853bSArmin Le Grand     meLineJoin  ( basegfx::B2DLINEJOIN_ROUND ),
51*5aaf853bSArmin Le Grand     meLineCap   ( com::sun::star::drawing::LineCap_BUTT )
52cdf0e10cSrcweir {
53cdf0e10cSrcweir }
54cdf0e10cSrcweir 
55cdf0e10cSrcweir // -----------------------------------------------------------------------
56cdf0e10cSrcweir 
ImplLineInfo(const ImplLineInfo & rImplLineInfo)57cdf0e10cSrcweir ImplLineInfo::ImplLineInfo( const ImplLineInfo& rImplLineInfo ) :
58cdf0e10cSrcweir 	mnRefCount	( 1 ),
59cdf0e10cSrcweir     meStyle		( rImplLineInfo.meStyle ),
60cdf0e10cSrcweir 	mnWidth		( rImplLineInfo.mnWidth ),
61cdf0e10cSrcweir 	mnDashCount	( rImplLineInfo.mnDashCount	),
62cdf0e10cSrcweir 	mnDashLen	( rImplLineInfo.mnDashLen ),
63cdf0e10cSrcweir 	mnDotCount	( rImplLineInfo.mnDotCount ),
64cdf0e10cSrcweir 	mnDotLen	( rImplLineInfo.mnDotLen ),
65cdf0e10cSrcweir 	mnDistance	( rImplLineInfo.mnDistance ),
66*5aaf853bSArmin Le Grand     meLineJoin  ( rImplLineInfo.meLineJoin ),
67*5aaf853bSArmin Le Grand     meLineCap   ( rImplLineInfo.meLineCap )
68cdf0e10cSrcweir {
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
71cdf0e10cSrcweir // -----------------------------------------------------------------------
72cdf0e10cSrcweir 
operator ==(const ImplLineInfo & rB) const73cdf0e10cSrcweir inline bool ImplLineInfo::operator==( const ImplLineInfo& rB ) const
74cdf0e10cSrcweir {
75cdf0e10cSrcweir 	return(meStyle == rB.meStyle
76cdf0e10cSrcweir 		&& mnWidth == rB.mnWidth
77cdf0e10cSrcweir 		&& mnDashCount == rB.mnDashCount
78cdf0e10cSrcweir 		&& mnDashLen == rB.mnDashLen
79cdf0e10cSrcweir 		&& mnDotCount == rB.mnDotCount
80cdf0e10cSrcweir 		&& mnDotLen == rB.mnDotLen
81cdf0e10cSrcweir 		&& mnDistance == rB.mnDistance
82*5aaf853bSArmin Le Grand 		&& meLineJoin == rB.meLineJoin
83*5aaf853bSArmin Le Grand         && meLineCap == rB.meLineCap);
84cdf0e10cSrcweir }
85cdf0e10cSrcweir 
86cdf0e10cSrcweir // ------------
87cdf0e10cSrcweir // - LineInfo -
88cdf0e10cSrcweir // ------------
89cdf0e10cSrcweir 
LineInfo(LineStyle eStyle,long nWidth)90cdf0e10cSrcweir LineInfo::LineInfo( LineStyle eStyle, long nWidth )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     DBG_CTOR( LineInfo, NULL );
93cdf0e10cSrcweir     mpImplLineInfo = new ImplLineInfo;
94cdf0e10cSrcweir     mpImplLineInfo->meStyle = eStyle;
95cdf0e10cSrcweir     mpImplLineInfo->mnWidth = nWidth;
96cdf0e10cSrcweir }
97cdf0e10cSrcweir 
98cdf0e10cSrcweir // -----------------------------------------------------------------------
99cdf0e10cSrcweir 
LineInfo(const LineInfo & rLineInfo)100cdf0e10cSrcweir LineInfo::LineInfo( const LineInfo& rLineInfo )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir     DBG_CTOR( LineInfo, NULL );
103cdf0e10cSrcweir     DBG_CHKOBJ( &rLineInfo, LineInfo, NULL );
104cdf0e10cSrcweir     mpImplLineInfo = rLineInfo.mpImplLineInfo;
105cdf0e10cSrcweir     mpImplLineInfo->mnRefCount++;
106cdf0e10cSrcweir }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir // -----------------------------------------------------------------------
109cdf0e10cSrcweir 
~LineInfo()110cdf0e10cSrcweir LineInfo::~LineInfo()
111cdf0e10cSrcweir {
112cdf0e10cSrcweir     DBG_DTOR( LineInfo, NULL );
113cdf0e10cSrcweir     if( !( --mpImplLineInfo->mnRefCount ) )
114cdf0e10cSrcweir         delete mpImplLineInfo;
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir // -----------------------------------------------------------------------
118cdf0e10cSrcweir 
operator =(const LineInfo & rLineInfo)119cdf0e10cSrcweir LineInfo& LineInfo::operator=( const LineInfo& rLineInfo )
120cdf0e10cSrcweir {
121cdf0e10cSrcweir     DBG_CHKTHIS( LineInfo, NULL );
122cdf0e10cSrcweir     DBG_CHKOBJ( &rLineInfo, LineInfo, NULL );
123cdf0e10cSrcweir 
124cdf0e10cSrcweir     rLineInfo.mpImplLineInfo->mnRefCount++;
125cdf0e10cSrcweir 
126cdf0e10cSrcweir     if( !( --mpImplLineInfo->mnRefCount ) )
127cdf0e10cSrcweir         delete mpImplLineInfo;
128cdf0e10cSrcweir 
129cdf0e10cSrcweir 	mpImplLineInfo = rLineInfo.mpImplLineInfo;
130cdf0e10cSrcweir     return *this;
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
133cdf0e10cSrcweir // -----------------------------------------------------------------------
134cdf0e10cSrcweir 
operator ==(const LineInfo & rLineInfo) const135cdf0e10cSrcweir sal_Bool LineInfo::operator==( const LineInfo& rLineInfo ) const
136cdf0e10cSrcweir {
137cdf0e10cSrcweir     DBG_CHKTHIS( LineInfo, NULL );
138cdf0e10cSrcweir     DBG_CHKOBJ( &rLineInfo, LineInfo, NULL );
139cdf0e10cSrcweir 
140cdf0e10cSrcweir     return( mpImplLineInfo == rLineInfo.mpImplLineInfo ||
141cdf0e10cSrcweir            *mpImplLineInfo == *rLineInfo.mpImplLineInfo );
142cdf0e10cSrcweir }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir // -----------------------------------------------------------------------
145cdf0e10cSrcweir 
ImplMakeUnique()146cdf0e10cSrcweir void LineInfo::ImplMakeUnique()
147cdf0e10cSrcweir {
148cdf0e10cSrcweir     if( mpImplLineInfo->mnRefCount != 1 )
149cdf0e10cSrcweir 	{
150cdf0e10cSrcweir 		if( mpImplLineInfo->mnRefCount )
151cdf0e10cSrcweir 			mpImplLineInfo->mnRefCount--;
152cdf0e10cSrcweir 
153cdf0e10cSrcweir         mpImplLineInfo = new ImplLineInfo( *mpImplLineInfo );
154cdf0e10cSrcweir 	}
155cdf0e10cSrcweir }
156cdf0e10cSrcweir 
157cdf0e10cSrcweir // -----------------------------------------------------------------------
158cdf0e10cSrcweir 
SetStyle(LineStyle eStyle)159cdf0e10cSrcweir void LineInfo::SetStyle( LineStyle eStyle )
160cdf0e10cSrcweir {
161cdf0e10cSrcweir     DBG_CHKTHIS( LineInfo, NULL );
162cdf0e10cSrcweir     ImplMakeUnique();
163cdf0e10cSrcweir     mpImplLineInfo->meStyle = eStyle;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir // -----------------------------------------------------------------------
167cdf0e10cSrcweir 
SetWidth(long nWidth)168cdf0e10cSrcweir void LineInfo::SetWidth( long nWidth )
169cdf0e10cSrcweir {
170cdf0e10cSrcweir     DBG_CHKTHIS( LineInfo, NULL );
171cdf0e10cSrcweir     ImplMakeUnique();
172cdf0e10cSrcweir     mpImplLineInfo->mnWidth = nWidth;
173cdf0e10cSrcweir }
174cdf0e10cSrcweir 
175cdf0e10cSrcweir // -----------------------------------------------------------------------
176cdf0e10cSrcweir 
SetDashCount(sal_uInt16 nDashCount)177cdf0e10cSrcweir void LineInfo::SetDashCount( sal_uInt16 nDashCount )
178cdf0e10cSrcweir {
179cdf0e10cSrcweir 	DBG_CHKTHIS( LineInfo, NULL );
180cdf0e10cSrcweir 	ImplMakeUnique();
181cdf0e10cSrcweir 	mpImplLineInfo->mnDashCount = nDashCount;
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir // -----------------------------------------------------------------------
185cdf0e10cSrcweir 
SetDashLen(long nDashLen)186cdf0e10cSrcweir void LineInfo::SetDashLen( long nDashLen )
187cdf0e10cSrcweir {
188cdf0e10cSrcweir 	DBG_CHKTHIS( LineInfo, NULL );
189cdf0e10cSrcweir 	ImplMakeUnique();
190cdf0e10cSrcweir 	mpImplLineInfo->mnDashLen = nDashLen;
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
193cdf0e10cSrcweir // -----------------------------------------------------------------------
194cdf0e10cSrcweir 
SetDotCount(sal_uInt16 nDotCount)195cdf0e10cSrcweir void LineInfo::SetDotCount( sal_uInt16 nDotCount )
196cdf0e10cSrcweir {
197cdf0e10cSrcweir 	DBG_CHKTHIS( LineInfo, NULL );
198cdf0e10cSrcweir 	ImplMakeUnique();
199cdf0e10cSrcweir 	mpImplLineInfo->mnDotCount = nDotCount;
200cdf0e10cSrcweir }
201cdf0e10cSrcweir 
202cdf0e10cSrcweir // -----------------------------------------------------------------------
203cdf0e10cSrcweir 
SetDotLen(long nDotLen)204cdf0e10cSrcweir void LineInfo::SetDotLen( long nDotLen )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir 	DBG_CHKTHIS( LineInfo, NULL );
207cdf0e10cSrcweir 	ImplMakeUnique();
208cdf0e10cSrcweir 	mpImplLineInfo->mnDotLen = nDotLen;
209cdf0e10cSrcweir }
210cdf0e10cSrcweir 
211cdf0e10cSrcweir // -----------------------------------------------------------------------
212cdf0e10cSrcweir 
SetDistance(long nDistance)213cdf0e10cSrcweir void LineInfo::SetDistance( long nDistance )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir 	DBG_CHKTHIS( LineInfo, NULL );
216cdf0e10cSrcweir 	ImplMakeUnique();
217cdf0e10cSrcweir 	mpImplLineInfo->mnDistance = nDistance;
218cdf0e10cSrcweir }
219cdf0e10cSrcweir 
220cdf0e10cSrcweir // -----------------------------------------------------------------------
221cdf0e10cSrcweir 
SetLineJoin(basegfx::B2DLineJoin eLineJoin)222cdf0e10cSrcweir void LineInfo::SetLineJoin(basegfx::B2DLineJoin eLineJoin)
223cdf0e10cSrcweir {
224cdf0e10cSrcweir 	DBG_CHKTHIS( LineInfo, NULL );
225cdf0e10cSrcweir 
226cdf0e10cSrcweir     if(eLineJoin != mpImplLineInfo->meLineJoin)
227cdf0e10cSrcweir     {
228cdf0e10cSrcweir     	ImplMakeUnique();
229cdf0e10cSrcweir         mpImplLineInfo->meLineJoin = eLineJoin;
230cdf0e10cSrcweir     }
231cdf0e10cSrcweir }
232cdf0e10cSrcweir 
233cdf0e10cSrcweir // -----------------------------------------------------------------------
234cdf0e10cSrcweir 
SetLineCap(com::sun::star::drawing::LineCap eLineCap)235*5aaf853bSArmin Le Grand void LineInfo::SetLineCap(com::sun::star::drawing::LineCap eLineCap)
236*5aaf853bSArmin Le Grand {
237*5aaf853bSArmin Le Grand     DBG_CHKTHIS( LineInfo, NULL );
238*5aaf853bSArmin Le Grand 
239*5aaf853bSArmin Le Grand     if(eLineCap != mpImplLineInfo->meLineCap)
240*5aaf853bSArmin Le Grand     {
241*5aaf853bSArmin Le Grand         ImplMakeUnique();
242*5aaf853bSArmin Le Grand         mpImplLineInfo->meLineCap = eLineCap;
243*5aaf853bSArmin Le Grand     }
244*5aaf853bSArmin Le Grand }
245*5aaf853bSArmin Le Grand 
246*5aaf853bSArmin Le Grand // -----------------------------------------------------------------------
247*5aaf853bSArmin Le Grand 
IsDefault() const248*5aaf853bSArmin Le Grand sal_Bool LineInfo::IsDefault() const
249*5aaf853bSArmin Le Grand {
250*5aaf853bSArmin Le Grand     return( !mpImplLineInfo->mnWidth
251*5aaf853bSArmin Le Grand         && ( LINE_SOLID == mpImplLineInfo->meStyle )
252*5aaf853bSArmin Le Grand         && ( com::sun::star::drawing::LineCap_BUTT == mpImplLineInfo->meLineCap));
253*5aaf853bSArmin Le Grand }
254*5aaf853bSArmin Le Grand 
255*5aaf853bSArmin Le Grand // -----------------------------------------------------------------------
256*5aaf853bSArmin Le Grand 
operator >>(SvStream & rIStm,ImplLineInfo & rImplLineInfo)257cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStm, ImplLineInfo& rImplLineInfo )
258cdf0e10cSrcweir {
259cdf0e10cSrcweir     VersionCompat	aCompat( rIStm, STREAM_READ );
260cdf0e10cSrcweir     sal_uInt16			nTmp16;
261cdf0e10cSrcweir 
262cdf0e10cSrcweir     rIStm >> nTmp16; rImplLineInfo.meStyle = (LineStyle) nTmp16;
263cdf0e10cSrcweir     rIStm >> rImplLineInfo.mnWidth;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 	if( aCompat.GetVersion() >= 2 )
266cdf0e10cSrcweir 	{
267cdf0e10cSrcweir 		// version 2
268cdf0e10cSrcweir 		rIStm >> rImplLineInfo.mnDashCount >> rImplLineInfo.mnDashLen;
269cdf0e10cSrcweir 		rIStm >> rImplLineInfo.mnDotCount >> rImplLineInfo.mnDotLen;
270cdf0e10cSrcweir 		rIStm >> rImplLineInfo.mnDistance;
271cdf0e10cSrcweir 	}
272cdf0e10cSrcweir 
273cdf0e10cSrcweir 	if( aCompat.GetVersion() >= 3 )
274cdf0e10cSrcweir 	{
275cdf0e10cSrcweir 		// version 3
276cdf0e10cSrcweir         rIStm >> nTmp16; rImplLineInfo.meLineJoin = (basegfx::B2DLineJoin) nTmp16;
277cdf0e10cSrcweir     }
278cdf0e10cSrcweir 
279*5aaf853bSArmin Le Grand     if( aCompat.GetVersion() >= 4 )
280*5aaf853bSArmin Le Grand     {
281*5aaf853bSArmin Le Grand         // version 4
282*5aaf853bSArmin Le Grand         rIStm >> nTmp16; rImplLineInfo.meLineCap = (com::sun::star::drawing::LineCap) nTmp16;
283*5aaf853bSArmin Le Grand     }
284*5aaf853bSArmin Le Grand 
285cdf0e10cSrcweir     return rIStm;
286cdf0e10cSrcweir }
287cdf0e10cSrcweir 
288cdf0e10cSrcweir // -----------------------------------------------------------------------
289cdf0e10cSrcweir 
operator <<(SvStream & rOStm,const ImplLineInfo & rImplLineInfo)290cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStm, const ImplLineInfo& rImplLineInfo )
291cdf0e10cSrcweir {
292*5aaf853bSArmin Le Grand     VersionCompat aCompat( rOStm, STREAM_WRITE, 4 );
293cdf0e10cSrcweir 
294cdf0e10cSrcweir     // version 1
295cdf0e10cSrcweir 	rOStm << (sal_uInt16) rImplLineInfo.meStyle << rImplLineInfo.mnWidth;
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 	// since version2
298cdf0e10cSrcweir 	rOStm << rImplLineInfo.mnDashCount << rImplLineInfo.mnDashLen;
299cdf0e10cSrcweir 	rOStm << rImplLineInfo.mnDotCount << rImplLineInfo.mnDotLen;
300cdf0e10cSrcweir 	rOStm << rImplLineInfo.mnDistance;
301cdf0e10cSrcweir 
302cdf0e10cSrcweir 	// since version3
303cdf0e10cSrcweir 	rOStm << (sal_uInt16) rImplLineInfo.meLineJoin;
304cdf0e10cSrcweir 
305*5aaf853bSArmin Le Grand     // since version4
306*5aaf853bSArmin Le Grand     rOStm << (sal_uInt16) rImplLineInfo.meLineCap;
307*5aaf853bSArmin Le Grand 
308cdf0e10cSrcweir     return rOStm;
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir // -----------------------------------------------------------------------
312cdf0e10cSrcweir 
operator >>(SvStream & rIStm,LineInfo & rLineInfo)313cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStm, LineInfo& rLineInfo )
314cdf0e10cSrcweir {
315cdf0e10cSrcweir     rLineInfo.ImplMakeUnique();
316cdf0e10cSrcweir     return( rIStm >> *rLineInfo.mpImplLineInfo );
317cdf0e10cSrcweir }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir // -----------------------------------------------------------------------
320cdf0e10cSrcweir 
operator <<(SvStream & rOStm,const LineInfo & rLineInfo)321cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStm, const LineInfo& rLineInfo )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir     return( rOStm << *rLineInfo.mpImplLineInfo );
324cdf0e10cSrcweir }
325cdf0e10cSrcweir 
326cdf0e10cSrcweir // -----------------------------------------------------------------------
327cdf0e10cSrcweir 
isDashDotOrFatLineUsed() const328cdf0e10cSrcweir bool LineInfo::isDashDotOrFatLineUsed() const
329cdf0e10cSrcweir {
330cdf0e10cSrcweir 	return (LINE_DASH == GetStyle() || GetWidth() > 1);
331cdf0e10cSrcweir }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir // -----------------------------------------------------------------------
334cdf0e10cSrcweir 
applyToB2DPolyPolygon(basegfx::B2DPolyPolygon & io_rLinePolyPolygon,basegfx::B2DPolyPolygon & o_rFillPolyPolygon) const335cdf0e10cSrcweir void LineInfo::applyToB2DPolyPolygon(
336cdf0e10cSrcweir 	basegfx::B2DPolyPolygon& io_rLinePolyPolygon,
337cdf0e10cSrcweir 	basegfx::B2DPolyPolygon& o_rFillPolyPolygon) const
338cdf0e10cSrcweir {
339cdf0e10cSrcweir 	o_rFillPolyPolygon.clear();
340cdf0e10cSrcweir 
341cdf0e10cSrcweir 	if(io_rLinePolyPolygon.count())
342cdf0e10cSrcweir 	{
343cdf0e10cSrcweir 		if(LINE_DASH == GetStyle())
344cdf0e10cSrcweir 		{
345cdf0e10cSrcweir 			::std::vector< double > fDotDashArray;
346cdf0e10cSrcweir 			const double fDashLen(GetDashLen());
347cdf0e10cSrcweir 			const double fDotLen(GetDotLen());
348cdf0e10cSrcweir 			const double fDistance(GetDistance());
349cdf0e10cSrcweir 
350cdf0e10cSrcweir 			for(sal_uInt16 a(0); a < GetDashCount(); a++)
351cdf0e10cSrcweir 			{
352cdf0e10cSrcweir 				fDotDashArray.push_back(fDashLen);
353cdf0e10cSrcweir 				fDotDashArray.push_back(fDistance);
354cdf0e10cSrcweir 			}
355cdf0e10cSrcweir 
356cdf0e10cSrcweir 			for(sal_uInt16 b(0); b < GetDotCount(); b++)
357cdf0e10cSrcweir 			{
358cdf0e10cSrcweir 				fDotDashArray.push_back(fDotLen);
359cdf0e10cSrcweir 				fDotDashArray.push_back(fDistance);
360cdf0e10cSrcweir 			}
361cdf0e10cSrcweir 
362cdf0e10cSrcweir 			const double fAccumulated(::std::accumulate(fDotDashArray.begin(), fDotDashArray.end(), 0.0));
363cdf0e10cSrcweir 
364cdf0e10cSrcweir 			if(fAccumulated > 0.0)
365cdf0e10cSrcweir 			{
366cdf0e10cSrcweir 				basegfx::B2DPolyPolygon aResult;
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 				for(sal_uInt32 c(0); c < io_rLinePolyPolygon.count(); c++)
369cdf0e10cSrcweir 				{
370cdf0e10cSrcweir 					basegfx::B2DPolyPolygon aLineTraget;
371cdf0e10cSrcweir 					basegfx::tools::applyLineDashing(
372cdf0e10cSrcweir 						io_rLinePolyPolygon.getB2DPolygon(c),
373cdf0e10cSrcweir 						fDotDashArray,
374cdf0e10cSrcweir 						&aLineTraget);
375cdf0e10cSrcweir 					aResult.append(aLineTraget);
376cdf0e10cSrcweir 				}
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 				io_rLinePolyPolygon = aResult;
379cdf0e10cSrcweir 			}
380cdf0e10cSrcweir 		}
381cdf0e10cSrcweir 
382cdf0e10cSrcweir 		if(GetWidth() > 1 && io_rLinePolyPolygon.count())
383cdf0e10cSrcweir 		{
384cdf0e10cSrcweir 			const double fHalfLineWidth((GetWidth() * 0.5) + 0.5);
385cdf0e10cSrcweir 
386cdf0e10cSrcweir 			for(sal_uInt32 a(0); a < io_rLinePolyPolygon.count(); a++)
387cdf0e10cSrcweir 			{
388cdf0e10cSrcweir 				o_rFillPolyPolygon.append(basegfx::tools::createAreaGeometry(
389cdf0e10cSrcweir 					io_rLinePolyPolygon.getB2DPolygon(a),
390cdf0e10cSrcweir 					fHalfLineWidth,
391*5aaf853bSArmin Le Grand 					GetLineJoin(),
392*5aaf853bSArmin Le Grand                     GetLineCap()));
393cdf0e10cSrcweir 			}
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 			io_rLinePolyPolygon.clear();
396cdf0e10cSrcweir 		}
397cdf0e10cSrcweir 	}
398cdf0e10cSrcweir }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir // -----------------------------------------------------------------------
401