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_svx.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <svx/sdr/overlay/overlaytools.hxx>
28*b1cdbd2cSJim Jagielski #include <svx/sdr/primitive2d/svx_primitivetypes2d.hxx>
29*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
30*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/bitmapprimitive2d.hxx>
31*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
32*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
33*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx>
34*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
35*b1cdbd2cSJim Jagielski #include <drawinglayer/geometry/viewinformation2d.hxx>
36*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrixtools.hxx>
37*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx>
38*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski namespace drawinglayer
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski 	namespace primitive2d
45*b1cdbd2cSJim Jagielski 	{
OverlayBitmapExPrimitive(const BitmapEx & rBitmapEx,const basegfx::B2DPoint & rBasePosition,sal_uInt16 nCenterX,sal_uInt16 nCenterY,double fShearX,double fRotation)46*b1cdbd2cSJim Jagielski         OverlayBitmapExPrimitive::OverlayBitmapExPrimitive(
47*b1cdbd2cSJim Jagielski 			const BitmapEx& rBitmapEx,
48*b1cdbd2cSJim Jagielski 			const basegfx::B2DPoint& rBasePosition,
49*b1cdbd2cSJim Jagielski 			sal_uInt16 nCenterX,
50*b1cdbd2cSJim Jagielski 			sal_uInt16 nCenterY,
51*b1cdbd2cSJim Jagielski             double fShearX,
52*b1cdbd2cSJim Jagielski             double fRotation)
53*b1cdbd2cSJim Jagielski 		:   DiscreteMetricDependentPrimitive2D(),
54*b1cdbd2cSJim Jagielski 			maBitmapEx(rBitmapEx),
55*b1cdbd2cSJim Jagielski 			maBasePosition(rBasePosition),
56*b1cdbd2cSJim Jagielski 			mnCenterX(nCenterX),
57*b1cdbd2cSJim Jagielski 			mnCenterY(nCenterY),
58*b1cdbd2cSJim Jagielski             mfShearX(fShearX),
59*b1cdbd2cSJim Jagielski             mfRotation(fRotation)
60*b1cdbd2cSJim Jagielski 		{}
61*b1cdbd2cSJim Jagielski 
create2DDecomposition(const geometry::ViewInformation2D &) const62*b1cdbd2cSJim Jagielski 		Primitive2DSequence OverlayBitmapExPrimitive::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
63*b1cdbd2cSJim Jagielski 		{
64*b1cdbd2cSJim Jagielski             Primitive2DSequence aRetval;
65*b1cdbd2cSJim Jagielski 			const Size aBitmapSize(getBitmapEx().GetSizePixel());
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski             if(aBitmapSize.Width() && aBitmapSize.Height() && basegfx::fTools::more(getDiscreteUnit(), 0.0))
68*b1cdbd2cSJim Jagielski 			{
69*b1cdbd2cSJim Jagielski                 // calculate back from internal bitmap's extreme coordinates (the edges)
70*b1cdbd2cSJim Jagielski                 // to logical coordinates. Only use a unified scaling value (getDiscreteUnit(),
71*b1cdbd2cSJim Jagielski                 // the prepared one which expresses how many logic units form a discrete unit)
72*b1cdbd2cSJim Jagielski                 // for this step. This primitive is to be displayed always unscaled (in it's pixel size)
73*b1cdbd2cSJim Jagielski                 // and unrotated, more like a marker
74*b1cdbd2cSJim Jagielski                 const double fLeft((0.0 - getCenterX()) * getDiscreteUnit());
75*b1cdbd2cSJim Jagielski                 const double fTop((0.0 - getCenterY()) * getDiscreteUnit());
76*b1cdbd2cSJim Jagielski                 const double fRight((aBitmapSize.getWidth() - getCenterX()) * getDiscreteUnit());
77*b1cdbd2cSJim Jagielski                 const double fBottom((aBitmapSize.getHeight() - getCenterY()) * getDiscreteUnit());
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski                 // create a BitmapPrimitive2D using those positions
80*b1cdbd2cSJim Jagielski                 basegfx::B2DHomMatrix aTransform;
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski                 aTransform.set(0, 0, fRight - fLeft);
83*b1cdbd2cSJim Jagielski                 aTransform.set(1, 1, fBottom - fTop);
84*b1cdbd2cSJim Jagielski                 aTransform.set(0, 2, fLeft);
85*b1cdbd2cSJim Jagielski                 aTransform.set(1, 2, fTop);
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski                 // if shearX is used, apply it, too
88*b1cdbd2cSJim Jagielski                 if(!basegfx::fTools::equalZero(getShearX()))
89*b1cdbd2cSJim Jagielski                 {
90*b1cdbd2cSJim Jagielski                     aTransform.shearX(getShearX());
91*b1cdbd2cSJim Jagielski                 }
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski                 // if rotation is used, apply it, too
94*b1cdbd2cSJim Jagielski                 if(!basegfx::fTools::equalZero(getRotation()))
95*b1cdbd2cSJim Jagielski                 {
96*b1cdbd2cSJim Jagielski                     aTransform.rotate(getRotation());
97*b1cdbd2cSJim Jagielski                 }
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski                 // add BasePosition
100*b1cdbd2cSJim Jagielski                 aTransform.translate(getBasePosition().getX(), getBasePosition().getY());
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski                 const Primitive2DReference aPrimitive(new BitmapPrimitive2D(getBitmapEx(), aTransform));
103*b1cdbd2cSJim Jagielski                 aRetval = Primitive2DSequence(&aPrimitive, 1);
104*b1cdbd2cSJim Jagielski             }
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski             return aRetval;
107*b1cdbd2cSJim Jagielski 		}
108*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const109*b1cdbd2cSJim Jagielski 		bool OverlayBitmapExPrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
110*b1cdbd2cSJim Jagielski 		{
111*b1cdbd2cSJim Jagielski 			if(DiscreteMetricDependentPrimitive2D::operator==(rPrimitive))
112*b1cdbd2cSJim Jagielski 			{
113*b1cdbd2cSJim Jagielski 				const OverlayBitmapExPrimitive& rCompare = static_cast< const OverlayBitmapExPrimitive& >(rPrimitive);
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 				return (getBitmapEx() == rCompare.getBitmapEx()
116*b1cdbd2cSJim Jagielski 					&& getBasePosition() == rCompare.getBasePosition()
117*b1cdbd2cSJim Jagielski 					&& getCenterX() == rCompare.getCenterX()
118*b1cdbd2cSJim Jagielski 					&& getCenterY() == rCompare.getCenterY()
119*b1cdbd2cSJim Jagielski                     && getShearX() == rCompare.getShearX()
120*b1cdbd2cSJim Jagielski                     && getRotation() == rCompare.getRotation());
121*b1cdbd2cSJim Jagielski 			}
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 			return false;
124*b1cdbd2cSJim Jagielski 		}
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(OverlayBitmapExPrimitive, PRIMITIVE2D_ID_OVERLAYBITMAPEXPRIMITIVE)
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
129*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski namespace drawinglayer
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski 	namespace primitive2d
136*b1cdbd2cSJim Jagielski 	{
OverlayCrosshairPrimitive(const basegfx::B2DPoint & rBasePosition,const basegfx::BColor & rRGBColorA,const basegfx::BColor & rRGBColorB,double fDiscreteDashLength)137*b1cdbd2cSJim Jagielski         OverlayCrosshairPrimitive::OverlayCrosshairPrimitive(
138*b1cdbd2cSJim Jagielski             const basegfx::B2DPoint& rBasePosition,
139*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rRGBColorA,
140*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rRGBColorB,
141*b1cdbd2cSJim Jagielski 			double fDiscreteDashLength)
142*b1cdbd2cSJim Jagielski         :   ViewportDependentPrimitive2D(),
143*b1cdbd2cSJim Jagielski 			maBasePosition(rBasePosition),
144*b1cdbd2cSJim Jagielski 			maRGBColorA(rRGBColorA),
145*b1cdbd2cSJim Jagielski 			maRGBColorB(rRGBColorB),
146*b1cdbd2cSJim Jagielski 			mfDiscreteDashLength(fDiscreteDashLength)
147*b1cdbd2cSJim Jagielski         {}
148*b1cdbd2cSJim Jagielski 
create2DDecomposition(const geometry::ViewInformation2D &) const149*b1cdbd2cSJim Jagielski 		Primitive2DSequence OverlayCrosshairPrimitive::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
150*b1cdbd2cSJim Jagielski 		{
151*b1cdbd2cSJim Jagielski             // use the prepared Viewport information accessible using getViewport()
152*b1cdbd2cSJim Jagielski             Primitive2DSequence aRetval;
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski             if(!getViewport().isEmpty())
155*b1cdbd2cSJim Jagielski             {
156*b1cdbd2cSJim Jagielski                 aRetval.realloc(2);
157*b1cdbd2cSJim Jagielski                 basegfx::B2DPolygon aPolygon;
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski                 aPolygon.append(basegfx::B2DPoint(getViewport().getMinX(), getBasePosition().getY()));
160*b1cdbd2cSJim Jagielski                 aPolygon.append(basegfx::B2DPoint(getViewport().getMaxX(), getBasePosition().getY()));
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski                 aRetval[0] = Primitive2DReference(
163*b1cdbd2cSJim Jagielski                     new PolygonMarkerPrimitive2D(
164*b1cdbd2cSJim Jagielski                         aPolygon,
165*b1cdbd2cSJim Jagielski                         getRGBColorA(),
166*b1cdbd2cSJim Jagielski                         getRGBColorB(),
167*b1cdbd2cSJim Jagielski                         getDiscreteDashLength()));
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski                 aPolygon.clear();
170*b1cdbd2cSJim Jagielski                 aPolygon.append(basegfx::B2DPoint(getBasePosition().getX(), getViewport().getMinY()));
171*b1cdbd2cSJim Jagielski                 aPolygon.append(basegfx::B2DPoint(getBasePosition().getX(), getViewport().getMaxY()));
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski                 aRetval[1] = Primitive2DReference(
174*b1cdbd2cSJim Jagielski                     new PolygonMarkerPrimitive2D(
175*b1cdbd2cSJim Jagielski                         aPolygon,
176*b1cdbd2cSJim Jagielski                         getRGBColorA(),
177*b1cdbd2cSJim Jagielski                         getRGBColorB(),
178*b1cdbd2cSJim Jagielski                         getDiscreteDashLength()));
179*b1cdbd2cSJim Jagielski             }
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski             return aRetval;
182*b1cdbd2cSJim Jagielski 		}
183*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const184*b1cdbd2cSJim Jagielski 		bool OverlayCrosshairPrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
185*b1cdbd2cSJim Jagielski 		{
186*b1cdbd2cSJim Jagielski 			if(ViewportDependentPrimitive2D::operator==(rPrimitive))
187*b1cdbd2cSJim Jagielski 			{
188*b1cdbd2cSJim Jagielski 				const OverlayCrosshairPrimitive& rCompare = static_cast< const OverlayCrosshairPrimitive& >(rPrimitive);
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 				return (getBasePosition() == rCompare.getBasePosition()
191*b1cdbd2cSJim Jagielski 					&& getRGBColorA() == rCompare.getRGBColorA()
192*b1cdbd2cSJim Jagielski 					&& getRGBColorB() == rCompare.getRGBColorB()
193*b1cdbd2cSJim Jagielski                     && getDiscreteDashLength() == rCompare.getDiscreteDashLength());
194*b1cdbd2cSJim Jagielski 			}
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 			return false;
197*b1cdbd2cSJim Jagielski 		}
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(OverlayCrosshairPrimitive, PRIMITIVE2D_ID_OVERLAYCROSSHAIRPRIMITIVE)
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
202*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski namespace drawinglayer
207*b1cdbd2cSJim Jagielski {
208*b1cdbd2cSJim Jagielski 	namespace primitive2d
209*b1cdbd2cSJim Jagielski 	{
OverlayRectanglePrimitive(const basegfx::B2DRange & rObjectRange,const basegfx::BColor & rColor,double fTransparence,double fDiscreteGrow,double fDiscreteShrink,double fRotation)210*b1cdbd2cSJim Jagielski         OverlayRectanglePrimitive::OverlayRectanglePrimitive(
211*b1cdbd2cSJim Jagielski             const basegfx::B2DRange& rObjectRange,
212*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rColor,
213*b1cdbd2cSJim Jagielski             double fTransparence,
214*b1cdbd2cSJim Jagielski             double fDiscreteGrow,
215*b1cdbd2cSJim Jagielski             double fDiscreteShrink,
216*b1cdbd2cSJim Jagielski             double fRotation)
217*b1cdbd2cSJim Jagielski         :   DiscreteMetricDependentPrimitive2D(),
218*b1cdbd2cSJim Jagielski             maObjectRange(rObjectRange),
219*b1cdbd2cSJim Jagielski 			maColor(rColor),
220*b1cdbd2cSJim Jagielski             mfTransparence(fTransparence),
221*b1cdbd2cSJim Jagielski             mfDiscreteGrow(fDiscreteGrow),
222*b1cdbd2cSJim Jagielski             mfDiscreteShrink(fDiscreteShrink),
223*b1cdbd2cSJim Jagielski             mfRotation(fRotation)
224*b1cdbd2cSJim Jagielski         {}
225*b1cdbd2cSJim Jagielski 
create2DDecomposition(const geometry::ViewInformation2D &) const226*b1cdbd2cSJim Jagielski 		Primitive2DSequence OverlayRectanglePrimitive::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
227*b1cdbd2cSJim Jagielski 		{
228*b1cdbd2cSJim Jagielski             Primitive2DSequence aRetval;
229*b1cdbd2cSJim Jagielski             basegfx::B2DRange aInnerRange(getObjectRange());
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski             if(!aInnerRange.isEmpty() && basegfx::fTools::more(getDiscreteUnit(), 0.0) && getTransparence() <= 1.0)
232*b1cdbd2cSJim Jagielski             {
233*b1cdbd2cSJim Jagielski                 basegfx::B2DRange aInnerRange(getObjectRange());
234*b1cdbd2cSJim Jagielski                 basegfx::B2DRange aOuterRange(getObjectRange());
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski                 // grow/shrink inner/outer polygons
237*b1cdbd2cSJim Jagielski                 aOuterRange.grow(getDiscreteUnit() * getDiscreteGrow());
238*b1cdbd2cSJim Jagielski                 aInnerRange.grow(getDiscreteUnit() * -getDiscreteShrink());
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski                 // convert to polygons
241*b1cdbd2cSJim Jagielski                 const double fFullGrow(getDiscreteGrow() + getDiscreteShrink());
242*b1cdbd2cSJim Jagielski                 const double fRelativeRadiusX(fFullGrow / aOuterRange.getWidth());
243*b1cdbd2cSJim Jagielski                 const double fRelativeRadiusY(fFullGrow / aOuterRange.getHeight());
244*b1cdbd2cSJim Jagielski                 basegfx::B2DPolygon aOuterPolygon(
245*b1cdbd2cSJim Jagielski                     basegfx::tools::createPolygonFromRect(
246*b1cdbd2cSJim Jagielski                         aOuterRange,
247*b1cdbd2cSJim Jagielski                         fRelativeRadiusX,
248*b1cdbd2cSJim Jagielski                         fRelativeRadiusY));
249*b1cdbd2cSJim Jagielski                 basegfx::B2DPolygon aInnerPolygon(
250*b1cdbd2cSJim Jagielski                     basegfx::tools::createPolygonFromRect(
251*b1cdbd2cSJim Jagielski                         aInnerRange));
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski                 // apply evtl. existing rotation
254*b1cdbd2cSJim Jagielski                 if(!basegfx::fTools::equalZero(getRotation()))
255*b1cdbd2cSJim Jagielski                 {
256*b1cdbd2cSJim Jagielski                     const basegfx::B2DHomMatrix aTransform(basegfx::tools::createRotateAroundPoint(
257*b1cdbd2cSJim Jagielski                         getObjectRange().getMinX(), getObjectRange().getMinY(), getRotation()));
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski                     aOuterPolygon.transform(aTransform);
260*b1cdbd2cSJim Jagielski                     aInnerPolygon.transform(aTransform);
261*b1cdbd2cSJim Jagielski                 }
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski                 // create filled primitive
264*b1cdbd2cSJim Jagielski                 basegfx::B2DPolyPolygon aPolyPolygon;
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski                 aPolyPolygon.append(aOuterPolygon);
267*b1cdbd2cSJim Jagielski                 aPolyPolygon.append(aInnerPolygon);
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski                 if(Application::GetSettings().GetStyleSettings().GetHighContrastMode())
270*b1cdbd2cSJim Jagielski                 {
271*b1cdbd2cSJim Jagielski                     // for high contrast, use hatch
272*b1cdbd2cSJim Jagielski                     const basegfx::BColor aHighContrastLineColor(Application::GetSettings().GetStyleSettings().GetFontColor().getBColor());
273*b1cdbd2cSJim Jagielski                     const basegfx::BColor aEmptyColor(0.0, 0.0, 0.0);
274*b1cdbd2cSJim Jagielski                     const double fHatchRotation(45 * F_PI180);
275*b1cdbd2cSJim Jagielski                     const double fDiscreteHatchDistance(3.0);
276*b1cdbd2cSJim Jagielski                     const drawinglayer::attribute::FillHatchAttribute aFillHatchAttribute(
277*b1cdbd2cSJim Jagielski                         drawinglayer::attribute::HATCHSTYLE_SINGLE,
278*b1cdbd2cSJim Jagielski                         fDiscreteHatchDistance * getDiscreteUnit(),
279*b1cdbd2cSJim Jagielski                         fHatchRotation - getRotation(),
280*b1cdbd2cSJim Jagielski                         aHighContrastLineColor,
281*b1cdbd2cSJim Jagielski                         3, // same default as VCL, a minimum of three discrete units (pixels) offset
282*b1cdbd2cSJim Jagielski                         false);
283*b1cdbd2cSJim Jagielski                     const Primitive2DReference aHatch(
284*b1cdbd2cSJim Jagielski                         new PolyPolygonHatchPrimitive2D(
285*b1cdbd2cSJim Jagielski                             aPolyPolygon,
286*b1cdbd2cSJim Jagielski                             aEmptyColor,
287*b1cdbd2cSJim Jagielski                             aFillHatchAttribute));
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski                     aRetval = Primitive2DSequence(&aHatch, 1);
290*b1cdbd2cSJim Jagielski                 }
291*b1cdbd2cSJim Jagielski                 else
292*b1cdbd2cSJim Jagielski                 {
293*b1cdbd2cSJim Jagielski                     // create fill primitive
294*b1cdbd2cSJim Jagielski                     const Primitive2DReference aFill(
295*b1cdbd2cSJim Jagielski                         new PolyPolygonColorPrimitive2D(
296*b1cdbd2cSJim Jagielski                             aPolyPolygon,
297*b1cdbd2cSJim Jagielski                             getColor()));
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski                     aRetval = Primitive2DSequence(&aFill, 1);
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski                     // embed filled to transparency (if used)
302*b1cdbd2cSJim Jagielski                     if(getTransparence() > 0.0)
303*b1cdbd2cSJim Jagielski                     {
304*b1cdbd2cSJim Jagielski                         const Primitive2DReference aFillTransparent(
305*b1cdbd2cSJim Jagielski                             new UnifiedTransparencePrimitive2D(
306*b1cdbd2cSJim Jagielski                                 aRetval,
307*b1cdbd2cSJim Jagielski                                 getTransparence()));
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski                         aRetval = Primitive2DSequence(&aFillTransparent, 1);
310*b1cdbd2cSJim Jagielski                     }
311*b1cdbd2cSJim Jagielski                 }
312*b1cdbd2cSJim Jagielski             }
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski             return aRetval;
315*b1cdbd2cSJim Jagielski         }
316*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const317*b1cdbd2cSJim Jagielski 		bool OverlayRectanglePrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
318*b1cdbd2cSJim Jagielski 		{
319*b1cdbd2cSJim Jagielski 			if(DiscreteMetricDependentPrimitive2D::operator==(rPrimitive))
320*b1cdbd2cSJim Jagielski 			{
321*b1cdbd2cSJim Jagielski 				const OverlayRectanglePrimitive& rCompare = static_cast< const OverlayRectanglePrimitive& >(rPrimitive);
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski 				return (getObjectRange() == rCompare.getObjectRange()
324*b1cdbd2cSJim Jagielski 					&& getColor() == rCompare.getColor()
325*b1cdbd2cSJim Jagielski                     && getTransparence() == rCompare.getTransparence()
326*b1cdbd2cSJim Jagielski 					&& getDiscreteGrow() == rCompare.getDiscreteGrow()
327*b1cdbd2cSJim Jagielski 					&& getDiscreteShrink() == rCompare.getDiscreteShrink()
328*b1cdbd2cSJim Jagielski 					&& getRotation() == rCompare.getRotation());
329*b1cdbd2cSJim Jagielski 			}
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski 			return false;
332*b1cdbd2cSJim Jagielski 		}
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(OverlayRectanglePrimitive, PRIMITIVE2D_ID_OVERLAYRECTANGLEPRIMITIVE)
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
337*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski namespace drawinglayer
342*b1cdbd2cSJim Jagielski {
343*b1cdbd2cSJim Jagielski 	namespace primitive2d
344*b1cdbd2cSJim Jagielski 	{
OverlayHelplineStripedPrimitive(const basegfx::B2DPoint & rBasePosition,HelplineStyle eStyle,const basegfx::BColor & rRGBColorA,const basegfx::BColor & rRGBColorB,double fDiscreteDashLength)345*b1cdbd2cSJim Jagielski         OverlayHelplineStripedPrimitive::OverlayHelplineStripedPrimitive(
346*b1cdbd2cSJim Jagielski             const basegfx::B2DPoint& rBasePosition,
347*b1cdbd2cSJim Jagielski             HelplineStyle eStyle,
348*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rRGBColorA,
349*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rRGBColorB,
350*b1cdbd2cSJim Jagielski 			double fDiscreteDashLength)
351*b1cdbd2cSJim Jagielski         :   ViewportDependentPrimitive2D(),
352*b1cdbd2cSJim Jagielski 			maBasePosition(rBasePosition),
353*b1cdbd2cSJim Jagielski             meStyle(eStyle),
354*b1cdbd2cSJim Jagielski 			maRGBColorA(rRGBColorA),
355*b1cdbd2cSJim Jagielski 			maRGBColorB(rRGBColorB),
356*b1cdbd2cSJim Jagielski 			mfDiscreteDashLength(fDiscreteDashLength)
357*b1cdbd2cSJim Jagielski         {}
358*b1cdbd2cSJim Jagielski 
create2DDecomposition(const geometry::ViewInformation2D & rViewInformation) const359*b1cdbd2cSJim Jagielski 		Primitive2DSequence OverlayHelplineStripedPrimitive::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
360*b1cdbd2cSJim Jagielski 		{
361*b1cdbd2cSJim Jagielski             // use the prepared Viewport information accessible using getViewport()
362*b1cdbd2cSJim Jagielski             Primitive2DSequence aRetval;
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski             if(!getViewport().isEmpty())
365*b1cdbd2cSJim Jagielski             {
366*b1cdbd2cSJim Jagielski 			    switch(getStyle())
367*b1cdbd2cSJim Jagielski 			    {
368*b1cdbd2cSJim Jagielski 				    case HELPLINESTYLE_VERTICAL :
369*b1cdbd2cSJim Jagielski 				    {
370*b1cdbd2cSJim Jagielski                         aRetval.realloc(1);
371*b1cdbd2cSJim Jagielski                         basegfx::B2DPolygon aLine;
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski                         aLine.append(basegfx::B2DPoint(getBasePosition().getX(), getViewport().getMinY()));
374*b1cdbd2cSJim Jagielski 					    aLine.append(basegfx::B2DPoint(getBasePosition().getX(), getViewport().getMaxY()));
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski                         aRetval[0] = Primitive2DReference(
377*b1cdbd2cSJim Jagielski                             new PolygonMarkerPrimitive2D(
378*b1cdbd2cSJim Jagielski                                 aLine,
379*b1cdbd2cSJim Jagielski                                 getRGBColorA(),
380*b1cdbd2cSJim Jagielski                                 getRGBColorB(),
381*b1cdbd2cSJim Jagielski                                 getDiscreteDashLength()));
382*b1cdbd2cSJim Jagielski 					    break;
383*b1cdbd2cSJim Jagielski 				    }
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 				    case HELPLINESTYLE_HORIZONTAL :
386*b1cdbd2cSJim Jagielski 				    {
387*b1cdbd2cSJim Jagielski                         aRetval.realloc(1);
388*b1cdbd2cSJim Jagielski                         basegfx::B2DPolygon aLine;
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski                         aLine.append(basegfx::B2DPoint(getViewport().getMinX(), getBasePosition().getY()));
391*b1cdbd2cSJim Jagielski 					    aLine.append(basegfx::B2DPoint(getViewport().getMaxX(), getBasePosition().getY()));
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski                         aRetval[0] = Primitive2DReference(
394*b1cdbd2cSJim Jagielski                             new PolygonMarkerPrimitive2D(
395*b1cdbd2cSJim Jagielski                                 aLine,
396*b1cdbd2cSJim Jagielski                                 getRGBColorA(),
397*b1cdbd2cSJim Jagielski                                 getRGBColorB(),
398*b1cdbd2cSJim Jagielski                                 getDiscreteDashLength()));
399*b1cdbd2cSJim Jagielski 					    break;
400*b1cdbd2cSJim Jagielski 				    }
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski                     default: // case HELPLINESTYLE_POINT :
403*b1cdbd2cSJim Jagielski 				    {
404*b1cdbd2cSJim Jagielski             			const double fDiscreteUnit((rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 0.0)).getLength());
405*b1cdbd2cSJim Jagielski                         aRetval.realloc(2);
406*b1cdbd2cSJim Jagielski                         basegfx::B2DPolygon aLineA, aLineB;
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski 					    aLineA.append(basegfx::B2DPoint(getBasePosition().getX(), getBasePosition().getY() - fDiscreteUnit));
409*b1cdbd2cSJim Jagielski 					    aLineA.append(basegfx::B2DPoint(getBasePosition().getX(), getBasePosition().getY() + fDiscreteUnit));
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski                         aRetval[0] = Primitive2DReference(
412*b1cdbd2cSJim Jagielski                             new PolygonMarkerPrimitive2D(
413*b1cdbd2cSJim Jagielski                                 aLineA,
414*b1cdbd2cSJim Jagielski                                 getRGBColorA(),
415*b1cdbd2cSJim Jagielski                                 getRGBColorB(),
416*b1cdbd2cSJim Jagielski                                 getDiscreteDashLength()));
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski 					    aLineB.append(basegfx::B2DPoint(getBasePosition().getX() - fDiscreteUnit, getBasePosition().getY()));
419*b1cdbd2cSJim Jagielski 					    aLineB.append(basegfx::B2DPoint(getBasePosition().getX() + fDiscreteUnit, getBasePosition().getY()));
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski                         aRetval[1] = Primitive2DReference(
422*b1cdbd2cSJim Jagielski                             new PolygonMarkerPrimitive2D(
423*b1cdbd2cSJim Jagielski                                 aLineB,
424*b1cdbd2cSJim Jagielski                                 getRGBColorA(),
425*b1cdbd2cSJim Jagielski                                 getRGBColorB(),
426*b1cdbd2cSJim Jagielski                                 getDiscreteDashLength()));
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski 					    break;
429*b1cdbd2cSJim Jagielski 				    }
430*b1cdbd2cSJim Jagielski 			    }
431*b1cdbd2cSJim Jagielski             }
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski             return aRetval;
434*b1cdbd2cSJim Jagielski 		}
435*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const436*b1cdbd2cSJim Jagielski 		bool OverlayHelplineStripedPrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
437*b1cdbd2cSJim Jagielski 		{
438*b1cdbd2cSJim Jagielski 			if(ViewportDependentPrimitive2D::operator==(rPrimitive))
439*b1cdbd2cSJim Jagielski 			{
440*b1cdbd2cSJim Jagielski 				const OverlayHelplineStripedPrimitive& rCompare = static_cast< const OverlayHelplineStripedPrimitive& >(rPrimitive);
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski 				return (getBasePosition() == rCompare.getBasePosition()
443*b1cdbd2cSJim Jagielski                     && getStyle() == rCompare.getStyle()
444*b1cdbd2cSJim Jagielski 					&& getRGBColorA() == rCompare.getRGBColorA()
445*b1cdbd2cSJim Jagielski 					&& getRGBColorB() == rCompare.getRGBColorB()
446*b1cdbd2cSJim Jagielski                     && getDiscreteDashLength() == rCompare.getDiscreteDashLength());
447*b1cdbd2cSJim Jagielski 			}
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski 			return false;
450*b1cdbd2cSJim Jagielski 		}
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(OverlayHelplineStripedPrimitive, PRIMITIVE2D_ID_OVERLAYHELPLINESTRIPEDPRIMITIVE)
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
455*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski namespace drawinglayer
460*b1cdbd2cSJim Jagielski {
461*b1cdbd2cSJim Jagielski 	namespace primitive2d
462*b1cdbd2cSJim Jagielski 	{
OverlayRollingRectanglePrimitive(const basegfx::B2DRange & aRollingRectangle,const basegfx::BColor & rRGBColorA,const basegfx::BColor & rRGBColorB,double fDiscreteDashLength)463*b1cdbd2cSJim Jagielski         OverlayRollingRectanglePrimitive::OverlayRollingRectanglePrimitive(
464*b1cdbd2cSJim Jagielski             const basegfx::B2DRange& aRollingRectangle,
465*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rRGBColorA,
466*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rRGBColorB,
467*b1cdbd2cSJim Jagielski 			double fDiscreteDashLength)
468*b1cdbd2cSJim Jagielski         :   ViewportDependentPrimitive2D(),
469*b1cdbd2cSJim Jagielski 			maRollingRectangle(aRollingRectangle),
470*b1cdbd2cSJim Jagielski 			maRGBColorA(rRGBColorA),
471*b1cdbd2cSJim Jagielski 			maRGBColorB(rRGBColorB),
472*b1cdbd2cSJim Jagielski 			mfDiscreteDashLength(fDiscreteDashLength)
473*b1cdbd2cSJim Jagielski         {}
474*b1cdbd2cSJim Jagielski 
create2DDecomposition(const geometry::ViewInformation2D &) const475*b1cdbd2cSJim Jagielski 		Primitive2DSequence OverlayRollingRectanglePrimitive::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
476*b1cdbd2cSJim Jagielski 		{
477*b1cdbd2cSJim Jagielski             // use the prepared Viewport information accessible using getViewport()
478*b1cdbd2cSJim Jagielski             Primitive2DSequence aRetval;
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski             if(!getViewport().isEmpty())
481*b1cdbd2cSJim Jagielski             {
482*b1cdbd2cSJim Jagielski                 basegfx::B2DPolygon aLine;
483*b1cdbd2cSJim Jagielski                 aRetval.realloc(8);
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski 				// Left lines
486*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getViewport().getMinX(), getRollingRectangle().getMinY()));
487*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getRollingRectangle().getMinY()));
488*b1cdbd2cSJim Jagielski                 aRetval[0] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski                 aLine.clear();
491*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getViewport().getMinX(), getRollingRectangle().getMaxY()));
492*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getRollingRectangle().getMaxY()));
493*b1cdbd2cSJim Jagielski                 aRetval[1] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 				// Right lines
496*b1cdbd2cSJim Jagielski                 aLine.clear();
497*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getRollingRectangle().getMinY()));
498*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getViewport().getMaxX(), getRollingRectangle().getMinY()));
499*b1cdbd2cSJim Jagielski                 aRetval[2] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski                 aLine.clear();
502*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getRollingRectangle().getMaxY()));
503*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getViewport().getMaxX(), getRollingRectangle().getMaxY()));
504*b1cdbd2cSJim Jagielski                 aRetval[3] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski 				// Top lines
507*b1cdbd2cSJim Jagielski                 aLine.clear();
508*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getViewport().getMinY()));
509*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getRollingRectangle().getMinY()));
510*b1cdbd2cSJim Jagielski                 aRetval[4] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski                 aLine.clear();
513*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getViewport().getMinY()));
514*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getRollingRectangle().getMinY()));
515*b1cdbd2cSJim Jagielski                 aRetval[5] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski 				// Bottom lines
518*b1cdbd2cSJim Jagielski                 aLine.clear();
519*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getRollingRectangle().getMaxY()));
520*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getViewport().getMaxY()));
521*b1cdbd2cSJim Jagielski                 aRetval[6] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski                 aLine.clear();
524*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getRollingRectangle().getMaxY()));
525*b1cdbd2cSJim Jagielski                 aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getViewport().getMaxY()));
526*b1cdbd2cSJim Jagielski                 aRetval[7] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
527*b1cdbd2cSJim Jagielski             }
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski             return aRetval;
530*b1cdbd2cSJim Jagielski 		}
531*b1cdbd2cSJim Jagielski 
operator ==(const BasePrimitive2D & rPrimitive) const532*b1cdbd2cSJim Jagielski 		bool OverlayRollingRectanglePrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
533*b1cdbd2cSJim Jagielski 		{
534*b1cdbd2cSJim Jagielski 			if(ViewportDependentPrimitive2D::operator==(rPrimitive))
535*b1cdbd2cSJim Jagielski 			{
536*b1cdbd2cSJim Jagielski 				const OverlayRollingRectanglePrimitive& rCompare = static_cast< const OverlayRollingRectanglePrimitive& >(rPrimitive);
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski 				return (getRollingRectangle() == rCompare.getRollingRectangle()
539*b1cdbd2cSJim Jagielski 					&& getRGBColorA() == rCompare.getRGBColorA()
540*b1cdbd2cSJim Jagielski 					&& getRGBColorB() == rCompare.getRGBColorB()
541*b1cdbd2cSJim Jagielski                     && getDiscreteDashLength() == rCompare.getDiscreteDashLength());
542*b1cdbd2cSJim Jagielski 			}
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski 			return false;
545*b1cdbd2cSJim Jagielski 		}
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski 		ImplPrimitrive2DIDBlock(OverlayRollingRectanglePrimitive, PRIMITIVE2D_ID_OVERLAYROLLINGRECTANGLEPRIMITIVE)
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski 	} // end of namespace primitive2d
550*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
553*b1cdbd2cSJim Jagielski // eof
554