From d3dff92c74bdf0fdb8b638d85fd5a41a64bd96c9 Mon Sep 17 00:00:00 2001 From: Thomas Arnhold Date: Wed, 3 Apr 2013 02:35:54 +0200 Subject: fdo#62525: use cow_wrapper for SdrSceneAttribute Change-Id: Iaedb5080f341482c3ac4f4e0548be49801c5f0b2 --- .../drawinglayer/attribute/sdrsceneattribute3d.hxx | 6 +- .../source/attribute/sdrsceneattribute3d.cxx | 85 ++++++---------------- 2 files changed, 27 insertions(+), 64 deletions(-) (limited to 'drawinglayer') diff --git a/drawinglayer/inc/drawinglayer/attribute/sdrsceneattribute3d.hxx b/drawinglayer/inc/drawinglayer/attribute/sdrsceneattribute3d.hxx index 27107e43dc9b..61d4d8a67378 100644 --- a/drawinglayer/inc/drawinglayer/attribute/sdrsceneattribute3d.hxx +++ b/drawinglayer/inc/drawinglayer/attribute/sdrsceneattribute3d.hxx @@ -24,6 +24,7 @@ #include #include +#include ////////////////////////////////////////////////////////////////////////////// // predefines @@ -40,8 +41,11 @@ namespace drawinglayer { class DRAWINGLAYER_DLLPUBLIC SdrSceneAttribute { + public: + typedef o3tl::cow_wrapper< ImpSdrSceneAttribute > ImplType; + private: - ImpSdrSceneAttribute* mpSdrSceneAttribute; + ImplType mpSdrSceneAttribute; public: /// constructors/assignmentoperator/destructor diff --git a/drawinglayer/source/attribute/sdrsceneattribute3d.cxx b/drawinglayer/source/attribute/sdrsceneattribute3d.cxx index 6f270140757f..f5d0e82b4cec 100644 --- a/drawinglayer/source/attribute/sdrsceneattribute3d.cxx +++ b/drawinglayer/source/attribute/sdrsceneattribute3d.cxx @@ -18,6 +18,7 @@ */ #include +#include ////////////////////////////////////////////////////////////////////////////// @@ -28,9 +29,6 @@ namespace drawinglayer class ImpSdrSceneAttribute { public: - // refcounter - sal_uInt32 mnRefCount; - // 3D scene attribute definitions double mfDistance; double mfShadowSlant; @@ -47,8 +45,7 @@ namespace drawinglayer ::com::sun::star::drawing::ProjectionMode aProjectionMode, ::com::sun::star::drawing::ShadeMode aShadeMode, bool bTwoSidedLighting) - : mnRefCount(0), - mfDistance(fDistance), + : mfDistance(fDistance), mfShadowSlant(fShadowSlant), maProjectionMode(aProjectionMode), maShadeMode(aShadeMode), @@ -56,6 +53,15 @@ namespace drawinglayer { } + ImpSdrSceneAttribute() + : mfDistance(0.0), + mfShadowSlant(0.0), + maProjectionMode(::com::sun::star::drawing::ProjectionMode_PARALLEL), + maShadeMode(::com::sun::star::drawing::ShadeMode_FLAT), + mbTwoSidedLighting(false) + { + } + // data read access double getDistance() const { return mfDistance; } double getShadowSlant() const { return mfShadowSlant; } @@ -71,100 +77,53 @@ namespace drawinglayer && getShadeMode() == rCandidate.getShadeMode() && getTwoSidedLighting() == rCandidate.getTwoSidedLighting()); } - - static ImpSdrSceneAttribute* get_global_default() - { - static ImpSdrSceneAttribute* pDefault = 0; - - if(!pDefault) - { - pDefault = new ImpSdrSceneAttribute( - 0.0, 0.0, - ::com::sun::star::drawing::ProjectionMode_PARALLEL, - ::com::sun::star::drawing::ShadeMode_FLAT, - false); - - // never delete; start with RefCount 1, not 0 - pDefault->mnRefCount++; - } - - return pDefault; - } }; + namespace + { + struct theGlobalDefault : + public rtl::Static< SdrSceneAttribute::ImplType, theGlobalDefault > {}; + } + SdrSceneAttribute::SdrSceneAttribute( double fDistance, double fShadowSlant, ::com::sun::star::drawing::ProjectionMode aProjectionMode, ::com::sun::star::drawing::ShadeMode aShadeMode, bool bTwoSidedLighting) - : mpSdrSceneAttribute(new ImpSdrSceneAttribute( + : mpSdrSceneAttribute(ImpSdrSceneAttribute( fDistance, fShadowSlant, aProjectionMode, aShadeMode, bTwoSidedLighting)) { } SdrSceneAttribute::SdrSceneAttribute() - : mpSdrSceneAttribute(ImpSdrSceneAttribute::get_global_default()) + : mpSdrSceneAttribute(theGlobalDefault::get()) { - mpSdrSceneAttribute->mnRefCount++; } SdrSceneAttribute::SdrSceneAttribute(const SdrSceneAttribute& rCandidate) : mpSdrSceneAttribute(rCandidate.mpSdrSceneAttribute) { - mpSdrSceneAttribute->mnRefCount++; } SdrSceneAttribute::~SdrSceneAttribute() { - if(mpSdrSceneAttribute->mnRefCount) - { - mpSdrSceneAttribute->mnRefCount--; - } - else - { - delete mpSdrSceneAttribute; - } } bool SdrSceneAttribute::isDefault() const { - return mpSdrSceneAttribute == ImpSdrSceneAttribute::get_global_default(); + return mpSdrSceneAttribute.same_object(theGlobalDefault::get()); } SdrSceneAttribute& SdrSceneAttribute::operator=(const SdrSceneAttribute& rCandidate) { - if(rCandidate.mpSdrSceneAttribute != mpSdrSceneAttribute) - { - if(mpSdrSceneAttribute->mnRefCount) - { - mpSdrSceneAttribute->mnRefCount--; - } - else - { - delete mpSdrSceneAttribute; - } - - mpSdrSceneAttribute = rCandidate.mpSdrSceneAttribute; - mpSdrSceneAttribute->mnRefCount++; - } - + mpSdrSceneAttribute = rCandidate.mpSdrSceneAttribute; return *this; } bool SdrSceneAttribute::operator==(const SdrSceneAttribute& rCandidate) const { - if(rCandidate.mpSdrSceneAttribute == mpSdrSceneAttribute) - { - return true; - } - - if(rCandidate.isDefault() != isDefault()) - { - return false; - } - - return (*rCandidate.mpSdrSceneAttribute == *mpSdrSceneAttribute); + return rCandidate.mpSdrSceneAttribute == mpSdrSceneAttribute; } double SdrSceneAttribute::getShadowSlant() const -- cgit