From 27e1a92d3bddf3c3e8595256e67aff006a402b6a Mon Sep 17 00:00:00 2001 From: Thorsten Behrens Date: Sun, 24 May 2015 16:12:01 +0200 Subject: tdf#62525: use cow_wrapper for SdrFormTextOutlineAttribute Change-Id: I7f75833bfec2cde140ded1dfe60aed2684905b0a --- .../sdr/attribute/sdrformtextoutlineattribute.hxx | 7 +- .../sdr/attribute/sdrformtextoutlineattribute.cxx | 84 ++++++---------------- 2 files changed, 28 insertions(+), 63 deletions(-) diff --git a/svx/inc/sdr/attribute/sdrformtextoutlineattribute.hxx b/svx/inc/sdr/attribute/sdrformtextoutlineattribute.hxx index 979762c2b25e..121f45b91f00 100644 --- a/svx/inc/sdr/attribute/sdrformtextoutlineattribute.hxx +++ b/svx/inc/sdr/attribute/sdrformtextoutlineattribute.hxx @@ -21,7 +21,7 @@ #define INCLUDED_SVX_INC_SDR_ATTRIBUTE_SDRFORMTEXTOUTLINEATTRIBUTE_HXX #include - +#include // predefines @@ -39,8 +39,11 @@ namespace drawinglayer { class SdrFormTextOutlineAttribute { + public: + typedef o3tl::cow_wrapper< ImpSdrFormTextOutlineAttribute > ImplType; + private: - ImpSdrFormTextOutlineAttribute* mpSdrFormTextOutlineAttribute; + ImplType mpSdrFormTextOutlineAttribute; public: /// constructors/assignmentoperator/destructor diff --git a/svx/source/sdr/attribute/sdrformtextoutlineattribute.cxx b/svx/source/sdr/attribute/sdrformtextoutlineattribute.cxx index 23a8bf8b44f9..1126013c3a7a 100644 --- a/svx/source/sdr/attribute/sdrformtextoutlineattribute.cxx +++ b/svx/source/sdr/attribute/sdrformtextoutlineattribute.cxx @@ -21,7 +21,7 @@ #include #include #include - +#include namespace drawinglayer @@ -31,9 +31,6 @@ namespace drawinglayer class ImpSdrFormTextOutlineAttribute { public: - // refcounter - sal_uInt32 mnRefCount; - // one set of attributes for FormText (FontWork) outline visualisation LineAttribute maLineAttribute; StrokeAttribute maStrokeAttribute; @@ -43,13 +40,19 @@ namespace drawinglayer const LineAttribute& rLineAttribute, const StrokeAttribute& rStrokeAttribute, sal_uInt8 nTransparence) - : mnRefCount(0), - maLineAttribute(rLineAttribute), + : maLineAttribute(rLineAttribute), maStrokeAttribute(rStrokeAttribute), mnTransparence(nTransparence) { } + ImpSdrFormTextOutlineAttribute() + : maLineAttribute(), + maStrokeAttribute(), + mnTransparence(0) + { + } + // data read access const LineAttribute& getLineAttribute() const { return maLineAttribute; } const StrokeAttribute& getStrokeAttribute() const { return maStrokeAttribute; } @@ -62,97 +65,56 @@ namespace drawinglayer && getStrokeAttribute() == rCandidate.getStrokeAttribute() && getTransparence() == rCandidate.getTransparence()); } - - static ImpSdrFormTextOutlineAttribute* get_global_default() - { - static ImpSdrFormTextOutlineAttribute* pDefault = 0; - - if(!pDefault) - { - pDefault = new ImpSdrFormTextOutlineAttribute( - LineAttribute(), - StrokeAttribute(), - 0); - - // never delete; start with RefCount 1, not 0 - pDefault->mnRefCount++; - } - - return pDefault; - } }; + namespace + { + struct theGlobalDefault : + public rtl::Static< SdrFormTextOutlineAttribute::ImplType, theGlobalDefault > {}; + } + SdrFormTextOutlineAttribute::SdrFormTextOutlineAttribute( const LineAttribute& rLineAttribute, const StrokeAttribute& rStrokeAttribute, sal_uInt8 nTransparence) - : mpSdrFormTextOutlineAttribute(new ImpSdrFormTextOutlineAttribute( - rLineAttribute, rStrokeAttribute, nTransparence)) + : mpSdrFormTextOutlineAttribute( + ImpSdrFormTextOutlineAttribute( + rLineAttribute, rStrokeAttribute, nTransparence)) { } SdrFormTextOutlineAttribute::SdrFormTextOutlineAttribute() - : mpSdrFormTextOutlineAttribute(ImpSdrFormTextOutlineAttribute::get_global_default()) + : mpSdrFormTextOutlineAttribute(theGlobalDefault::get()) { - mpSdrFormTextOutlineAttribute->mnRefCount++; } SdrFormTextOutlineAttribute::SdrFormTextOutlineAttribute(const SdrFormTextOutlineAttribute& rCandidate) : mpSdrFormTextOutlineAttribute(rCandidate.mpSdrFormTextOutlineAttribute) { - mpSdrFormTextOutlineAttribute->mnRefCount++; } SdrFormTextOutlineAttribute::~SdrFormTextOutlineAttribute() { - if(mpSdrFormTextOutlineAttribute->mnRefCount) - { - mpSdrFormTextOutlineAttribute->mnRefCount--; - } - else - { - delete mpSdrFormTextOutlineAttribute; - } } bool SdrFormTextOutlineAttribute::isDefault() const { - return mpSdrFormTextOutlineAttribute == ImpSdrFormTextOutlineAttribute::get_global_default(); + return mpSdrFormTextOutlineAttribute.same_object(theGlobalDefault::get()); } SdrFormTextOutlineAttribute& SdrFormTextOutlineAttribute::operator=(const SdrFormTextOutlineAttribute& rCandidate) { - if(rCandidate.mpSdrFormTextOutlineAttribute != mpSdrFormTextOutlineAttribute) - { - if(mpSdrFormTextOutlineAttribute->mnRefCount) - { - mpSdrFormTextOutlineAttribute->mnRefCount--; - } - else - { - delete mpSdrFormTextOutlineAttribute; - } - - mpSdrFormTextOutlineAttribute = rCandidate.mpSdrFormTextOutlineAttribute; - mpSdrFormTextOutlineAttribute->mnRefCount++; - } - + mpSdrFormTextOutlineAttribute = rCandidate.mpSdrFormTextOutlineAttribute; return *this; } bool SdrFormTextOutlineAttribute::operator==(const SdrFormTextOutlineAttribute& rCandidate) const { - if(rCandidate.mpSdrFormTextOutlineAttribute == mpSdrFormTextOutlineAttribute) - { - return true; - } - + // tdf#87509 default attr is always != non-default attr, even with same values if(rCandidate.isDefault() != isDefault()) - { return false; - } - return (*rCandidate.mpSdrFormTextOutlineAttribute == *mpSdrFormTextOutlineAttribute); + return rCandidate.mpSdrFormTextOutlineAttribute == mpSdrFormTextOutlineAttribute; } const LineAttribute& SdrFormTextOutlineAttribute::getLineAttribute() const -- cgit v1.2.3