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