tdf#89329: use shared_ptr for pImpl in optionsdrawinglayer
Change-Id: Ic9da196c1dfe138ff6408a37fa8ff70492d00bc2
Reviewed-on: https://gerrit.libreoffice.org/26282
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
diff --git a/include/svtools/optionsdrawinglayer.hxx b/include/svtools/optionsdrawinglayer.hxx
index 25951f6..c096f48 100644
--- a/include/svtools/optionsdrawinglayer.hxx
+++ b/include/svtools/optionsdrawinglayer.hxx
@@ -25,6 +25,7 @@
#include <osl/mutex.hxx>
#include <rtl/ustring.hxx>
#include <tools/color.hxx>
#include <memory>
/*-************************************************************************************************************
@short forward declaration to our private date container implementation
@@ -44,17 +45,6 @@ class SVT_DLLPUBLIC SvtOptionsDrawinglayer
{
public:
/*-****************************************************************************************************
@short standard constructor and destructor
@descr This will initialize an instance with default values.
We implement these class with a refcount mechanism! Every instance of this class increase it
at create and decrease it at delete time - but all instances use the same data container!
He is implemented as a static member ...
@seealso member m_nRefCount
@seealso member m_pDataContainer
*//*-*****************************************************************************************************/
SvtOptionsDrawinglayer();
~SvtOptionsDrawinglayer();
@@ -140,17 +130,7 @@ class SVT_DLLPUBLIC SvtOptionsDrawinglayer
*//*-*****************************************************************************************************/
SVT_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex();
/*Attention
Don't initialize these static members in these headers!
a) Double defined symbols will be detected ...
b) and unresolved externals exist at linking time.
Do it in your source only.
*/
static SvtOptionsDrawinglayer_Impl* m_pDataContainer ;
static sal_Int32 m_nRefCount ;
std::shared_ptr<SvtOptionsDrawinglayer_Impl> m_pImpl;
};
#endif // #ifndef INCLUDED_SVTOOLS_OPTIONSDRAWINGLAYER_HXX
diff --git a/svtools/source/config/optionsdrawinglayer.cxx b/svtools/source/config/optionsdrawinglayer.cxx
index ce7eaa8..fbf76ea 100644
--- a/svtools/source/config/optionsdrawinglayer.cxx
+++ b/svtools/source/config/optionsdrawinglayer.cxx
@@ -28,10 +28,8 @@
#include <vcl/settings.hxx>
#include <rtl/instance.hxx>
// namespaces
using namespace ::utl ;
using namespace ::osl ;
using namespace ::com::sun::star::uno ;
@@ -157,23 +155,11 @@ using namespace ::com::sun::star::uno ;
class SvtOptionsDrawinglayer_Impl : public ConfigItem
{
public:
// constructor / destructor
SvtOptionsDrawinglayer_Impl();
virtual ~SvtOptionsDrawinglayer_Impl();
// override methods of baseclass
SvtOptionsDrawinglayer_Impl();
~SvtOptionsDrawinglayer_Impl();
virtual void Notify( const css::uno::Sequence<OUString>& aPropertyNames) override;
// public interface
bool IsOverlayBuffer() const { return m_bOverlayBuffer;}
bool IsPaintBuffer() const { return m_bPaintBuffer;}
const Color& GetStripeColorA() const { return m_bStripeColorA;}
@@ -220,8 +206,7 @@ public:
// private methods
private:
virtual void ImplCommit() override;
virtual void ImplCommit() SAL_FINAL override;
static Sequence< OUString > impl_GetPropertyNames();
@@ -272,9 +257,6 @@ private:
bool m_bAllowAAChecked : 1;
};
// constructor
SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl() :
ConfigItem( ROOTNODE_START ),
m_bOverlayBuffer( DEFAULT_OVERLAYBUFFER ),
@@ -535,15 +517,12 @@ SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl() :
}
}
// destructor
SvtOptionsDrawinglayer_Impl::~SvtOptionsDrawinglayer_Impl()
{
assert(!IsModified()); // should have been committed
if (IsModified())
Commit();
}
// Commit
void SvtOptionsDrawinglayer_Impl::ImplCommit()
@@ -676,32 +655,12 @@ void SvtOptionsDrawinglayer_Impl::ImplCommit()
void SvtOptionsDrawinglayer_Impl::Notify( const css::uno::Sequence<OUString>& )
{
}
// public method
// public method
// public method
// public method
// public method
// #i73602#
// #i74769#, #i75172#
// #i4219#
// helper
bool SvtOptionsDrawinglayer_Impl::IsAAPossibleOnThisSystem() const
{
@@ -729,7 +688,6 @@ bool SvtOptionsDrawinglayer_Impl::IsAAPossibleOnThisSystem() const
// primitives
void SvtOptionsDrawinglayer_Impl::SetAntiAliasing( bool bState )
{
if(m_bAntiAliasing != bState)
@@ -791,236 +749,212 @@ Sequence< OUString > SvtOptionsDrawinglayer_Impl::impl_GetPropertyNames()
return seqPropertyNames;
}
// initialize static member
// DON'T DO IT IN YOUR HEADER!
// see definition for further information
SvtOptionsDrawinglayer_Impl* SvtOptionsDrawinglayer::m_pDataContainer = nullptr;
sal_Int32 SvtOptionsDrawinglayer::m_nRefCount = 0;
// constructor
namespace {
//global
std::weak_ptr<SvtOptionsDrawinglayer_Impl> g_pOptionsDrawinglayer;
}
SvtOptionsDrawinglayer::SvtOptionsDrawinglayer()
{
// Global access, must be guarded (multithreading!).
MutexGuard aGuard( GetOwnStaticMutex() );
// Increase our refcount ...
++m_nRefCount;
// ... and initialize our data container only if it not already!
if( m_pDataContainer == nullptr )
m_pImpl = g_pOptionsDrawinglayer.lock();
if( !m_pImpl )
{
m_pDataContainer = new SvtOptionsDrawinglayer_Impl();
m_pImpl = std::make_shared<SvtOptionsDrawinglayer_Impl>();
g_pOptionsDrawinglayer = m_pImpl;
}
}
// destructor
SvtOptionsDrawinglayer::~SvtOptionsDrawinglayer()
{
// Global access, must be guarded (multithreading!)
MutexGuard aGuard( GetOwnStaticMutex() );
// Decrease our refcount.
--m_nRefCount;
// If last instance was deleted ...
// we must destroy our static data container!
if( m_nRefCount <= 0 )
{
if (m_pDataContainer->IsModified())
m_pDataContainer->Commit();
delete m_pDataContainer;
m_pDataContainer = nullptr;
}
}
m_pImpl.reset();
}
// public method
bool SvtOptionsDrawinglayer::IsOverlayBuffer() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsOverlayBuffer();
return m_pImpl->IsOverlayBuffer();
}
// public method
bool SvtOptionsDrawinglayer::IsPaintBuffer() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsPaintBuffer();
return m_pImpl->IsPaintBuffer();
}
// public method
Color SvtOptionsDrawinglayer::GetStripeColorA() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetStripeColorA();
return m_pImpl->GetStripeColorA();
}
// public method
Color SvtOptionsDrawinglayer::GetStripeColorB() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetStripeColorB();
return m_pImpl->GetStripeColorB();
}
// public method
sal_uInt16 SvtOptionsDrawinglayer::GetStripeLength() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetStripeLength();
return m_pImpl->GetStripeLength();
}
// #i73602#
bool SvtOptionsDrawinglayer::IsOverlayBuffer_Calc() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsOverlayBuffer_Calc();
return m_pImpl->IsOverlayBuffer_Calc();
}
bool SvtOptionsDrawinglayer::IsOverlayBuffer_Writer() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsOverlayBuffer_Writer();
return m_pImpl->IsOverlayBuffer_Writer();
}
bool SvtOptionsDrawinglayer::IsOverlayBuffer_DrawImpress() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsOverlayBuffer_DrawImpress();
return m_pImpl->IsOverlayBuffer_DrawImpress();
}
// #i74769#, #i75172#
bool SvtOptionsDrawinglayer::IsPaintBuffer_Calc() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsPaintBuffer_Calc();
return m_pImpl->IsPaintBuffer_Calc();
}
bool SvtOptionsDrawinglayer::IsPaintBuffer_Writer() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsPaintBuffer_Writer();
return m_pImpl->IsPaintBuffer_Writer();
}
bool SvtOptionsDrawinglayer::IsPaintBuffer_DrawImpress() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsPaintBuffer_DrawImpress();
return m_pImpl->IsPaintBuffer_DrawImpress();
}
// #i4219#
sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperWidth() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetMaximumPaperWidth();
return m_pImpl->GetMaximumPaperWidth();
}
sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperHeight() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetMaximumPaperHeight();
return m_pImpl->GetMaximumPaperHeight();
}
sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperLeftMargin() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetMaximumPaperLeftMargin();
return m_pImpl->GetMaximumPaperLeftMargin();
}
sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperRightMargin() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetMaximumPaperRightMargin();
return m_pImpl->GetMaximumPaperRightMargin();
}
sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperTopMargin() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetMaximumPaperTopMargin();
return m_pImpl->GetMaximumPaperTopMargin();
}
sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperBottomMargin() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetMaximumPaperBottomMargin();
return m_pImpl->GetMaximumPaperBottomMargin();
}
// helper
bool SvtOptionsDrawinglayer::IsAAPossibleOnThisSystem() const
{
return m_pDataContainer->IsAAPossibleOnThisSystem();
return m_pImpl->IsAAPossibleOnThisSystem();
}
// primitives
bool SvtOptionsDrawinglayer::IsAntiAliasing() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsAntiAliasing() && IsAAPossibleOnThisSystem();
return m_pImpl->IsAntiAliasing() && IsAAPossibleOnThisSystem();
}
bool SvtOptionsDrawinglayer::IsSnapHorVerLinesToDiscrete() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsAntiAliasing() && m_pDataContainer->IsSnapHorVerLinesToDiscrete();
return m_pImpl->IsAntiAliasing() && m_pImpl->IsSnapHorVerLinesToDiscrete();
}
bool SvtOptionsDrawinglayer::IsSolidDragCreate() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsSolidDragCreate();
return m_pImpl->IsSolidDragCreate();
}
bool SvtOptionsDrawinglayer::IsRenderDecoratedTextDirect() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsRenderDecoratedTextDirect();
return m_pImpl->IsRenderDecoratedTextDirect();
}
bool SvtOptionsDrawinglayer::IsRenderSimpleTextDirect() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsRenderSimpleTextDirect();
return m_pImpl->IsRenderSimpleTextDirect();
}
sal_uInt32 SvtOptionsDrawinglayer::GetQuadratic3DRenderLimit() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetQuadratic3DRenderLimit();
return m_pImpl->GetQuadratic3DRenderLimit();
}
sal_uInt32 SvtOptionsDrawinglayer::GetQuadraticFormControlRenderLimit() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->GetQuadraticFormControlRenderLimit();
return m_pImpl->GetQuadraticFormControlRenderLimit();
}
void SvtOptionsDrawinglayer::SetAntiAliasing( bool bState )
{
MutexGuard aGuard( GetOwnStaticMutex() );
m_pDataContainer->SetAntiAliasing( bState );
m_pImpl->SetAntiAliasing( bState );
}
// #i97672# selection settings
bool SvtOptionsDrawinglayer::IsTransparentSelection() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
return m_pDataContainer->IsTransparentSelection();
return m_pImpl->IsTransparentSelection();
}
sal_uInt16 SvtOptionsDrawinglayer::GetTransparentSelectionPercent() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
sal_uInt16 aRetval(m_pDataContainer->GetTransparentSelectionPercent());
sal_uInt16 aRetval(m_pImpl->GetTransparentSelectionPercent());
// crop to range [10% .. 90%]
if(aRetval < 10)
@@ -1039,7 +973,7 @@ sal_uInt16 SvtOptionsDrawinglayer::GetTransparentSelectionPercent() const
sal_uInt16 SvtOptionsDrawinglayer::GetSelectionMaximumLuminancePercent() const
{
MutexGuard aGuard( GetOwnStaticMutex() );
sal_uInt16 aRetval(m_pDataContainer->GetSelectionMaximumLuminancePercent());
sal_uInt16 aRetval(m_pImpl->GetSelectionMaximumLuminancePercent());
// crop to range [0% .. 100%]
if(aRetval > 90)
@@ -1076,7 +1010,6 @@ namespace
class theOptionsDrawinglayerMutex : public rtl::Static<osl::Mutex, theOptionsDrawinglayerMutex>{};
}
// private method
Mutex& SvtOptionsDrawinglayer::GetOwnStaticMutex()