1f6e50924SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file 5f6e50924SAndrew Rist * distributed with this work for additional information 6f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the 8f6e50924SAndrew Rist * "License"); you may not use this file except in compliance 9f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at 10f6e50924SAndrew Rist * 11f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12f6e50924SAndrew Rist * 13f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing, 14f6e50924SAndrew Rist * software distributed under the License is distributed on an 15f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16f6e50924SAndrew Rist * KIND, either express or implied. See the License for the 17f6e50924SAndrew Rist * specific language governing permissions and limitations 18f6e50924SAndrew Rist * under the License. 19f6e50924SAndrew Rist * 20f6e50924SAndrew Rist *************************************************************/ 21f6e50924SAndrew Rist 22f6e50924SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include "precompiled_svx.hxx" 25cdf0e10cSrcweir #include <svx/sdr/primitive2d/sdrellipseprimitive2d.hxx> 26cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx> 27cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx> 28cdf0e10cSrcweir #include <svx/sdr/primitive2d/sdrdecompositiontools.hxx> 29cdf0e10cSrcweir #include <drawinglayer/primitive2d/groupprimitive2d.hxx> 30cdf0e10cSrcweir #include <svx/sdr/primitive2d/svx_primitivetypes2d.hxx> 31cdf0e10cSrcweir #include <basegfx/color/bcolor.hxx> 32cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrixtools.hxx> 33cdf0e10cSrcweir #include <drawinglayer/primitive2d/sdrdecompositiontools2d.hxx> 34cdf0e10cSrcweir 35cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 36cdf0e10cSrcweir 37cdf0e10cSrcweir using namespace com::sun::star; 38cdf0e10cSrcweir 39cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 40cdf0e10cSrcweir 41cdf0e10cSrcweir namespace drawinglayer 42cdf0e10cSrcweir { 43cdf0e10cSrcweir namespace primitive2d 44cdf0e10cSrcweir { create2DDecomposition(const geometry::ViewInformation2D &) const45cdf0e10cSrcweir Primitive2DSequence SdrEllipsePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*aViewInformation*/) const 46cdf0e10cSrcweir { 47cdf0e10cSrcweir Primitive2DSequence aRetval; 48cdf0e10cSrcweir 49cdf0e10cSrcweir // create unit outline polygon 50cdf0e10cSrcweir // Do use createPolygonFromUnitCircle, but let create from first quadrant to mimic old geometry creation. 51cdf0e10cSrcweir // This is needed to have the same look when stroke is used since the polygon start point defines the 52cdf0e10cSrcweir // stroke start, too. 53cdf0e10cSrcweir basegfx::B2DPolygon aUnitOutline(basegfx::tools::createPolygonFromUnitCircle(1)); 54cdf0e10cSrcweir 55cdf0e10cSrcweir // scale and move UnitEllipse to UnitObject (-1,-1 1,1) -> (0,0 1,1) 56cdf0e10cSrcweir const basegfx::B2DHomMatrix aUnitCorrectionMatrix( 57cdf0e10cSrcweir basegfx::tools::createScaleTranslateB2DHomMatrix(0.5, 0.5, 0.5, 0.5)); 58cdf0e10cSrcweir 59cdf0e10cSrcweir // apply to the geometry 60cdf0e10cSrcweir aUnitOutline.transform(aUnitCorrectionMatrix); 61cdf0e10cSrcweir 62*64b14621SArmin Le Grand // add fill 63*64b14621SArmin Le Grand if(!getSdrLFSTAttribute().getFill().isDefault()) 64*64b14621SArmin Le Grand { 65*64b14621SArmin Le Grand basegfx::B2DPolyPolygon aTransformed(aUnitOutline); 66*64b14621SArmin Le Grand 67*64b14621SArmin Le Grand aTransformed.transform(getTransform()); 68*64b14621SArmin Le Grand appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, 69cdf0e10cSrcweir createPolyPolygonFillPrimitive( 70*64b14621SArmin Le Grand aTransformed, 71cdf0e10cSrcweir getSdrLFSTAttribute().getFill(), 72cdf0e10cSrcweir getSdrLFSTAttribute().getFillFloatTransGradient())); 73cdf0e10cSrcweir } 74cdf0e10cSrcweir 75cdf0e10cSrcweir // add line 76cdf0e10cSrcweir if(getSdrLFSTAttribute().getLine().isDefault()) 77cdf0e10cSrcweir { 78cdf0e10cSrcweir // create invisible line for HitTest/BoundRect 79cdf0e10cSrcweir appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, 80cdf0e10cSrcweir createHiddenGeometryPrimitives2D( 81cdf0e10cSrcweir false, 82cdf0e10cSrcweir basegfx::B2DPolyPolygon(aUnitOutline), 83cdf0e10cSrcweir getTransform())); 84*64b14621SArmin Le Grand } 85*64b14621SArmin Le Grand else 86*64b14621SArmin Le Grand { 87*64b14621SArmin Le Grand basegfx::B2DPolygon aTransformed(aUnitOutline); 88*64b14621SArmin Le Grand 89*64b14621SArmin Le Grand aTransformed.transform(getTransform()); 90*64b14621SArmin Le Grand appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, 91cdf0e10cSrcweir createPolygonLinePrimitive( 92*64b14621SArmin Le Grand aTransformed, 93cdf0e10cSrcweir getSdrLFSTAttribute().getLine(), 94cdf0e10cSrcweir attribute::SdrLineStartEndAttribute())); 95cdf0e10cSrcweir } 96cdf0e10cSrcweir 97cdf0e10cSrcweir // add text 98cdf0e10cSrcweir if(!getSdrLFSTAttribute().getText().isDefault()) 99cdf0e10cSrcweir { 100cdf0e10cSrcweir appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, 101cdf0e10cSrcweir createTextPrimitive( 102cdf0e10cSrcweir basegfx::B2DPolyPolygon(aUnitOutline), 103cdf0e10cSrcweir getTransform(), 104cdf0e10cSrcweir getSdrLFSTAttribute().getText(), 105cdf0e10cSrcweir getSdrLFSTAttribute().getLine(), 106cdf0e10cSrcweir false, 107cdf0e10cSrcweir false, 108cdf0e10cSrcweir false)); 109cdf0e10cSrcweir } 110cdf0e10cSrcweir 111cdf0e10cSrcweir // add shadow 112cdf0e10cSrcweir if(!getSdrLFSTAttribute().getShadow().isDefault()) 113cdf0e10cSrcweir { 114cdf0e10cSrcweir aRetval = createEmbeddedShadowPrimitive( 115cdf0e10cSrcweir aRetval, 116cdf0e10cSrcweir getSdrLFSTAttribute().getShadow()); 117cdf0e10cSrcweir } 118cdf0e10cSrcweir 119cdf0e10cSrcweir return aRetval; 120cdf0e10cSrcweir } 121cdf0e10cSrcweir SdrEllipsePrimitive2D(const basegfx::B2DHomMatrix & rTransform,const attribute::SdrLineFillShadowTextAttribute & rSdrLFSTAttribute)122cdf0e10cSrcweir SdrEllipsePrimitive2D::SdrEllipsePrimitive2D( 123cdf0e10cSrcweir const basegfx::B2DHomMatrix& rTransform, 124cdf0e10cSrcweir const attribute::SdrLineFillShadowTextAttribute& rSdrLFSTAttribute) 125cdf0e10cSrcweir : BufferedDecompositionPrimitive2D(), 126cdf0e10cSrcweir maTransform(rTransform), 127cdf0e10cSrcweir maSdrLFSTAttribute(rSdrLFSTAttribute) 128cdf0e10cSrcweir { 129cdf0e10cSrcweir } 130cdf0e10cSrcweir operator ==(const BasePrimitive2D & rPrimitive) const131cdf0e10cSrcweir bool SdrEllipsePrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const 132cdf0e10cSrcweir { 133cdf0e10cSrcweir if(BufferedDecompositionPrimitive2D::operator==(rPrimitive)) 134cdf0e10cSrcweir { 135cdf0e10cSrcweir const SdrEllipsePrimitive2D& rCompare = (SdrEllipsePrimitive2D&)rPrimitive; 136cdf0e10cSrcweir 137cdf0e10cSrcweir return (getTransform() == rCompare.getTransform() 138cdf0e10cSrcweir && getSdrLFSTAttribute() == rCompare.getSdrLFSTAttribute()); 139cdf0e10cSrcweir } 140cdf0e10cSrcweir 141cdf0e10cSrcweir return false; 142cdf0e10cSrcweir } 143cdf0e10cSrcweir 144cdf0e10cSrcweir // provide unique ID 145cdf0e10cSrcweir ImplPrimitrive2DIDBlock(SdrEllipsePrimitive2D, PRIMITIVE2D_ID_SDRELLIPSEPRIMITIVE2D) 146cdf0e10cSrcweir 147cdf0e10cSrcweir } // end of namespace primitive2d 148cdf0e10cSrcweir } // end of namespace drawinglayer 149cdf0e10cSrcweir 150cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 151cdf0e10cSrcweir 152cdf0e10cSrcweir namespace drawinglayer 153cdf0e10cSrcweir { 154cdf0e10cSrcweir namespace primitive2d 155cdf0e10cSrcweir { create2DDecomposition(const geometry::ViewInformation2D &) const156cdf0e10cSrcweir Primitive2DSequence SdrEllipseSegmentPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*aViewInformation*/) const 157cdf0e10cSrcweir { 158cdf0e10cSrcweir Primitive2DSequence aRetval; 159cdf0e10cSrcweir 160cdf0e10cSrcweir // create unit outline polygon 161cdf0e10cSrcweir basegfx::B2DPolygon aUnitOutline(basegfx::tools::createPolygonFromUnitEllipseSegment(mfStartAngle, mfEndAngle)); 162cdf0e10cSrcweir 163cdf0e10cSrcweir if(mbCloseSegment) 164cdf0e10cSrcweir { 165cdf0e10cSrcweir if(mbCloseUsingCenter) 166cdf0e10cSrcweir { 167cdf0e10cSrcweir // for compatibility, insert the center point at polygon start to get the same 168cdf0e10cSrcweir // line stroking pattern as the old painting mechanisms. 169cdf0e10cSrcweir aUnitOutline.insert(0L, basegfx::B2DPoint(0.0, 0.0)); 170cdf0e10cSrcweir } 171cdf0e10cSrcweir 172cdf0e10cSrcweir aUnitOutline.setClosed(true); 173cdf0e10cSrcweir } 174cdf0e10cSrcweir 175cdf0e10cSrcweir // move and scale UnitEllipse to UnitObject (-1,-1 1,1) -> (0,0 1,1) 176cdf0e10cSrcweir const basegfx::B2DHomMatrix aUnitCorrectionMatrix( 177cdf0e10cSrcweir basegfx::tools::createScaleTranslateB2DHomMatrix(0.5, 0.5, 0.5, 0.5)); 178cdf0e10cSrcweir 179cdf0e10cSrcweir // apply to the geometry 180cdf0e10cSrcweir aUnitOutline.transform(aUnitCorrectionMatrix); 181cdf0e10cSrcweir 182*64b14621SArmin Le Grand // add fill 183*64b14621SArmin Le Grand if(!getSdrLFSTAttribute().getFill().isDefault() && aUnitOutline.isClosed()) 184*64b14621SArmin Le Grand { 185*64b14621SArmin Le Grand basegfx::B2DPolyPolygon aTransformed(aUnitOutline); 186*64b14621SArmin Le Grand 187*64b14621SArmin Le Grand aTransformed.transform(getTransform()); 188*64b14621SArmin Le Grand appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, 189cdf0e10cSrcweir createPolyPolygonFillPrimitive( 190*64b14621SArmin Le Grand aTransformed, 191cdf0e10cSrcweir getSdrLFSTAttribute().getFill(), 192cdf0e10cSrcweir getSdrLFSTAttribute().getFillFloatTransGradient())); 193cdf0e10cSrcweir } 194cdf0e10cSrcweir 195cdf0e10cSrcweir // add line 196cdf0e10cSrcweir if(getSdrLFSTAttribute().getLine().isDefault()) 197cdf0e10cSrcweir { 198cdf0e10cSrcweir // create invisible line for HitTest/BoundRect 199cdf0e10cSrcweir appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, 200cdf0e10cSrcweir createHiddenGeometryPrimitives2D( 201cdf0e10cSrcweir false, 202cdf0e10cSrcweir basegfx::B2DPolyPolygon(aUnitOutline), 203cdf0e10cSrcweir getTransform())); 204*64b14621SArmin Le Grand } 205*64b14621SArmin Le Grand else 206*64b14621SArmin Le Grand { 207*64b14621SArmin Le Grand basegfx::B2DPolygon aTransformed(aUnitOutline); 208*64b14621SArmin Le Grand 209*64b14621SArmin Le Grand aTransformed.transform(getTransform()); 210*64b14621SArmin Le Grand appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, 211cdf0e10cSrcweir createPolygonLinePrimitive( 212*64b14621SArmin Le Grand aTransformed, 213cdf0e10cSrcweir getSdrLFSTAttribute().getLine(), 214cdf0e10cSrcweir getSdrLFSTAttribute().getLineStartEnd())); 215cdf0e10cSrcweir } 216cdf0e10cSrcweir 217cdf0e10cSrcweir // add text 218cdf0e10cSrcweir if(!getSdrLFSTAttribute().getText().isDefault()) 219cdf0e10cSrcweir { 220cdf0e10cSrcweir appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, 221cdf0e10cSrcweir createTextPrimitive( 222cdf0e10cSrcweir basegfx::B2DPolyPolygon(aUnitOutline), 223cdf0e10cSrcweir getTransform(), 224cdf0e10cSrcweir getSdrLFSTAttribute().getText(), 225cdf0e10cSrcweir getSdrLFSTAttribute().getLine(), 226cdf0e10cSrcweir false, 227cdf0e10cSrcweir false, 228cdf0e10cSrcweir false)); 229cdf0e10cSrcweir } 230cdf0e10cSrcweir 231cdf0e10cSrcweir // add shadow 232cdf0e10cSrcweir if(!getSdrLFSTAttribute().getShadow().isDefault()) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir aRetval = createEmbeddedShadowPrimitive( 235cdf0e10cSrcweir aRetval, 236cdf0e10cSrcweir getSdrLFSTAttribute().getShadow()); 237cdf0e10cSrcweir } 238cdf0e10cSrcweir 239cdf0e10cSrcweir return aRetval; 240cdf0e10cSrcweir } 241cdf0e10cSrcweir SdrEllipseSegmentPrimitive2D(const basegfx::B2DHomMatrix & rTransform,const attribute::SdrLineFillShadowTextAttribute & rSdrLFSTAttribute,double fStartAngle,double fEndAngle,bool bCloseSegment,bool bCloseUsingCenter)242cdf0e10cSrcweir SdrEllipseSegmentPrimitive2D::SdrEllipseSegmentPrimitive2D( 243cdf0e10cSrcweir const basegfx::B2DHomMatrix& rTransform, 244cdf0e10cSrcweir const attribute::SdrLineFillShadowTextAttribute& rSdrLFSTAttribute, 245cdf0e10cSrcweir double fStartAngle, 246cdf0e10cSrcweir double fEndAngle, 247cdf0e10cSrcweir bool bCloseSegment, 248cdf0e10cSrcweir bool bCloseUsingCenter) 249cdf0e10cSrcweir : SdrEllipsePrimitive2D(rTransform, rSdrLFSTAttribute), 250cdf0e10cSrcweir mfStartAngle(fStartAngle), 251cdf0e10cSrcweir mfEndAngle(fEndAngle), 252cdf0e10cSrcweir mbCloseSegment(bCloseSegment), 253cdf0e10cSrcweir mbCloseUsingCenter(bCloseUsingCenter) 254cdf0e10cSrcweir { 255cdf0e10cSrcweir } 256cdf0e10cSrcweir operator ==(const BasePrimitive2D & rPrimitive) const257cdf0e10cSrcweir bool SdrEllipseSegmentPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const 258cdf0e10cSrcweir { 259cdf0e10cSrcweir if(SdrEllipsePrimitive2D::operator==(rPrimitive)) 260cdf0e10cSrcweir { 261cdf0e10cSrcweir const SdrEllipseSegmentPrimitive2D& rCompare = (SdrEllipseSegmentPrimitive2D&)rPrimitive; 262cdf0e10cSrcweir 263cdf0e10cSrcweir if( mfStartAngle == rCompare.mfStartAngle 264cdf0e10cSrcweir && mfEndAngle == rCompare.mfEndAngle 265cdf0e10cSrcweir && mbCloseSegment == rCompare.mbCloseSegment 266cdf0e10cSrcweir && mbCloseUsingCenter == rCompare.mbCloseUsingCenter) 267cdf0e10cSrcweir { 268cdf0e10cSrcweir return true; 269cdf0e10cSrcweir } 270cdf0e10cSrcweir } 271cdf0e10cSrcweir 272cdf0e10cSrcweir return false; 273cdf0e10cSrcweir } 274cdf0e10cSrcweir 275cdf0e10cSrcweir // provide unique ID 276cdf0e10cSrcweir ImplPrimitrive2DIDBlock(SdrEllipseSegmentPrimitive2D, PRIMITIVE2D_ID_SDRELLIPSESEGMENTPRIMITIVE2D) 277cdf0e10cSrcweir 278cdf0e10cSrcweir } // end of namespace primitive2d 279cdf0e10cSrcweir } // end of namespace drawinglayer 280cdf0e10cSrcweir 281cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 282cdf0e10cSrcweir // eof 283