Kaydet (Commit) 7470c93a authored tarafından Thomas Arnhold's avatar Thomas Arnhold

fdo#62525: use cow_wrapper for Sdr3DObjectAttribute

Change-Id: I80e378f6a88068f5d3b36c6187b41ab8d968a0c3
üst d3dff92c
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <com/sun/star/drawing/TextureProjectionMode.hpp> #include <com/sun/star/drawing/TextureProjectionMode.hpp>
#include <com/sun/star/drawing/TextureKind2.hpp> #include <com/sun/star/drawing/TextureKind2.hpp>
#include <com/sun/star/drawing/TextureMode.hpp> #include <com/sun/star/drawing/TextureMode.hpp>
#include <o3tl/cow_wrapper.hxx>
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// predefines // predefines
...@@ -43,8 +44,11 @@ namespace drawinglayer ...@@ -43,8 +44,11 @@ namespace drawinglayer
{ {
class DRAWINGLAYER_DLLPUBLIC Sdr3DObjectAttribute class DRAWINGLAYER_DLLPUBLIC Sdr3DObjectAttribute
{ {
public:
typedef o3tl::cow_wrapper< ImpSdr3DObjectAttribute > ImplType;
private: private:
ImpSdr3DObjectAttribute* mpSdr3DObjectAttribute; ImplType mpSdr3DObjectAttribute;
public: public:
// constructors/destructor // constructors/destructor
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <drawinglayer/attribute/sdrobjectattribute3d.hxx> #include <drawinglayer/attribute/sdrobjectattribute3d.hxx>
#include <drawinglayer/attribute/materialattribute3d.hxx> #include <drawinglayer/attribute/materialattribute3d.hxx>
#include <rtl/instance.hxx>
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
...@@ -29,9 +30,6 @@ namespace drawinglayer ...@@ -29,9 +30,6 @@ namespace drawinglayer
class ImpSdr3DObjectAttribute class ImpSdr3DObjectAttribute
{ {
public: public:
// refcounter
sal_uInt32 mnRefCount;
// 3D object attribute definitions // 3D object attribute definitions
::com::sun::star::drawing::NormalsKind maNormalsKind; // normals type (0..2) ::com::sun::star::drawing::NormalsKind maNormalsKind; // normals type (0..2)
::com::sun::star::drawing::TextureProjectionMode maTextureProjectionX; // texture projection type X (0..2) ::com::sun::star::drawing::TextureProjectionMode maTextureProjectionX; // texture projection type X (0..2)
...@@ -59,8 +57,7 @@ namespace drawinglayer ...@@ -59,8 +57,7 @@ namespace drawinglayer
bool bShadow3D, bool bShadow3D,
bool bTextureFilter, bool bTextureFilter,
bool bReducedLineGeometry) bool bReducedLineGeometry)
: mnRefCount(0), : maNormalsKind(aNormalsKind),
maNormalsKind(aNormalsKind),
maTextureProjectionX(aTextureProjectionX), maTextureProjectionX(aTextureProjectionX),
maTextureProjectionY(aTextureProjectionY), maTextureProjectionY(aTextureProjectionY),
maTextureKind(aTextureKind), maTextureKind(aTextureKind),
...@@ -74,6 +71,21 @@ namespace drawinglayer ...@@ -74,6 +71,21 @@ namespace drawinglayer
{ {
} }
ImpSdr3DObjectAttribute()
: maNormalsKind(::com::sun::star::drawing::NormalsKind_SPECIFIC),
maTextureProjectionX(::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC),
maTextureProjectionY(::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC),
maTextureKind(::com::sun::star::drawing::TextureKind2_LUMINANCE),
maTextureMode(::com::sun::star::drawing::TextureMode_REPLACE),
maMaterial(MaterialAttribute3D()),
mbNormalsInvert(false),
mbDoubleSided(false),
mbShadow3D(false),
mbTextureFilter(false),
mbReducedLineGeometry(false)
{
}
// data read access // data read access
::com::sun::star::drawing::NormalsKind getNormalsKind() const { return maNormalsKind; } ::com::sun::star::drawing::NormalsKind getNormalsKind() const { return maNormalsKind; }
::com::sun::star::drawing::TextureProjectionMode getTextureProjectionX() const { return maTextureProjectionX; } ::com::sun::star::drawing::TextureProjectionMode getTextureProjectionX() const { return maTextureProjectionX; }
...@@ -101,34 +113,14 @@ namespace drawinglayer ...@@ -101,34 +113,14 @@ namespace drawinglayer
&& getTextureFilter() == rCandidate.getTextureFilter() && getTextureFilter() == rCandidate.getTextureFilter()
&& getReducedLineGeometry() == rCandidate.getReducedLineGeometry()); && getReducedLineGeometry() == rCandidate.getReducedLineGeometry());
} }
static ImpSdr3DObjectAttribute* get_global_default()
{
static ImpSdr3DObjectAttribute* pDefault = 0;
if(!pDefault)
{
pDefault = new ImpSdr3DObjectAttribute(
::com::sun::star::drawing::NormalsKind_SPECIFIC,
::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC,
::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC,
::com::sun::star::drawing::TextureKind2_LUMINANCE,
::com::sun::star::drawing::TextureMode_REPLACE,
MaterialAttribute3D(),
false,
false,
false,
false,
false);
// never delete; start with RefCount 1, not 0
pDefault->mnRefCount++;
}
return pDefault;
}
}; };
namespace
{
struct theGlobalDefault :
public rtl::Static< Sdr3DObjectAttribute::ImplType, theGlobalDefault > {};
}
Sdr3DObjectAttribute::Sdr3DObjectAttribute( Sdr3DObjectAttribute::Sdr3DObjectAttribute(
::com::sun::star::drawing::NormalsKind aNormalsKind, ::com::sun::star::drawing::NormalsKind aNormalsKind,
::com::sun::star::drawing::TextureProjectionMode aTextureProjectionX, ::com::sun::star::drawing::TextureProjectionMode aTextureProjectionX,
...@@ -141,7 +133,7 @@ namespace drawinglayer ...@@ -141,7 +133,7 @@ namespace drawinglayer
bool bShadow3D, bool bShadow3D,
bool bTextureFilter, bool bTextureFilter,
bool bReducedLineGeometry) bool bReducedLineGeometry)
: mpSdr3DObjectAttribute(new ImpSdr3DObjectAttribute( : mpSdr3DObjectAttribute(ImpSdr3DObjectAttribute(
aNormalsKind, aTextureProjectionX, aTextureProjectionY, aTextureKind, aTextureMode, aNormalsKind, aTextureProjectionX, aTextureProjectionY, aTextureKind, aTextureMode,
rMaterial, bNormalsInvert, bDoubleSided, bShadow3D, bTextureFilter, bReducedLineGeometry)) rMaterial, bNormalsInvert, bDoubleSided, bShadow3D, bTextureFilter, bReducedLineGeometry))
{ {
...@@ -150,59 +142,26 @@ namespace drawinglayer ...@@ -150,59 +142,26 @@ namespace drawinglayer
Sdr3DObjectAttribute::Sdr3DObjectAttribute(const Sdr3DObjectAttribute& rCandidate) Sdr3DObjectAttribute::Sdr3DObjectAttribute(const Sdr3DObjectAttribute& rCandidate)
: mpSdr3DObjectAttribute(rCandidate.mpSdr3DObjectAttribute) : mpSdr3DObjectAttribute(rCandidate.mpSdr3DObjectAttribute)
{ {
mpSdr3DObjectAttribute->mnRefCount++;
} }
Sdr3DObjectAttribute::~Sdr3DObjectAttribute() Sdr3DObjectAttribute::~Sdr3DObjectAttribute()
{ {
if(mpSdr3DObjectAttribute->mnRefCount)
{
mpSdr3DObjectAttribute->mnRefCount--;
}
else
{
delete mpSdr3DObjectAttribute;
}
} }
bool Sdr3DObjectAttribute::isDefault() const bool Sdr3DObjectAttribute::isDefault() const
{ {
return mpSdr3DObjectAttribute == ImpSdr3DObjectAttribute::get_global_default(); return mpSdr3DObjectAttribute.same_object(theGlobalDefault::get());
} }
Sdr3DObjectAttribute& Sdr3DObjectAttribute::operator=(const Sdr3DObjectAttribute& rCandidate) Sdr3DObjectAttribute& Sdr3DObjectAttribute::operator=(const Sdr3DObjectAttribute& rCandidate)
{ {
if(rCandidate.mpSdr3DObjectAttribute != mpSdr3DObjectAttribute) mpSdr3DObjectAttribute = rCandidate.mpSdr3DObjectAttribute;
{
if(mpSdr3DObjectAttribute->mnRefCount)
{
mpSdr3DObjectAttribute->mnRefCount--;
}
else
{
delete mpSdr3DObjectAttribute;
}
mpSdr3DObjectAttribute = rCandidate.mpSdr3DObjectAttribute;
mpSdr3DObjectAttribute->mnRefCount++;
}
return *this; return *this;
} }
bool Sdr3DObjectAttribute::operator==(const Sdr3DObjectAttribute& rCandidate) const bool Sdr3DObjectAttribute::operator==(const Sdr3DObjectAttribute& rCandidate) const
{ {
if(rCandidate.mpSdr3DObjectAttribute == mpSdr3DObjectAttribute) return rCandidate.mpSdr3DObjectAttribute == mpSdr3DObjectAttribute;
{
return true;
}
if(rCandidate.isDefault() != isDefault())
{
return false;
}
return (*rCandidate.mpSdr3DObjectAttribute == *mpSdr3DObjectAttribute);
} }
::com::sun::star::drawing::NormalsKind Sdr3DObjectAttribute::getNormalsKind() const ::com::sun::star::drawing::NormalsKind Sdr3DObjectAttribute::getNormalsKind() 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