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/baseprimitive2d.hxx> 28*b1cdbd2cSJim Jagielski #include <drawinglayer/geometry/viewinformation2d.hxx> 29*b1cdbd2cSJim Jagielski #include <basegfx/tools/canvastools.hxx> 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski using namespace com::sun::star; 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski namespace drawinglayer 38*b1cdbd2cSJim Jagielski { 39*b1cdbd2cSJim Jagielski namespace primitive2d 40*b1cdbd2cSJim Jagielski { BasePrimitive2D()41*b1cdbd2cSJim Jagielski BasePrimitive2D::BasePrimitive2D() 42*b1cdbd2cSJim Jagielski : BasePrimitive2DImplBase(m_aMutex) 43*b1cdbd2cSJim Jagielski { 44*b1cdbd2cSJim Jagielski } 45*b1cdbd2cSJim Jagielski ~BasePrimitive2D()46*b1cdbd2cSJim Jagielski BasePrimitive2D::~BasePrimitive2D() 47*b1cdbd2cSJim Jagielski { 48*b1cdbd2cSJim Jagielski } 49*b1cdbd2cSJim Jagielski operator ==(const BasePrimitive2D & rPrimitive) const50*b1cdbd2cSJim Jagielski bool BasePrimitive2D::operator==( const BasePrimitive2D& rPrimitive ) const 51*b1cdbd2cSJim Jagielski { 52*b1cdbd2cSJim Jagielski return (getPrimitive2DID() == rPrimitive.getPrimitive2DID()); 53*b1cdbd2cSJim Jagielski } 54*b1cdbd2cSJim Jagielski getB2DRange(const geometry::ViewInformation2D & rViewInformation) const55*b1cdbd2cSJim Jagielski basegfx::B2DRange BasePrimitive2D::getB2DRange(const geometry::ViewInformation2D& rViewInformation) const 56*b1cdbd2cSJim Jagielski { 57*b1cdbd2cSJim Jagielski return getB2DRangeFromPrimitive2DSequence(get2DDecomposition(rViewInformation), rViewInformation); 58*b1cdbd2cSJim Jagielski } 59*b1cdbd2cSJim Jagielski get2DDecomposition(const geometry::ViewInformation2D &) const60*b1cdbd2cSJim Jagielski Primitive2DSequence BasePrimitive2D::get2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const 61*b1cdbd2cSJim Jagielski { 62*b1cdbd2cSJim Jagielski return Primitive2DSequence(); 63*b1cdbd2cSJim Jagielski } 64*b1cdbd2cSJim Jagielski getDecomposition(const uno::Sequence<beans::PropertyValue> & rViewParameters)65*b1cdbd2cSJim Jagielski Primitive2DSequence SAL_CALL BasePrimitive2D::getDecomposition( const uno::Sequence< beans::PropertyValue >& rViewParameters ) throw ( uno::RuntimeException ) 66*b1cdbd2cSJim Jagielski { 67*b1cdbd2cSJim Jagielski const geometry::ViewInformation2D aViewInformation(rViewParameters); 68*b1cdbd2cSJim Jagielski return get2DDecomposition(aViewInformation); 69*b1cdbd2cSJim Jagielski } 70*b1cdbd2cSJim Jagielski getRange(const uno::Sequence<beans::PropertyValue> & rViewParameters)71*b1cdbd2cSJim Jagielski com::sun::star::geometry::RealRectangle2D SAL_CALL BasePrimitive2D::getRange( const uno::Sequence< beans::PropertyValue >& rViewParameters ) throw ( uno::RuntimeException ) 72*b1cdbd2cSJim Jagielski { 73*b1cdbd2cSJim Jagielski const geometry::ViewInformation2D aViewInformation(rViewParameters); 74*b1cdbd2cSJim Jagielski return basegfx::unotools::rectangle2DFromB2DRectangle(getB2DRange(aViewInformation)); 75*b1cdbd2cSJim Jagielski } 76*b1cdbd2cSJim Jagielski } // end of namespace primitive2d 77*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski namespace drawinglayer 82*b1cdbd2cSJim Jagielski { 83*b1cdbd2cSJim Jagielski namespace primitive2d 84*b1cdbd2cSJim Jagielski { create2DDecomposition(const geometry::ViewInformation2D &) const85*b1cdbd2cSJim Jagielski Primitive2DSequence BufferedDecompositionPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const 86*b1cdbd2cSJim Jagielski { 87*b1cdbd2cSJim Jagielski return Primitive2DSequence(); 88*b1cdbd2cSJim Jagielski } 89*b1cdbd2cSJim Jagielski BufferedDecompositionPrimitive2D()90*b1cdbd2cSJim Jagielski BufferedDecompositionPrimitive2D::BufferedDecompositionPrimitive2D() 91*b1cdbd2cSJim Jagielski : BasePrimitive2D(), 92*b1cdbd2cSJim Jagielski maBuffered2DDecomposition() 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski } 95*b1cdbd2cSJim Jagielski get2DDecomposition(const geometry::ViewInformation2D & rViewInformation) const96*b1cdbd2cSJim Jagielski Primitive2DSequence BufferedDecompositionPrimitive2D::get2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const 97*b1cdbd2cSJim Jagielski { 98*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski if(!getBuffered2DDecomposition().hasElements()) 101*b1cdbd2cSJim Jagielski { 102*b1cdbd2cSJim Jagielski const Primitive2DSequence aNewSequence(create2DDecomposition(rViewInformation)); 103*b1cdbd2cSJim Jagielski const_cast< BufferedDecompositionPrimitive2D* >(this)->setBuffered2DDecomposition(aNewSequence); 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski return getBuffered2DDecomposition(); 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski } // end of namespace primitive2d 109*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 112*b1cdbd2cSJim Jagielski // tooling 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski namespace drawinglayer 115*b1cdbd2cSJim Jagielski { 116*b1cdbd2cSJim Jagielski namespace primitive2d 117*b1cdbd2cSJim Jagielski { 118*b1cdbd2cSJim Jagielski // convert helper stl vector of primitives to Primitive2DSequence Primitive2DVectorToPrimitive2DSequence(const Primitive2DVector & rSource,bool bInvert)119*b1cdbd2cSJim Jagielski Primitive2DSequence Primitive2DVectorToPrimitive2DSequence(const Primitive2DVector& rSource, bool bInvert) 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski const sal_uInt32 nSize(rSource.size()); 122*b1cdbd2cSJim Jagielski Primitive2DSequence aRetval; 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski aRetval.realloc(nSize); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski for(sal_uInt32 a(0); a < nSize; a++) 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski aRetval[bInvert ? nSize - 1 - a : a] = rSource[a]; 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski // all entries taken over to Uno References as owners. To avoid 132*b1cdbd2cSJim Jagielski // errors with users of this mechanism to delete pointers to BasePrimitive2D 133*b1cdbd2cSJim Jagielski // itself, clear given vector 134*b1cdbd2cSJim Jagielski const_cast< Primitive2DVector& >(rSource).clear(); 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski return aRetval; 137*b1cdbd2cSJim Jagielski } 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski // get B2DRange from a given Primitive2DReference getB2DRangeFromPrimitive2DReference(const Primitive2DReference & rCandidate,const geometry::ViewInformation2D & aViewInformation)140*b1cdbd2cSJim Jagielski basegfx::B2DRange getB2DRangeFromPrimitive2DReference(const Primitive2DReference& rCandidate, const geometry::ViewInformation2D& aViewInformation) 141*b1cdbd2cSJim Jagielski { 142*b1cdbd2cSJim Jagielski basegfx::B2DRange aRetval; 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski if(rCandidate.is()) 145*b1cdbd2cSJim Jagielski { 146*b1cdbd2cSJim Jagielski // try to get C++ implementation base 147*b1cdbd2cSJim Jagielski const BasePrimitive2D* pCandidate(dynamic_cast< BasePrimitive2D* >(rCandidate.get())); 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski if(pCandidate) 150*b1cdbd2cSJim Jagielski { 151*b1cdbd2cSJim Jagielski // use it if possible 152*b1cdbd2cSJim Jagielski aRetval.expand(pCandidate->getB2DRange(aViewInformation)); 153*b1cdbd2cSJim Jagielski } 154*b1cdbd2cSJim Jagielski else 155*b1cdbd2cSJim Jagielski { 156*b1cdbd2cSJim Jagielski // use UNO API call instead 157*b1cdbd2cSJim Jagielski const uno::Sequence< beans::PropertyValue >& rViewParameters(aViewInformation.getViewInformationSequence()); 158*b1cdbd2cSJim Jagielski aRetval.expand(basegfx::unotools::b2DRectangleFromRealRectangle2D(rCandidate->getRange(rViewParameters))); 159*b1cdbd2cSJim Jagielski } 160*b1cdbd2cSJim Jagielski } 161*b1cdbd2cSJim Jagielski 162*b1cdbd2cSJim Jagielski return aRetval; 163*b1cdbd2cSJim Jagielski } 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim Jagielski // get B2DRange from a given Primitive2DSequence getB2DRangeFromPrimitive2DSequence(const Primitive2DSequence & rCandidate,const geometry::ViewInformation2D & aViewInformation)166*b1cdbd2cSJim Jagielski basegfx::B2DRange getB2DRangeFromPrimitive2DSequence(const Primitive2DSequence& rCandidate, const geometry::ViewInformation2D& aViewInformation) 167*b1cdbd2cSJim Jagielski { 168*b1cdbd2cSJim Jagielski basegfx::B2DRange aRetval; 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski if(rCandidate.hasElements()) 171*b1cdbd2cSJim Jagielski { 172*b1cdbd2cSJim Jagielski const sal_Int32 nCount(rCandidate.getLength()); 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski for(sal_Int32 a(0L); a < nCount; a++) 175*b1cdbd2cSJim Jagielski { 176*b1cdbd2cSJim Jagielski aRetval.expand(getB2DRangeFromPrimitive2DReference(rCandidate[a], aViewInformation)); 177*b1cdbd2cSJim Jagielski } 178*b1cdbd2cSJim Jagielski } 179*b1cdbd2cSJim Jagielski 180*b1cdbd2cSJim Jagielski return aRetval; 181*b1cdbd2cSJim Jagielski } 182*b1cdbd2cSJim Jagielski arePrimitive2DReferencesEqual(const Primitive2DReference & rxA,const Primitive2DReference & rxB)183*b1cdbd2cSJim Jagielski bool arePrimitive2DReferencesEqual(const Primitive2DReference& rxA, const Primitive2DReference& rxB) 184*b1cdbd2cSJim Jagielski { 185*b1cdbd2cSJim Jagielski const sal_Bool bAIs(rxA.is()); 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski if(bAIs != rxB.is()) 188*b1cdbd2cSJim Jagielski { 189*b1cdbd2cSJim Jagielski return false; 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski if(!bAIs) 193*b1cdbd2cSJim Jagielski { 194*b1cdbd2cSJim Jagielski return true; 195*b1cdbd2cSJim Jagielski } 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski const BasePrimitive2D* pA(dynamic_cast< const BasePrimitive2D* >(rxA.get())); 198*b1cdbd2cSJim Jagielski const BasePrimitive2D* pB(dynamic_cast< const BasePrimitive2D* >(rxB.get())); 199*b1cdbd2cSJim Jagielski const bool bAEqualZero(pA == 0L); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski if(bAEqualZero != (pB == 0L)) 202*b1cdbd2cSJim Jagielski { 203*b1cdbd2cSJim Jagielski return false; 204*b1cdbd2cSJim Jagielski } 205*b1cdbd2cSJim Jagielski 206*b1cdbd2cSJim Jagielski if(bAEqualZero) 207*b1cdbd2cSJim Jagielski { 208*b1cdbd2cSJim Jagielski return false; 209*b1cdbd2cSJim Jagielski } 210*b1cdbd2cSJim Jagielski 211*b1cdbd2cSJim Jagielski return (pA->operator==(*pB)); 212*b1cdbd2cSJim Jagielski } 213*b1cdbd2cSJim Jagielski arePrimitive2DSequencesEqual(const Primitive2DSequence & rA,const Primitive2DSequence & rB)214*b1cdbd2cSJim Jagielski bool arePrimitive2DSequencesEqual(const Primitive2DSequence& rA, const Primitive2DSequence& rB) 215*b1cdbd2cSJim Jagielski { 216*b1cdbd2cSJim Jagielski const sal_Bool bAHasElements(rA.hasElements()); 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski if(bAHasElements != rB.hasElements()) 219*b1cdbd2cSJim Jagielski { 220*b1cdbd2cSJim Jagielski return false; 221*b1cdbd2cSJim Jagielski } 222*b1cdbd2cSJim Jagielski 223*b1cdbd2cSJim Jagielski if(!bAHasElements) 224*b1cdbd2cSJim Jagielski { 225*b1cdbd2cSJim Jagielski return true; 226*b1cdbd2cSJim Jagielski } 227*b1cdbd2cSJim Jagielski 228*b1cdbd2cSJim Jagielski const sal_Int32 nCount(rA.getLength()); 229*b1cdbd2cSJim Jagielski 230*b1cdbd2cSJim Jagielski if(nCount != rB.getLength()) 231*b1cdbd2cSJim Jagielski { 232*b1cdbd2cSJim Jagielski return false; 233*b1cdbd2cSJim Jagielski } 234*b1cdbd2cSJim Jagielski 235*b1cdbd2cSJim Jagielski for(sal_Int32 a(0L); a < nCount; a++) 236*b1cdbd2cSJim Jagielski { 237*b1cdbd2cSJim Jagielski if(!arePrimitive2DReferencesEqual(rA[a], rB[a])) 238*b1cdbd2cSJim Jagielski { 239*b1cdbd2cSJim Jagielski return false; 240*b1cdbd2cSJim Jagielski } 241*b1cdbd2cSJim Jagielski } 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski return true; 244*b1cdbd2cSJim Jagielski } 245*b1cdbd2cSJim Jagielski 246*b1cdbd2cSJim Jagielski // concatenate sequence appendPrimitive2DSequenceToPrimitive2DSequence(Primitive2DSequence & rDest,const Primitive2DSequence & rSource)247*b1cdbd2cSJim Jagielski void appendPrimitive2DSequenceToPrimitive2DSequence(Primitive2DSequence& rDest, const Primitive2DSequence& rSource) 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski if(rSource.hasElements()) 250*b1cdbd2cSJim Jagielski { 251*b1cdbd2cSJim Jagielski if(rDest.hasElements()) 252*b1cdbd2cSJim Jagielski { 253*b1cdbd2cSJim Jagielski const sal_Int32 nSourceCount(rSource.getLength()); 254*b1cdbd2cSJim Jagielski const sal_Int32 nDestCount(rDest.getLength()); 255*b1cdbd2cSJim Jagielski const sal_Int32 nTargetCount(nSourceCount + nDestCount); 256*b1cdbd2cSJim Jagielski sal_Int32 nInsertPos(nDestCount); 257*b1cdbd2cSJim Jagielski 258*b1cdbd2cSJim Jagielski rDest.realloc(nTargetCount); 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski for(sal_Int32 a(0L); a < nSourceCount; a++) 261*b1cdbd2cSJim Jagielski { 262*b1cdbd2cSJim Jagielski if(rSource[a].is()) 263*b1cdbd2cSJim Jagielski { 264*b1cdbd2cSJim Jagielski rDest[nInsertPos++] = rSource[a]; 265*b1cdbd2cSJim Jagielski } 266*b1cdbd2cSJim Jagielski } 267*b1cdbd2cSJim Jagielski 268*b1cdbd2cSJim Jagielski if(nInsertPos != nTargetCount) 269*b1cdbd2cSJim Jagielski { 270*b1cdbd2cSJim Jagielski rDest.realloc(nInsertPos); 271*b1cdbd2cSJim Jagielski } 272*b1cdbd2cSJim Jagielski } 273*b1cdbd2cSJim Jagielski else 274*b1cdbd2cSJim Jagielski { 275*b1cdbd2cSJim Jagielski rDest = rSource; 276*b1cdbd2cSJim Jagielski } 277*b1cdbd2cSJim Jagielski } 278*b1cdbd2cSJim Jagielski } 279*b1cdbd2cSJim Jagielski 280*b1cdbd2cSJim Jagielski // concatenate single Primitive2D appendPrimitive2DReferenceToPrimitive2DSequence(Primitive2DSequence & rDest,const Primitive2DReference & rSource)281*b1cdbd2cSJim Jagielski void appendPrimitive2DReferenceToPrimitive2DSequence(Primitive2DSequence& rDest, const Primitive2DReference& rSource) 282*b1cdbd2cSJim Jagielski { 283*b1cdbd2cSJim Jagielski if(rSource.is()) 284*b1cdbd2cSJim Jagielski { 285*b1cdbd2cSJim Jagielski const sal_Int32 nDestCount(rDest.getLength()); 286*b1cdbd2cSJim Jagielski rDest.realloc(nDestCount + 1L); 287*b1cdbd2cSJim Jagielski rDest[nDestCount] = rSource; 288*b1cdbd2cSJim Jagielski } 289*b1cdbd2cSJim Jagielski } 290*b1cdbd2cSJim Jagielski 291*b1cdbd2cSJim Jagielski } // end of namespace primitive2d 292*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer 293*b1cdbd2cSJim Jagielski 294*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 295*b1cdbd2cSJim Jagielski // eof 296