Kaydet (Commit) 27e1a92d authored tarafından Thorsten Behrens's avatar Thorsten Behrens

tdf#62525: use cow_wrapper for SdrFormTextOutlineAttribute

Change-Id: I7f75833bfec2cde140ded1dfe60aed2684905b0a
üst 6a42657f
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#define INCLUDED_SVX_INC_SDR_ATTRIBUTE_SDRFORMTEXTOUTLINEATTRIBUTE_HXX #define INCLUDED_SVX_INC_SDR_ATTRIBUTE_SDRFORMTEXTOUTLINEATTRIBUTE_HXX
#include <sal/types.h> #include <sal/types.h>
#include <o3tl/cow_wrapper.hxx>
// predefines // predefines
...@@ -39,8 +39,11 @@ namespace drawinglayer ...@@ -39,8 +39,11 @@ namespace drawinglayer
{ {
class SdrFormTextOutlineAttribute class SdrFormTextOutlineAttribute
{ {
public:
typedef o3tl::cow_wrapper< ImpSdrFormTextOutlineAttribute > ImplType;
private: private:
ImpSdrFormTextOutlineAttribute* mpSdrFormTextOutlineAttribute; ImplType mpSdrFormTextOutlineAttribute;
public: public:
/// constructors/assignmentoperator/destructor /// constructors/assignmentoperator/destructor
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include <sdr/attribute/sdrformtextoutlineattribute.hxx> #include <sdr/attribute/sdrformtextoutlineattribute.hxx>
#include <drawinglayer/attribute/lineattribute.hxx> #include <drawinglayer/attribute/lineattribute.hxx>
#include <drawinglayer/attribute/strokeattribute.hxx> #include <drawinglayer/attribute/strokeattribute.hxx>
#include <rtl/instance.hxx>
namespace drawinglayer namespace drawinglayer
...@@ -31,9 +31,6 @@ namespace drawinglayer ...@@ -31,9 +31,6 @@ namespace drawinglayer
class ImpSdrFormTextOutlineAttribute class ImpSdrFormTextOutlineAttribute
{ {
public: public:
// refcounter
sal_uInt32 mnRefCount;
// one set of attributes for FormText (FontWork) outline visualisation // one set of attributes for FormText (FontWork) outline visualisation
LineAttribute maLineAttribute; LineAttribute maLineAttribute;
StrokeAttribute maStrokeAttribute; StrokeAttribute maStrokeAttribute;
...@@ -43,13 +40,19 @@ namespace drawinglayer ...@@ -43,13 +40,19 @@ namespace drawinglayer
const LineAttribute& rLineAttribute, const LineAttribute& rLineAttribute,
const StrokeAttribute& rStrokeAttribute, const StrokeAttribute& rStrokeAttribute,
sal_uInt8 nTransparence) sal_uInt8 nTransparence)
: mnRefCount(0), : maLineAttribute(rLineAttribute),
maLineAttribute(rLineAttribute),
maStrokeAttribute(rStrokeAttribute), maStrokeAttribute(rStrokeAttribute),
mnTransparence(nTransparence) mnTransparence(nTransparence)
{ {
} }
ImpSdrFormTextOutlineAttribute()
: maLineAttribute(),
maStrokeAttribute(),
mnTransparence(0)
{
}
// data read access // data read access
const LineAttribute& getLineAttribute() const { return maLineAttribute; } const LineAttribute& getLineAttribute() const { return maLineAttribute; }
const StrokeAttribute& getStrokeAttribute() const { return maStrokeAttribute; } const StrokeAttribute& getStrokeAttribute() const { return maStrokeAttribute; }
...@@ -62,97 +65,56 @@ namespace drawinglayer ...@@ -62,97 +65,56 @@ namespace drawinglayer
&& getStrokeAttribute() == rCandidate.getStrokeAttribute() && getStrokeAttribute() == rCandidate.getStrokeAttribute()
&& getTransparence() == rCandidate.getTransparence()); && getTransparence() == rCandidate.getTransparence());
} }
};
static ImpSdrFormTextOutlineAttribute* get_global_default() namespace
{
static ImpSdrFormTextOutlineAttribute* pDefault = 0;
if(!pDefault)
{ {
pDefault = new ImpSdrFormTextOutlineAttribute( struct theGlobalDefault :
LineAttribute(), public rtl::Static< SdrFormTextOutlineAttribute::ImplType, theGlobalDefault > {};
StrokeAttribute(),
0);
// never delete; start with RefCount 1, not 0
pDefault->mnRefCount++;
}
return pDefault;
} }
};
SdrFormTextOutlineAttribute::SdrFormTextOutlineAttribute( SdrFormTextOutlineAttribute::SdrFormTextOutlineAttribute(
const LineAttribute& rLineAttribute, const LineAttribute& rLineAttribute,
const StrokeAttribute& rStrokeAttribute, const StrokeAttribute& rStrokeAttribute,
sal_uInt8 nTransparence) sal_uInt8 nTransparence)
: mpSdrFormTextOutlineAttribute(new ImpSdrFormTextOutlineAttribute( : mpSdrFormTextOutlineAttribute(
ImpSdrFormTextOutlineAttribute(
rLineAttribute, rStrokeAttribute, nTransparence)) rLineAttribute, rStrokeAttribute, nTransparence))
{ {
} }
SdrFormTextOutlineAttribute::SdrFormTextOutlineAttribute() SdrFormTextOutlineAttribute::SdrFormTextOutlineAttribute()
: mpSdrFormTextOutlineAttribute(ImpSdrFormTextOutlineAttribute::get_global_default()) : mpSdrFormTextOutlineAttribute(theGlobalDefault::get())
{ {
mpSdrFormTextOutlineAttribute->mnRefCount++;
} }
SdrFormTextOutlineAttribute::SdrFormTextOutlineAttribute(const SdrFormTextOutlineAttribute& rCandidate) SdrFormTextOutlineAttribute::SdrFormTextOutlineAttribute(const SdrFormTextOutlineAttribute& rCandidate)
: mpSdrFormTextOutlineAttribute(rCandidate.mpSdrFormTextOutlineAttribute) : mpSdrFormTextOutlineAttribute(rCandidate.mpSdrFormTextOutlineAttribute)
{ {
mpSdrFormTextOutlineAttribute->mnRefCount++;
} }
SdrFormTextOutlineAttribute::~SdrFormTextOutlineAttribute() SdrFormTextOutlineAttribute::~SdrFormTextOutlineAttribute()
{ {
if(mpSdrFormTextOutlineAttribute->mnRefCount)
{
mpSdrFormTextOutlineAttribute->mnRefCount--;
}
else
{
delete mpSdrFormTextOutlineAttribute;
}
} }
bool SdrFormTextOutlineAttribute::isDefault() const bool SdrFormTextOutlineAttribute::isDefault() const
{ {
return mpSdrFormTextOutlineAttribute == ImpSdrFormTextOutlineAttribute::get_global_default(); return mpSdrFormTextOutlineAttribute.same_object(theGlobalDefault::get());
} }
SdrFormTextOutlineAttribute& SdrFormTextOutlineAttribute::operator=(const SdrFormTextOutlineAttribute& rCandidate) SdrFormTextOutlineAttribute& SdrFormTextOutlineAttribute::operator=(const SdrFormTextOutlineAttribute& rCandidate)
{ {
if(rCandidate.mpSdrFormTextOutlineAttribute != mpSdrFormTextOutlineAttribute)
{
if(mpSdrFormTextOutlineAttribute->mnRefCount)
{
mpSdrFormTextOutlineAttribute->mnRefCount--;
}
else
{
delete mpSdrFormTextOutlineAttribute;
}
mpSdrFormTextOutlineAttribute = rCandidate.mpSdrFormTextOutlineAttribute; mpSdrFormTextOutlineAttribute = rCandidate.mpSdrFormTextOutlineAttribute;
mpSdrFormTextOutlineAttribute->mnRefCount++;
}
return *this; return *this;
} }
bool SdrFormTextOutlineAttribute::operator==(const SdrFormTextOutlineAttribute& rCandidate) const bool SdrFormTextOutlineAttribute::operator==(const SdrFormTextOutlineAttribute& rCandidate) const
{ {
if(rCandidate.mpSdrFormTextOutlineAttribute == mpSdrFormTextOutlineAttribute) // tdf#87509 default attr is always != non-default attr, even with same values
{
return true;
}
if(rCandidate.isDefault() != isDefault()) if(rCandidate.isDefault() != isDefault())
{
return false; return false;
}
return (*rCandidate.mpSdrFormTextOutlineAttribute == *mpSdrFormTextOutlineAttribute); return rCandidate.mpSdrFormTextOutlineAttribute == mpSdrFormTextOutlineAttribute;
} }
const LineAttribute& SdrFormTextOutlineAttribute::getLineAttribute() const const LineAttribute& SdrFormTextOutlineAttribute::getLineAttribute() const
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment