summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Arnhold <thomas@arnhold.org>2013-04-03 02:35:54 +0200
committerThomas Arnhold <thomas@arnhold.org>2013-04-03 02:49:17 +0200
commitd3dff92c74bdf0fdb8b638d85fd5a41a64bd96c9 (patch)
tree7e27df68678b8bb3f2f9996efdb0ec58e4e2baeb
parent12012150d2027f78e872dc15b063b12a60d3a7d9 (diff)
fdo#62525: use cow_wrapper for SdrSceneAttribute
Change-Id: Iaedb5080f341482c3ac4f4e0548be49801c5f0b2
-rw-r--r--drawinglayer/inc/drawinglayer/attribute/sdrsceneattribute3d.hxx6
-rw-r--r--drawinglayer/source/attribute/sdrsceneattribute3d.cxx85
2 files changed, 27 insertions, 64 deletions
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 <com/sun/star/drawing/ProjectionMode.hpp>
#include <com/sun/star/drawing/ShadeMode.hpp>
+#include <o3tl/cow_wrapper.hxx>
//////////////////////////////////////////////////////////////////////////////
// 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 <drawinglayer/attribute/sdrsceneattribute3d.hxx>
+#include <rtl/instance.hxx>
//////////////////////////////////////////////////////////////////////////////
@@ -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