1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_drawinglayer.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
28*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygontools.hxx>
29*b1cdbd2cSJim Jagielski #include <basegfx/tools/canvastools.hxx>
30*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/fillgradientprimitive2d.hxx>
31*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/maskprimitive2d.hxx>
32*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/fillhatchprimitive2d.hxx>
33*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
34*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/fillgraphicprimitive2d.hxx>
35*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
36*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
37*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrixtools.hxx>
38*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx>
39*b1cdbd2cSJim Jagielski #include <drawinglayer/geometry/viewinformation2d.hxx>
40*b1cdbd2cSJim Jagielski #include <vcl/graph.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski using namespace com::sun::star;
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski namespace drawinglayer
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski 	namespace primitive2d
51*b1cdbd2cSJim Jagielski 	{
create2DDecomposition(const geometry::ViewInformation2D &) const52*b1cdbd2cSJim Jagielski 		Primitive2DSequence PolyPolygonHairlinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
53*b1cdbd2cSJim Jagielski 		{
54*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
55*b1cdbd2cSJim Jagielski 			const sal_uInt32 nCount(aPolyPolygon.count());
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski 			if(nCount)
58*b1cdbd2cSJim Jagielski 			{
59*b1cdbd2cSJim Jagielski 				Primitive2DSequence aRetval(nCount);
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 				for(sal_uInt32 a(0L); a < nCount; a++)
62*b1cdbd2cSJim Jagielski 				{
63*b1cdbd2cSJim Jagielski 					aRetval[a] = Primitive2DReference(new PolygonHairlinePrimitive2D(aPolyPolygon.getB2DPolygon(a), getBColor()));
64*b1cdbd2cSJim Jagielski 				}
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski 				return aRetval;
67*b1cdbd2cSJim Jagielski 			}
68*b1cdbd2cSJim Jagielski 			else
69*b1cdbd2cSJim Jagielski 			{
70*b1cdbd2cSJim Jagielski 				return Primitive2DSequence();
71*b1cdbd2cSJim Jagielski 			}
72*b1cdbd2cSJim Jagielski 		}
73*b1cdbd2cSJim Jagielski 
PolyPolygonHairlinePrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const basegfx::BColor & rBColor)74*b1cdbd2cSJim Jagielski 		PolyPolygonHairlinePrimitive2D::PolyPolygonHairlinePrimitive2D(const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::BColor& rBColor)
75*b1cdbd2cSJim Jagielski 		:	BufferedDecompositionPrimitive2D(),
76*b1cdbd2cSJim Jagielski 			maPolyPolygon(rPolyPolygon),
77*b1cdbd2cSJim Jagielski 			maBColor(rBColor)
78*b1cdbd2cSJim Jagielski 		{
79*b1cdbd2cSJim Jagielski 		}
80*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const81*b1cdbd2cSJim Jagielski 		bool PolyPolygonHairlinePrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
82*b1cdbd2cSJim Jagielski 		{
83*b1cdbd2cSJim Jagielski 			if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
84*b1cdbd2cSJim Jagielski 			{
85*b1cdbd2cSJim Jagielski 				const PolyPolygonHairlinePrimitive2D& rCompare = (PolyPolygonHairlinePrimitive2D&)rPrimitive;
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 				return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
88*b1cdbd2cSJim Jagielski 					&& getBColor() == rCompare.getBColor());
89*b1cdbd2cSJim Jagielski 			}
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 			return false;
92*b1cdbd2cSJim Jagielski 		}
93*b1cdbd2cSJim Jagielski 
getB2DRange(const geometry::ViewInformation2D &) const94*b1cdbd2cSJim Jagielski 		basegfx::B2DRange PolyPolygonHairlinePrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
95*b1cdbd2cSJim Jagielski 		{
96*b1cdbd2cSJim Jagielski 			// return range
97*b1cdbd2cSJim Jagielski 			return basegfx::tools::getRange(getB2DPolyPolygon());
98*b1cdbd2cSJim Jagielski 		}
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 		// provide unique ID
101*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(PolyPolygonHairlinePrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONHAIRLINEPRIMITIVE2D)
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
104*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski namespace drawinglayer
109*b1cdbd2cSJim Jagielski {
110*b1cdbd2cSJim Jagielski 	namespace primitive2d
111*b1cdbd2cSJim Jagielski 	{
create2DDecomposition(const geometry::ViewInformation2D &) const112*b1cdbd2cSJim Jagielski 		Primitive2DSequence PolyPolygonMarkerPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
113*b1cdbd2cSJim Jagielski 		{
114*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
115*b1cdbd2cSJim Jagielski 			const sal_uInt32 nCount(aPolyPolygon.count());
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 			if(nCount)
118*b1cdbd2cSJim Jagielski 			{
119*b1cdbd2cSJim Jagielski 				Primitive2DSequence aRetval(nCount);
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 				for(sal_uInt32 a(0L); a < nCount; a++)
122*b1cdbd2cSJim Jagielski 				{
123*b1cdbd2cSJim Jagielski 					aRetval[a] = Primitive2DReference(
124*b1cdbd2cSJim Jagielski                         new PolygonMarkerPrimitive2D(
125*b1cdbd2cSJim Jagielski                             aPolyPolygon.getB2DPolygon(a),
126*b1cdbd2cSJim Jagielski                             getRGBColorA(),
127*b1cdbd2cSJim Jagielski                             getRGBColorB(),
128*b1cdbd2cSJim Jagielski                             getDiscreteDashLength()));
129*b1cdbd2cSJim Jagielski 				}
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 				return aRetval;
132*b1cdbd2cSJim Jagielski 			}
133*b1cdbd2cSJim Jagielski 			else
134*b1cdbd2cSJim Jagielski 			{
135*b1cdbd2cSJim Jagielski 				return Primitive2DSequence();
136*b1cdbd2cSJim Jagielski 			}
137*b1cdbd2cSJim Jagielski 		}
138*b1cdbd2cSJim Jagielski 
PolyPolygonMarkerPrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const basegfx::BColor & rRGBColorA,const basegfx::BColor & rRGBColorB,double fDiscreteDashLength)139*b1cdbd2cSJim Jagielski 		PolyPolygonMarkerPrimitive2D::PolyPolygonMarkerPrimitive2D(
140*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
141*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rRGBColorA,
142*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rRGBColorB,
143*b1cdbd2cSJim Jagielski 			double fDiscreteDashLength)
144*b1cdbd2cSJim Jagielski 		:	BufferedDecompositionPrimitive2D(),
145*b1cdbd2cSJim Jagielski 			maPolyPolygon(rPolyPolygon),
146*b1cdbd2cSJim Jagielski 			maRGBColorA(rRGBColorA),
147*b1cdbd2cSJim Jagielski 			maRGBColorB(rRGBColorB),
148*b1cdbd2cSJim Jagielski 			mfDiscreteDashLength(fDiscreteDashLength)
149*b1cdbd2cSJim Jagielski 		{
150*b1cdbd2cSJim Jagielski 		}
151*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const152*b1cdbd2cSJim Jagielski 		bool PolyPolygonMarkerPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
153*b1cdbd2cSJim Jagielski 		{
154*b1cdbd2cSJim Jagielski 			if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
155*b1cdbd2cSJim Jagielski 			{
156*b1cdbd2cSJim Jagielski 				const PolyPolygonMarkerPrimitive2D& rCompare = (PolyPolygonMarkerPrimitive2D&)rPrimitive;
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 				return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
159*b1cdbd2cSJim Jagielski 					&& getRGBColorA() == rCompare.getRGBColorA()
160*b1cdbd2cSJim Jagielski 					&& getRGBColorB() == rCompare.getRGBColorB()
161*b1cdbd2cSJim Jagielski 					&& getDiscreteDashLength() == rCompare.getDiscreteDashLength());
162*b1cdbd2cSJim Jagielski 			}
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 			return false;
165*b1cdbd2cSJim Jagielski 		}
166*b1cdbd2cSJim Jagielski 
getB2DRange(const geometry::ViewInformation2D &) const167*b1cdbd2cSJim Jagielski 		basegfx::B2DRange PolyPolygonMarkerPrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
168*b1cdbd2cSJim Jagielski 		{
169*b1cdbd2cSJim Jagielski 			// return range
170*b1cdbd2cSJim Jagielski 			return basegfx::tools::getRange(getB2DPolyPolygon());
171*b1cdbd2cSJim Jagielski 		}
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 		// provide unique ID
174*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(PolyPolygonMarkerPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONMARKERPRIMITIVE2D)
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
177*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski namespace drawinglayer
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski 	namespace primitive2d
184*b1cdbd2cSJim Jagielski 	{
create2DDecomposition(const geometry::ViewInformation2D &) const185*b1cdbd2cSJim Jagielski 		Primitive2DSequence PolyPolygonStrokePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
186*b1cdbd2cSJim Jagielski 		{
187*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
188*b1cdbd2cSJim Jagielski 			const sal_uInt32 nCount(aPolyPolygon.count());
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 			if(nCount)
191*b1cdbd2cSJim Jagielski 			{
192*b1cdbd2cSJim Jagielski 				Primitive2DSequence aRetval(nCount);
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 				for(sal_uInt32 a(0L); a < nCount; a++)
195*b1cdbd2cSJim Jagielski 				{
196*b1cdbd2cSJim Jagielski 					aRetval[a] = Primitive2DReference(
197*b1cdbd2cSJim Jagielski                         new PolygonStrokePrimitive2D(
198*b1cdbd2cSJim Jagielski                             aPolyPolygon.getB2DPolygon(a), getLineAttribute(), getStrokeAttribute()));
199*b1cdbd2cSJim Jagielski 				}
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 				return aRetval;
202*b1cdbd2cSJim Jagielski 			}
203*b1cdbd2cSJim Jagielski 			else
204*b1cdbd2cSJim Jagielski 			{
205*b1cdbd2cSJim Jagielski 				return Primitive2DSequence();
206*b1cdbd2cSJim Jagielski 			}
207*b1cdbd2cSJim Jagielski 		}
208*b1cdbd2cSJim Jagielski 
PolyPolygonStrokePrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const attribute::LineAttribute & rLineAttribute,const attribute::StrokeAttribute & rStrokeAttribute)209*b1cdbd2cSJim Jagielski 		PolyPolygonStrokePrimitive2D::PolyPolygonStrokePrimitive2D(
210*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
211*b1cdbd2cSJim Jagielski   			const attribute::LineAttribute& rLineAttribute,
212*b1cdbd2cSJim Jagielski 			const attribute::StrokeAttribute& rStrokeAttribute)
213*b1cdbd2cSJim Jagielski 		:	BufferedDecompositionPrimitive2D(),
214*b1cdbd2cSJim Jagielski 			maPolyPolygon(rPolyPolygon),
215*b1cdbd2cSJim Jagielski             maLineAttribute(rLineAttribute),
216*b1cdbd2cSJim Jagielski 			maStrokeAttribute(rStrokeAttribute)
217*b1cdbd2cSJim Jagielski 		{
218*b1cdbd2cSJim Jagielski 		}
219*b1cdbd2cSJim Jagielski 
PolyPolygonStrokePrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const attribute::LineAttribute & rLineAttribute)220*b1cdbd2cSJim Jagielski 		PolyPolygonStrokePrimitive2D::PolyPolygonStrokePrimitive2D(
221*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
222*b1cdbd2cSJim Jagielski   			const attribute::LineAttribute& rLineAttribute)
223*b1cdbd2cSJim Jagielski 		:	BufferedDecompositionPrimitive2D(),
224*b1cdbd2cSJim Jagielski 			maPolyPolygon(rPolyPolygon),
225*b1cdbd2cSJim Jagielski             maLineAttribute(rLineAttribute),
226*b1cdbd2cSJim Jagielski 			maStrokeAttribute()
227*b1cdbd2cSJim Jagielski 		{
228*b1cdbd2cSJim Jagielski 		}
229*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const230*b1cdbd2cSJim Jagielski 		bool PolyPolygonStrokePrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
231*b1cdbd2cSJim Jagielski 		{
232*b1cdbd2cSJim Jagielski 			if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
233*b1cdbd2cSJim Jagielski 			{
234*b1cdbd2cSJim Jagielski 				const PolyPolygonStrokePrimitive2D& rCompare = (PolyPolygonStrokePrimitive2D&)rPrimitive;
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 				return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
237*b1cdbd2cSJim Jagielski 					&& getLineAttribute() == rCompare.getLineAttribute()
238*b1cdbd2cSJim Jagielski 					&& getStrokeAttribute() == rCompare.getStrokeAttribute());
239*b1cdbd2cSJim Jagielski 			}
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 			return false;
242*b1cdbd2cSJim Jagielski 		}
243*b1cdbd2cSJim Jagielski 
getB2DRange(const geometry::ViewInformation2D &) const244*b1cdbd2cSJim Jagielski 		basegfx::B2DRange PolyPolygonStrokePrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
245*b1cdbd2cSJim Jagielski 		{
246*b1cdbd2cSJim Jagielski 			// get range of it (subdivided)
247*b1cdbd2cSJim Jagielski 			basegfx::B2DRange aRetval(basegfx::tools::getRange(getB2DPolyPolygon()));
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 			// if width, grow by line width
250*b1cdbd2cSJim Jagielski 			if(getLineAttribute().getWidth())
251*b1cdbd2cSJim Jagielski 			{
252*b1cdbd2cSJim Jagielski 				aRetval.grow(getLineAttribute().getWidth() / 2.0);
253*b1cdbd2cSJim Jagielski 			}
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 			return aRetval;
256*b1cdbd2cSJim Jagielski 		}
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski 		// provide unique ID
259*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(PolyPolygonStrokePrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONSTROKEPRIMITIVE2D)
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
262*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski namespace drawinglayer
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski 	namespace primitive2d
269*b1cdbd2cSJim Jagielski 	{
create2DDecomposition(const geometry::ViewInformation2D &) const270*b1cdbd2cSJim Jagielski 		Primitive2DSequence PolyPolygonStrokeArrowPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
271*b1cdbd2cSJim Jagielski 		{
272*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
273*b1cdbd2cSJim Jagielski 			const sal_uInt32 nCount(aPolyPolygon.count());
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski 			if(nCount)
276*b1cdbd2cSJim Jagielski 			{
277*b1cdbd2cSJim Jagielski 				Primitive2DSequence aRetval(nCount);
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 				for(sal_uInt32 a(0L); a < nCount; a++)
280*b1cdbd2cSJim Jagielski 				{
281*b1cdbd2cSJim Jagielski 					const basegfx::B2DPolygon aPolygon(aPolyPolygon.getB2DPolygon(a));
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 					if(aPolygon.isClosed())
284*b1cdbd2cSJim Jagielski 					{
285*b1cdbd2cSJim Jagielski 						// no need for PolygonStrokeArrowPrimitive2D when polygon is closed
286*b1cdbd2cSJim Jagielski 						aRetval[a] = Primitive2DReference(
287*b1cdbd2cSJim Jagielski                             new PolygonStrokePrimitive2D(aPolygon, getLineAttribute(), getStrokeAttribute()));
288*b1cdbd2cSJim Jagielski 					}
289*b1cdbd2cSJim Jagielski 					else
290*b1cdbd2cSJim Jagielski 					{
291*b1cdbd2cSJim Jagielski 						aRetval[a] = Primitive2DReference(
292*b1cdbd2cSJim Jagielski                             new PolygonStrokeArrowPrimitive2D(aPolygon, getLineAttribute(),
293*b1cdbd2cSJim Jagielski                                 getStrokeAttribute(), getStart(), getEnd()));
294*b1cdbd2cSJim Jagielski 					}
295*b1cdbd2cSJim Jagielski 				}
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 				return aRetval;
298*b1cdbd2cSJim Jagielski 			}
299*b1cdbd2cSJim Jagielski 			else
300*b1cdbd2cSJim Jagielski 			{
301*b1cdbd2cSJim Jagielski 				return Primitive2DSequence();
302*b1cdbd2cSJim Jagielski 			}
303*b1cdbd2cSJim Jagielski 		}
304*b1cdbd2cSJim Jagielski 
PolyPolygonStrokeArrowPrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const attribute::LineAttribute & rLineAttribute,const attribute::StrokeAttribute & rStrokeAttribute,const attribute::LineStartEndAttribute & rStart,const attribute::LineStartEndAttribute & rEnd)305*b1cdbd2cSJim Jagielski 		PolyPolygonStrokeArrowPrimitive2D::PolyPolygonStrokeArrowPrimitive2D(
306*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
307*b1cdbd2cSJim Jagielski    			const attribute::LineAttribute& rLineAttribute,
308*b1cdbd2cSJim Jagielski 			const attribute::StrokeAttribute& rStrokeAttribute,
309*b1cdbd2cSJim Jagielski 			const attribute::LineStartEndAttribute& rStart,
310*b1cdbd2cSJim Jagielski 			const attribute::LineStartEndAttribute& rEnd)
311*b1cdbd2cSJim Jagielski 		:	PolyPolygonStrokePrimitive2D(rPolyPolygon, rLineAttribute, rStrokeAttribute),
312*b1cdbd2cSJim Jagielski 			maStart(rStart),
313*b1cdbd2cSJim Jagielski 			maEnd(rEnd)
314*b1cdbd2cSJim Jagielski 		{
315*b1cdbd2cSJim Jagielski 		}
316*b1cdbd2cSJim Jagielski 
PolyPolygonStrokeArrowPrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const attribute::LineAttribute & rLineAttribute,const attribute::LineStartEndAttribute & rStart,const attribute::LineStartEndAttribute & rEnd)317*b1cdbd2cSJim Jagielski 		PolyPolygonStrokeArrowPrimitive2D::PolyPolygonStrokeArrowPrimitive2D(
318*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
319*b1cdbd2cSJim Jagielski    			const attribute::LineAttribute& rLineAttribute,
320*b1cdbd2cSJim Jagielski 			const attribute::LineStartEndAttribute& rStart,
321*b1cdbd2cSJim Jagielski 			const attribute::LineStartEndAttribute& rEnd)
322*b1cdbd2cSJim Jagielski 		:	PolyPolygonStrokePrimitive2D(rPolyPolygon, rLineAttribute),
323*b1cdbd2cSJim Jagielski 			maStart(rStart),
324*b1cdbd2cSJim Jagielski 			maEnd(rEnd)
325*b1cdbd2cSJim Jagielski 		{
326*b1cdbd2cSJim Jagielski 		}
327*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const328*b1cdbd2cSJim Jagielski 		bool PolyPolygonStrokeArrowPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
329*b1cdbd2cSJim Jagielski 		{
330*b1cdbd2cSJim Jagielski 			if(PolyPolygonStrokePrimitive2D::operator==(rPrimitive))
331*b1cdbd2cSJim Jagielski 			{
332*b1cdbd2cSJim Jagielski 				const PolyPolygonStrokeArrowPrimitive2D& rCompare = (PolyPolygonStrokeArrowPrimitive2D&)rPrimitive;
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 				return (getStart() == rCompare.getStart()
335*b1cdbd2cSJim Jagielski 					&& getEnd() == rCompare.getEnd());
336*b1cdbd2cSJim Jagielski 			}
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski 			return false;
339*b1cdbd2cSJim Jagielski 		}
340*b1cdbd2cSJim Jagielski 
getB2DRange(const geometry::ViewInformation2D & rViewInformation) const341*b1cdbd2cSJim Jagielski 		basegfx::B2DRange PolyPolygonStrokeArrowPrimitive2D::getB2DRange(const geometry::ViewInformation2D& rViewInformation) const
342*b1cdbd2cSJim Jagielski 		{
343*b1cdbd2cSJim Jagielski 			basegfx::B2DRange aRetval;
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski 			if(getStart().isActive() || getEnd().isActive())
346*b1cdbd2cSJim Jagielski 			{
347*b1cdbd2cSJim Jagielski 				// use decomposition when line start/end is used
348*b1cdbd2cSJim Jagielski 				return BufferedDecompositionPrimitive2D::getB2DRange(rViewInformation);
349*b1cdbd2cSJim Jagielski 			}
350*b1cdbd2cSJim Jagielski 			else
351*b1cdbd2cSJim Jagielski 			{
352*b1cdbd2cSJim Jagielski 				// get range from parent
353*b1cdbd2cSJim Jagielski 				return PolyPolygonStrokePrimitive2D::getB2DRange(rViewInformation);
354*b1cdbd2cSJim Jagielski 			}
355*b1cdbd2cSJim Jagielski 		}
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski 		// provide unique ID
358*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(PolyPolygonStrokeArrowPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONSTROKEARROWPRIMITIVE2D)
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
361*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski namespace drawinglayer
366*b1cdbd2cSJim Jagielski {
367*b1cdbd2cSJim Jagielski 	namespace primitive2d
368*b1cdbd2cSJim Jagielski 	{
PolyPolygonColorPrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const basegfx::BColor & rBColor)369*b1cdbd2cSJim Jagielski 		PolyPolygonColorPrimitive2D::PolyPolygonColorPrimitive2D(
370*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
371*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rBColor)
372*b1cdbd2cSJim Jagielski 		:	BasePrimitive2D(),
373*b1cdbd2cSJim Jagielski 			maPolyPolygon(rPolyPolygon),
374*b1cdbd2cSJim Jagielski 			maBColor(rBColor)
375*b1cdbd2cSJim Jagielski 		{
376*b1cdbd2cSJim Jagielski 		}
377*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const378*b1cdbd2cSJim Jagielski 		bool PolyPolygonColorPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
379*b1cdbd2cSJim Jagielski 		{
380*b1cdbd2cSJim Jagielski 			if(BasePrimitive2D::operator==(rPrimitive))
381*b1cdbd2cSJim Jagielski 			{
382*b1cdbd2cSJim Jagielski 				const PolyPolygonColorPrimitive2D& rCompare = (PolyPolygonColorPrimitive2D&)rPrimitive;
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 				return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
385*b1cdbd2cSJim Jagielski 					&& getBColor() == rCompare.getBColor());
386*b1cdbd2cSJim Jagielski 			}
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 			return false;
389*b1cdbd2cSJim Jagielski 		}
390*b1cdbd2cSJim Jagielski 
getB2DRange(const geometry::ViewInformation2D &) const391*b1cdbd2cSJim Jagielski 		basegfx::B2DRange PolyPolygonColorPrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
392*b1cdbd2cSJim Jagielski 		{
393*b1cdbd2cSJim Jagielski 			// return range
394*b1cdbd2cSJim Jagielski 			return basegfx::tools::getRange(getB2DPolyPolygon());
395*b1cdbd2cSJim Jagielski 		}
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski 		// provide unique ID
398*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(PolyPolygonColorPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D)
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
401*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski namespace drawinglayer
406*b1cdbd2cSJim Jagielski {
407*b1cdbd2cSJim Jagielski 	namespace primitive2d
408*b1cdbd2cSJim Jagielski 	{
create2DDecomposition(const geometry::ViewInformation2D &) const409*b1cdbd2cSJim Jagielski 		Primitive2DSequence PolyPolygonGradientPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
410*b1cdbd2cSJim Jagielski 		{
411*b1cdbd2cSJim Jagielski             if(!getFillGradient().isDefault())
412*b1cdbd2cSJim Jagielski             {
413*b1cdbd2cSJim Jagielski 			    // create SubSequence with FillGradientPrimitive2D
414*b1cdbd2cSJim Jagielski 			    const basegfx::B2DRange aPolyPolygonRange(getB2DPolyPolygon().getB2DRange());
415*b1cdbd2cSJim Jagielski 			    FillGradientPrimitive2D* pNewGradient = new FillGradientPrimitive2D(aPolyPolygonRange, getFillGradient());
416*b1cdbd2cSJim Jagielski 			    const Primitive2DReference xSubRef(pNewGradient);
417*b1cdbd2cSJim Jagielski 			    const Primitive2DSequence aSubSequence(&xSubRef, 1L);
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 			    // create mask primitive
420*b1cdbd2cSJim Jagielski 			    MaskPrimitive2D* pNewMask = new MaskPrimitive2D(getB2DPolyPolygon(), aSubSequence);
421*b1cdbd2cSJim Jagielski 			    const Primitive2DReference xRef(pNewMask);
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski                 return Primitive2DSequence(&xRef, 1);
424*b1cdbd2cSJim Jagielski             }
425*b1cdbd2cSJim Jagielski             else
426*b1cdbd2cSJim Jagielski             {
427*b1cdbd2cSJim Jagielski                 return Primitive2DSequence();
428*b1cdbd2cSJim Jagielski             }
429*b1cdbd2cSJim Jagielski 		}
430*b1cdbd2cSJim Jagielski 
PolyPolygonGradientPrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const attribute::FillGradientAttribute & rFillGradient)431*b1cdbd2cSJim Jagielski 		PolyPolygonGradientPrimitive2D::PolyPolygonGradientPrimitive2D(
432*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
433*b1cdbd2cSJim Jagielski 			const attribute::FillGradientAttribute& rFillGradient)
434*b1cdbd2cSJim Jagielski 		:	BufferedDecompositionPrimitive2D(),
435*b1cdbd2cSJim Jagielski 			maPolyPolygon(rPolyPolygon),
436*b1cdbd2cSJim Jagielski 			maFillGradient(rFillGradient)
437*b1cdbd2cSJim Jagielski 		{
438*b1cdbd2cSJim Jagielski 		}
439*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const440*b1cdbd2cSJim Jagielski 		bool PolyPolygonGradientPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
441*b1cdbd2cSJim Jagielski 		{
442*b1cdbd2cSJim Jagielski 			if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
443*b1cdbd2cSJim Jagielski 			{
444*b1cdbd2cSJim Jagielski 				const PolyPolygonGradientPrimitive2D& rCompare = (PolyPolygonGradientPrimitive2D&)rPrimitive;
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 				return (getFillGradient() == rCompare.getFillGradient());
447*b1cdbd2cSJim Jagielski 			}
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski 			return false;
450*b1cdbd2cSJim Jagielski 		}
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski 		// provide unique ID
453*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(PolyPolygonGradientPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONGRADIENTPRIMITIVE2D)
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
456*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski namespace drawinglayer
461*b1cdbd2cSJim Jagielski {
462*b1cdbd2cSJim Jagielski 	namespace primitive2d
463*b1cdbd2cSJim Jagielski 	{
create2DDecomposition(const geometry::ViewInformation2D &) const464*b1cdbd2cSJim Jagielski 		Primitive2DSequence PolyPolygonHatchPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
465*b1cdbd2cSJim Jagielski 		{
466*b1cdbd2cSJim Jagielski             if(!getFillHatch().isDefault())
467*b1cdbd2cSJim Jagielski             {
468*b1cdbd2cSJim Jagielski 			    // create SubSequence with FillHatchPrimitive2D
469*b1cdbd2cSJim Jagielski 			    const basegfx::B2DRange aPolyPolygonRange(getB2DPolyPolygon().getB2DRange());
470*b1cdbd2cSJim Jagielski 			    FillHatchPrimitive2D* pNewHatch = new FillHatchPrimitive2D(aPolyPolygonRange, getBackgroundColor(), getFillHatch());
471*b1cdbd2cSJim Jagielski 			    const Primitive2DReference xSubRef(pNewHatch);
472*b1cdbd2cSJim Jagielski 			    const Primitive2DSequence aSubSequence(&xSubRef, 1L);
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski 			    // create mask primitive
475*b1cdbd2cSJim Jagielski 			    MaskPrimitive2D* pNewMask = new MaskPrimitive2D(getB2DPolyPolygon(), aSubSequence);
476*b1cdbd2cSJim Jagielski 			    const Primitive2DReference xRef(pNewMask);
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski                 return Primitive2DSequence(&xRef, 1);
479*b1cdbd2cSJim Jagielski             }
480*b1cdbd2cSJim Jagielski             else
481*b1cdbd2cSJim Jagielski             {
482*b1cdbd2cSJim Jagielski                 return Primitive2DSequence();
483*b1cdbd2cSJim Jagielski             }
484*b1cdbd2cSJim Jagielski 		}
485*b1cdbd2cSJim Jagielski 
PolyPolygonHatchPrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const basegfx::BColor & rBackgroundColor,const attribute::FillHatchAttribute & rFillHatch)486*b1cdbd2cSJim Jagielski 		PolyPolygonHatchPrimitive2D::PolyPolygonHatchPrimitive2D(
487*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
488*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rBackgroundColor,
489*b1cdbd2cSJim Jagielski 			const attribute::FillHatchAttribute& rFillHatch)
490*b1cdbd2cSJim Jagielski 		:	BufferedDecompositionPrimitive2D(),
491*b1cdbd2cSJim Jagielski 			maPolyPolygon(rPolyPolygon),
492*b1cdbd2cSJim Jagielski 			maBackgroundColor(rBackgroundColor),
493*b1cdbd2cSJim Jagielski 			maFillHatch(rFillHatch)
494*b1cdbd2cSJim Jagielski 		{
495*b1cdbd2cSJim Jagielski 		}
496*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const497*b1cdbd2cSJim Jagielski 		bool PolyPolygonHatchPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
498*b1cdbd2cSJim Jagielski 		{
499*b1cdbd2cSJim Jagielski 			if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
500*b1cdbd2cSJim Jagielski 			{
501*b1cdbd2cSJim Jagielski 				const PolyPolygonHatchPrimitive2D& rCompare = (PolyPolygonHatchPrimitive2D&)rPrimitive;
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski 				return (getBackgroundColor() == rCompare.getBackgroundColor()
504*b1cdbd2cSJim Jagielski 					&& getFillHatch() == rCompare.getFillHatch());
505*b1cdbd2cSJim Jagielski 			}
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski 			return false;
508*b1cdbd2cSJim Jagielski 		}
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski 		// provide unique ID
511*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(PolyPolygonHatchPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONHATCHPRIMITIVE2D)
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
514*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski namespace drawinglayer
519*b1cdbd2cSJim Jagielski {
520*b1cdbd2cSJim Jagielski 	namespace primitive2d
521*b1cdbd2cSJim Jagielski 	{
create2DDecomposition(const geometry::ViewInformation2D &) const522*b1cdbd2cSJim Jagielski 		Primitive2DSequence PolyPolygonGraphicPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
523*b1cdbd2cSJim Jagielski 		{
524*b1cdbd2cSJim Jagielski             if(!getFillGraphic().isDefault())
525*b1cdbd2cSJim Jagielski             {
526*b1cdbd2cSJim Jagielski                 const Graphic& rGraphic = getFillGraphic().getGraphic();
527*b1cdbd2cSJim Jagielski                 const GraphicType aType(rGraphic.GetType());
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski                 // is there a bitmap or a metafile (do we have content)?
530*b1cdbd2cSJim Jagielski                 if(GRAPHIC_BITMAP == aType || GRAPHIC_GDIMETAFILE == aType)
531*b1cdbd2cSJim Jagielski                 {
532*b1cdbd2cSJim Jagielski                     const Size aPrefSize(rGraphic.GetPrefSize());
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski                     // does content have a size?
535*b1cdbd2cSJim Jagielski                     if(aPrefSize.Width() && aPrefSize.Height())
536*b1cdbd2cSJim Jagielski                     {
537*b1cdbd2cSJim Jagielski                         // create SubSequence with FillGraphicPrimitive2D based on polygon range
538*b1cdbd2cSJim Jagielski                         const basegfx::B2DRange aPolyPolygonRange(getB2DPolyPolygon().getB2DRange());
539*b1cdbd2cSJim Jagielski                         const basegfx::B2DHomMatrix aNewObjectTransform(
540*b1cdbd2cSJim Jagielski                             basegfx::tools::createScaleTranslateB2DHomMatrix(
541*b1cdbd2cSJim Jagielski                                 aPolyPolygonRange.getRange(),
542*b1cdbd2cSJim Jagielski                                 aPolyPolygonRange.getMinimum()));
543*b1cdbd2cSJim Jagielski                         const Primitive2DReference xSubRef(
544*b1cdbd2cSJim Jagielski                             new FillGraphicPrimitive2D(
545*b1cdbd2cSJim Jagielski                                 aNewObjectTransform,
546*b1cdbd2cSJim Jagielski                                 getFillGraphic()));
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski                         // embed to mask primitive
549*b1cdbd2cSJim Jagielski                         const Primitive2DReference xRef(
550*b1cdbd2cSJim Jagielski                             new MaskPrimitive2D(
551*b1cdbd2cSJim Jagielski                                 getB2DPolyPolygon(),
552*b1cdbd2cSJim Jagielski                                 Primitive2DSequence(&xSubRef, 1)));
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski                         return Primitive2DSequence(&xRef, 1);
555*b1cdbd2cSJim Jagielski                     }
556*b1cdbd2cSJim Jagielski                 }
557*b1cdbd2cSJim Jagielski             }
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski             return Primitive2DSequence();
560*b1cdbd2cSJim Jagielski 		}
561*b1cdbd2cSJim Jagielski 
PolyPolygonGraphicPrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const attribute::FillGraphicAttribute & rFillGraphic)562*b1cdbd2cSJim Jagielski 		PolyPolygonGraphicPrimitive2D::PolyPolygonGraphicPrimitive2D(
563*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
564*b1cdbd2cSJim Jagielski 			const attribute::FillGraphicAttribute& rFillGraphic)
565*b1cdbd2cSJim Jagielski 		:	BufferedDecompositionPrimitive2D(),
566*b1cdbd2cSJim Jagielski 			maPolyPolygon(rPolyPolygon),
567*b1cdbd2cSJim Jagielski 			maFillGraphic(rFillGraphic)
568*b1cdbd2cSJim Jagielski 		{
569*b1cdbd2cSJim Jagielski 		}
570*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const571*b1cdbd2cSJim Jagielski 		bool PolyPolygonGraphicPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
572*b1cdbd2cSJim Jagielski 		{
573*b1cdbd2cSJim Jagielski 			if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
574*b1cdbd2cSJim Jagielski 			{
575*b1cdbd2cSJim Jagielski 				const PolyPolygonGraphicPrimitive2D& rCompare = (PolyPolygonGraphicPrimitive2D&)rPrimitive;
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 				return (getFillGraphic() == rCompare.getFillGraphic());
578*b1cdbd2cSJim Jagielski 			}
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski 			return false;
581*b1cdbd2cSJim Jagielski 		}
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski 		// provide unique ID
584*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(PolyPolygonGraphicPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONGRAPHICPRIMITIVE2D)
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
587*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski namespace drawinglayer
592*b1cdbd2cSJim Jagielski {
593*b1cdbd2cSJim Jagielski     namespace primitive2d
594*b1cdbd2cSJim Jagielski     {
create2DDecomposition(const geometry::ViewInformation2D &) const595*b1cdbd2cSJim Jagielski         Primitive2DSequence PolyPolygonSelectionPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
596*b1cdbd2cSJim Jagielski         {
597*b1cdbd2cSJim Jagielski             Primitive2DSequence aRetval;
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski             if(getTransparence() < 1.0 && getB2DPolyPolygon().count())
600*b1cdbd2cSJim Jagielski             {
601*b1cdbd2cSJim Jagielski                 if(getFill() && getB2DPolyPolygon().isClosed())
602*b1cdbd2cSJim Jagielski                 {
603*b1cdbd2cSJim Jagielski                     // create fill primitive
604*b1cdbd2cSJim Jagielski                     const Primitive2DReference aFill(
605*b1cdbd2cSJim Jagielski                         new PolyPolygonColorPrimitive2D(
606*b1cdbd2cSJim Jagielski                             getB2DPolyPolygon(),
607*b1cdbd2cSJim Jagielski                             getColor()));
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski                     aRetval = Primitive2DSequence(&aFill, 1);
610*b1cdbd2cSJim Jagielski                 }
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski                 if(getDiscreteGrow() > 0.0)
613*b1cdbd2cSJim Jagielski                 {
614*b1cdbd2cSJim Jagielski                     const attribute::LineAttribute aLineAttribute(
615*b1cdbd2cSJim Jagielski                         getColor(),
616*b1cdbd2cSJim Jagielski                         getDiscreteGrow() * getDiscreteUnit() * 2.0);
617*b1cdbd2cSJim Jagielski                     const Primitive2DReference aFatLine(
618*b1cdbd2cSJim Jagielski                         new PolyPolygonStrokePrimitive2D(
619*b1cdbd2cSJim Jagielski                             getB2DPolyPolygon(),
620*b1cdbd2cSJim Jagielski                             aLineAttribute));
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski                     appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, aFatLine);
623*b1cdbd2cSJim Jagielski                 }
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski                 // embed filled to transparency (if used)
626*b1cdbd2cSJim Jagielski                 if(aRetval.getLength() && getTransparence() > 0.0)
627*b1cdbd2cSJim Jagielski                 {
628*b1cdbd2cSJim Jagielski                     const Primitive2DReference aTrans(
629*b1cdbd2cSJim Jagielski                         new UnifiedTransparencePrimitive2D(
630*b1cdbd2cSJim Jagielski                             aRetval,
631*b1cdbd2cSJim Jagielski                             getTransparence()));
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski                     aRetval = Primitive2DSequence(&aTrans, 1);
634*b1cdbd2cSJim Jagielski                 }
635*b1cdbd2cSJim Jagielski             }
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski             return aRetval;
638*b1cdbd2cSJim Jagielski         }
639*b1cdbd2cSJim Jagielski 
PolyPolygonSelectionPrimitive2D(const basegfx::B2DPolyPolygon & rPolyPolygon,const basegfx::BColor & rColor,double fTransparence,double fDiscreteGrow,bool bFill)640*b1cdbd2cSJim Jagielski         PolyPolygonSelectionPrimitive2D::PolyPolygonSelectionPrimitive2D(
641*b1cdbd2cSJim Jagielski             const basegfx::B2DPolyPolygon& rPolyPolygon,
642*b1cdbd2cSJim Jagielski             const basegfx::BColor& rColor,
643*b1cdbd2cSJim Jagielski             double fTransparence,
644*b1cdbd2cSJim Jagielski             double fDiscreteGrow,
645*b1cdbd2cSJim Jagielski             bool bFill)
646*b1cdbd2cSJim Jagielski         :   DiscreteMetricDependentPrimitive2D(),
647*b1cdbd2cSJim Jagielski             maPolyPolygon(rPolyPolygon),
648*b1cdbd2cSJim Jagielski             maColor(rColor),
649*b1cdbd2cSJim Jagielski             mfTransparence(fTransparence),
650*b1cdbd2cSJim Jagielski             mfDiscreteGrow(fabs(fDiscreteGrow)),
651*b1cdbd2cSJim Jagielski             mbFill(bFill)
652*b1cdbd2cSJim Jagielski         {
653*b1cdbd2cSJim Jagielski         }
654*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const655*b1cdbd2cSJim Jagielski         bool PolyPolygonSelectionPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
656*b1cdbd2cSJim Jagielski         {
657*b1cdbd2cSJim Jagielski             if(DiscreteMetricDependentPrimitive2D::operator==(rPrimitive))
658*b1cdbd2cSJim Jagielski             {
659*b1cdbd2cSJim Jagielski                 const PolyPolygonSelectionPrimitive2D& rCompare = (PolyPolygonSelectionPrimitive2D&)rPrimitive;
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski                 return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
662*b1cdbd2cSJim Jagielski                     && getColor() == rCompare.getColor()
663*b1cdbd2cSJim Jagielski                     && getTransparence() == rCompare.getTransparence()
664*b1cdbd2cSJim Jagielski                     && getDiscreteGrow() == rCompare.getDiscreteGrow()
665*b1cdbd2cSJim Jagielski                     && getFill() == rCompare.getFill());
666*b1cdbd2cSJim Jagielski             }
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski             return false;
669*b1cdbd2cSJim Jagielski         }
670*b1cdbd2cSJim Jagielski 
getB2DRange(const geometry::ViewInformation2D & rViewInformation) const671*b1cdbd2cSJim Jagielski         basegfx::B2DRange PolyPolygonSelectionPrimitive2D::getB2DRange(const geometry::ViewInformation2D& rViewInformation) const
672*b1cdbd2cSJim Jagielski         {
673*b1cdbd2cSJim Jagielski             basegfx::B2DRange aRetval(basegfx::tools::getRange(getB2DPolyPolygon()));
674*b1cdbd2cSJim Jagielski 
675*b1cdbd2cSJim Jagielski             if(getDiscreteGrow() > 0.0)
676*b1cdbd2cSJim Jagielski             {
677*b1cdbd2cSJim Jagielski                 // get the current DiscreteUnit (not sure if getDiscreteUnit() is updated here, better go safe way)
678*b1cdbd2cSJim Jagielski                 const double fDiscreteUnit((rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 0.0)).getLength());
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski                 aRetval.grow(fDiscreteUnit * getDiscreteGrow());
681*b1cdbd2cSJim Jagielski             }
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski             return aRetval;
684*b1cdbd2cSJim Jagielski         }
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski         // provide unique ID
687*b1cdbd2cSJim Jagielski         ImplPrimitrive2DIDBlock(PolyPolygonSelectionPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONSELECTIONPRIMITIVE2D)
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski     } // end of namespace primitive2d
690*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
691*b1cdbd2cSJim Jagielski 
692*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
693*b1cdbd2cSJim Jagielski // eof
694