1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_drawinglayer.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <drawinglayer/primitive3d/baseprimitive3d.hxx> 32*cdf0e10cSrcweir #include <drawinglayer/geometry/viewinformation3d.hxx> 33*cdf0e10cSrcweir #include <basegfx/tools/canvastools.hxx> 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir using namespace com::sun::star; 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir namespace drawinglayer 42*cdf0e10cSrcweir { 43*cdf0e10cSrcweir namespace primitive3d 44*cdf0e10cSrcweir { 45*cdf0e10cSrcweir BasePrimitive3D::BasePrimitive3D() 46*cdf0e10cSrcweir : BasePrimitive3DImplBase(m_aMutex) 47*cdf0e10cSrcweir { 48*cdf0e10cSrcweir } 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir BasePrimitive3D::~BasePrimitive3D() 51*cdf0e10cSrcweir { 52*cdf0e10cSrcweir } 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir bool BasePrimitive3D::operator==( const BasePrimitive3D& rPrimitive ) const 55*cdf0e10cSrcweir { 56*cdf0e10cSrcweir return (getPrimitive3DID() == rPrimitive.getPrimitive3DID()); 57*cdf0e10cSrcweir } 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir basegfx::B3DRange BasePrimitive3D::getB3DRange(const geometry::ViewInformation3D& rViewInformation) const 60*cdf0e10cSrcweir { 61*cdf0e10cSrcweir return getB3DRangeFromPrimitive3DSequence(get3DDecomposition(rViewInformation), rViewInformation); 62*cdf0e10cSrcweir } 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir Primitive3DSequence BasePrimitive3D::get3DDecomposition(const geometry::ViewInformation3D& /*rViewInformation*/) const 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir return Primitive3DSequence(); 67*cdf0e10cSrcweir } 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir Primitive3DSequence SAL_CALL BasePrimitive3D::getDecomposition( const uno::Sequence< beans::PropertyValue >& rViewParameters ) throw ( uno::RuntimeException ) 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir const geometry::ViewInformation3D aViewInformation(rViewParameters); 72*cdf0e10cSrcweir return get3DDecomposition(rViewParameters); 73*cdf0e10cSrcweir } 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir com::sun::star::geometry::RealRectangle3D SAL_CALL BasePrimitive3D::getRange( const uno::Sequence< beans::PropertyValue >& rViewParameters ) throw ( uno::RuntimeException ) 76*cdf0e10cSrcweir { 77*cdf0e10cSrcweir const geometry::ViewInformation3D aViewInformation(rViewParameters); 78*cdf0e10cSrcweir return basegfx::unotools::rectangle3DFromB3DRectangle(getB3DRange(aViewInformation)); 79*cdf0e10cSrcweir } 80*cdf0e10cSrcweir } // end of namespace primitive3d 81*cdf0e10cSrcweir } // end of namespace drawinglayer 82*cdf0e10cSrcweir 83*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir namespace drawinglayer 86*cdf0e10cSrcweir { 87*cdf0e10cSrcweir namespace primitive3d 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir Primitive3DSequence BufferedDecompositionPrimitive3D::create3DDecomposition(const geometry::ViewInformation3D& /*rViewInformation*/) const 90*cdf0e10cSrcweir { 91*cdf0e10cSrcweir return Primitive3DSequence(); 92*cdf0e10cSrcweir } 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir BufferedDecompositionPrimitive3D::BufferedDecompositionPrimitive3D() 95*cdf0e10cSrcweir : BasePrimitive3D(), 96*cdf0e10cSrcweir maBuffered3DDecomposition() 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir } 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir Primitive3DSequence BufferedDecompositionPrimitive3D::get3DDecomposition(const geometry::ViewInformation3D& rViewInformation) const 101*cdf0e10cSrcweir { 102*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir if(!getBuffered3DDecomposition().hasElements()) 105*cdf0e10cSrcweir { 106*cdf0e10cSrcweir const Primitive3DSequence aNewSequence(create3DDecomposition(rViewInformation)); 107*cdf0e10cSrcweir const_cast< BufferedDecompositionPrimitive3D* >(this)->setBuffered3DDecomposition(aNewSequence); 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir return getBuffered3DDecomposition(); 111*cdf0e10cSrcweir } 112*cdf0e10cSrcweir } // end of namespace primitive3d 113*cdf0e10cSrcweir } // end of namespace drawinglayer 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 116*cdf0e10cSrcweir // tooling 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir namespace drawinglayer 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir namespace primitive3d 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir // get range3D from a given Primitive3DReference 123*cdf0e10cSrcweir basegfx::B3DRange getB3DRangeFromPrimitive3DReference(const Primitive3DReference& rCandidate, const geometry::ViewInformation3D& aViewInformation) 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir basegfx::B3DRange aRetval; 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir if(rCandidate.is()) 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir // try to get C++ implementation base 130*cdf0e10cSrcweir const BasePrimitive3D* pCandidate(dynamic_cast< BasePrimitive3D* >(rCandidate.get())); 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir if(pCandidate) 133*cdf0e10cSrcweir { 134*cdf0e10cSrcweir // use it if possible 135*cdf0e10cSrcweir aRetval.expand(pCandidate->getB3DRange(aViewInformation)); 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir else 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir // use UNO API call instead 140*cdf0e10cSrcweir const uno::Sequence< beans::PropertyValue >& rViewParameters(aViewInformation.getViewInformationSequence()); 141*cdf0e10cSrcweir aRetval.expand(basegfx::unotools::b3DRectangleFromRealRectangle3D(rCandidate->getRange(rViewParameters))); 142*cdf0e10cSrcweir } 143*cdf0e10cSrcweir } 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir return aRetval; 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir // get range3D from a given Primitive3DSequence 149*cdf0e10cSrcweir basegfx::B3DRange getB3DRangeFromPrimitive3DSequence(const Primitive3DSequence& rCandidate, const geometry::ViewInformation3D& aViewInformation) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir basegfx::B3DRange aRetval; 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir if(rCandidate.hasElements()) 154*cdf0e10cSrcweir { 155*cdf0e10cSrcweir const sal_Int32 nCount(rCandidate.getLength()); 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir for(sal_Int32 a(0L); a < nCount; a++) 158*cdf0e10cSrcweir { 159*cdf0e10cSrcweir aRetval.expand(getB3DRangeFromPrimitive3DReference(rCandidate[a], aViewInformation)); 160*cdf0e10cSrcweir } 161*cdf0e10cSrcweir } 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir return aRetval; 164*cdf0e10cSrcweir } 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir bool arePrimitive3DReferencesEqual(const Primitive3DReference& rxA, const Primitive3DReference& rxB) 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir const sal_Bool bAIs(rxA.is()); 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir if(bAIs != rxB.is()) 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir return false; 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir if(!bAIs) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir return true; 178*cdf0e10cSrcweir } 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir const BasePrimitive3D* pA(dynamic_cast< const BasePrimitive3D* >(rxA.get())); 181*cdf0e10cSrcweir const BasePrimitive3D* pB(dynamic_cast< const BasePrimitive3D* >(rxB.get())); 182*cdf0e10cSrcweir const bool bAEqualZero(pA == 0L); 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir if(bAEqualZero != (pB == 0L)) 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir return false; 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir if(bAEqualZero) 190*cdf0e10cSrcweir { 191*cdf0e10cSrcweir return false; 192*cdf0e10cSrcweir } 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir return (pA->operator==(*pB)); 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir bool arePrimitive3DSequencesEqual(const Primitive3DSequence& rA, const Primitive3DSequence& rB) 198*cdf0e10cSrcweir { 199*cdf0e10cSrcweir const sal_Bool bAHasElements(rA.hasElements()); 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir if(bAHasElements != rB.hasElements()) 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir return false; 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir if(!bAHasElements) 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir return true; 209*cdf0e10cSrcweir } 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir const sal_Int32 nCount(rA.getLength()); 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir if(nCount != rB.getLength()) 214*cdf0e10cSrcweir { 215*cdf0e10cSrcweir return false; 216*cdf0e10cSrcweir } 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir for(sal_Int32 a(0L); a < nCount; a++) 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir if(!arePrimitive3DReferencesEqual(rA[a], rB[a])) 221*cdf0e10cSrcweir { 222*cdf0e10cSrcweir return false; 223*cdf0e10cSrcweir } 224*cdf0e10cSrcweir } 225*cdf0e10cSrcweir 226*cdf0e10cSrcweir return true; 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir // concatenate sequence 230*cdf0e10cSrcweir void appendPrimitive3DSequenceToPrimitive3DSequence(Primitive3DSequence& rDest, const Primitive3DSequence& rSource) 231*cdf0e10cSrcweir { 232*cdf0e10cSrcweir if(rSource.hasElements()) 233*cdf0e10cSrcweir { 234*cdf0e10cSrcweir if(rDest.hasElements()) 235*cdf0e10cSrcweir { 236*cdf0e10cSrcweir const sal_Int32 nSourceCount(rSource.getLength()); 237*cdf0e10cSrcweir const sal_Int32 nDestCount(rDest.getLength()); 238*cdf0e10cSrcweir const sal_Int32 nTargetCount(nSourceCount + nDestCount); 239*cdf0e10cSrcweir sal_Int32 nInsertPos(nDestCount); 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir rDest.realloc(nTargetCount); 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir for(sal_Int32 a(0L); a < nSourceCount; a++) 244*cdf0e10cSrcweir { 245*cdf0e10cSrcweir if(rSource[a].is()) 246*cdf0e10cSrcweir { 247*cdf0e10cSrcweir rDest[nInsertPos++] = rSource[a]; 248*cdf0e10cSrcweir } 249*cdf0e10cSrcweir } 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir if(nInsertPos != nTargetCount) 252*cdf0e10cSrcweir { 253*cdf0e10cSrcweir rDest.realloc(nInsertPos); 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir else 257*cdf0e10cSrcweir { 258*cdf0e10cSrcweir rDest = rSource; 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir } 261*cdf0e10cSrcweir } 262*cdf0e10cSrcweir 263*cdf0e10cSrcweir // concatenate single Primitive3D 264*cdf0e10cSrcweir void appendPrimitive3DReferenceToPrimitive3DSequence(Primitive3DSequence& rDest, const Primitive3DReference& rSource) 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir if(rSource.is()) 267*cdf0e10cSrcweir { 268*cdf0e10cSrcweir const sal_Int32 nDestCount(rDest.getLength()); 269*cdf0e10cSrcweir rDest.realloc(nDestCount + 1L); 270*cdf0e10cSrcweir rDest[nDestCount] = rSource; 271*cdf0e10cSrcweir } 272*cdf0e10cSrcweir } 273*cdf0e10cSrcweir 274*cdf0e10cSrcweir } // end of namespace primitive3d 275*cdf0e10cSrcweir } // end of namespace drawinglayer 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 278*cdf0e10cSrcweir // eof 279