[Libreoffice-commits] core.git: drawinglayer/inc drawinglayer/source

Thomas Arnhold thomas at arnhold.org
Sat Mar 23 13:22:51 PDT 2013


 drawinglayer/inc/drawinglayer/attribute/fillbitmapattribute.hxx |    6 
 drawinglayer/source/attribute/fillbitmapattribute.cxx           |   80 ++--------
 2 files changed, 24 insertions(+), 62 deletions(-)

New commits:
commit cafc879f8978ea9f7fca1be9f6aa5057f0a59617
Author: Thomas Arnhold <thomas at arnhold.org>
Date:   Sat Mar 23 06:15:47 2013 +0100

    fdo#62525: use cow_wrapper for FillBitmapAttribute
    
    Change-Id: I0f666d4baaf6dc4e9f7ea30a518a8904f01d749f
    Reviewed-on: https://gerrit.libreoffice.org/2948
    Reviewed-by: Thorsten Behrens <tbehrens at suse.com>
    Tested-by: Thorsten Behrens <tbehrens at suse.com>

diff --git a/drawinglayer/inc/drawinglayer/attribute/fillbitmapattribute.hxx b/drawinglayer/inc/drawinglayer/attribute/fillbitmapattribute.hxx
index ced46b3..851dc5e 100644
--- a/drawinglayer/inc/drawinglayer/attribute/fillbitmapattribute.hxx
+++ b/drawinglayer/inc/drawinglayer/attribute/fillbitmapattribute.hxx
@@ -21,6 +21,7 @@
 #define INCLUDED_DRAWINGLAYER_ATTRIBUTE_FILLBITMAPATTRIBUTE_HXX
 
 #include <drawinglayer/drawinglayerdllapi.h>
+#include <o3tl/cow_wrapper.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
 // predefines
@@ -44,8 +45,11 @@ namespace drawinglayer
     {
         class DRAWINGLAYER_DLLPUBLIC FillBitmapAttribute
         {
+        public:
+            typedef o3tl::cow_wrapper< ImpFillBitmapAttribute > ImplType;
+
         private:
-            ImpFillBitmapAttribute*             mpFillBitmapAttribute;
+            ImplType mpFillBitmapAttribute;
 
         public:
             /// constructors/assignmentoperator/destructor
diff --git a/drawinglayer/source/attribute/fillbitmapattribute.cxx b/drawinglayer/source/attribute/fillbitmapattribute.cxx
index b315178..e2bedb4 100644
--- a/drawinglayer/source/attribute/fillbitmapattribute.cxx
+++ b/drawinglayer/source/attribute/fillbitmapattribute.cxx
@@ -29,9 +29,6 @@ namespace drawinglayer
         class ImpFillBitmapAttribute
         {
         public:
-            // refcounter
-            sal_uInt32                              mnRefCount;
-
             // data definitions
             BitmapEx                                maBitmapEx;
             basegfx::B2DPoint                       maTopLeft;
@@ -45,14 +42,21 @@ namespace drawinglayer
                 const basegfx::B2DPoint& rTopLeft,
                 const basegfx::B2DVector& rSize,
                 bool bTiling)
-            :   mnRefCount(0),
-                maBitmapEx(rBitmapEx),
+            :   maBitmapEx(rBitmapEx),
                 maTopLeft(rTopLeft),
                 maSize(rSize),
                 mbTiling(bTiling)
             {
             }
 
+            ImpFillBitmapAttribute()
+            :   maBitmapEx(BitmapEx()),
+                maTopLeft(basegfx::B2DPoint()),
+                maSize(basegfx::B2DVector()),
+                mbTiling(false)
+            {
+            }
+
             bool operator==(const ImpFillBitmapAttribute& rCandidate) const
             {
                 return (maBitmapEx == rCandidate.maBitmapEx
@@ -66,33 +70,20 @@ namespace drawinglayer
             const basegfx::B2DPoint& getTopLeft() const { return maTopLeft; }
             const basegfx::B2DVector& getSize() const { return maSize; }
             bool getTiling() const { return mbTiling; }
-
-            static ImpFillBitmapAttribute* get_global_default()
-            {
-                static ImpFillBitmapAttribute* pDefault = 0;
-
-                if(!pDefault)
-                {
-                    pDefault = new ImpFillBitmapAttribute(
-                        BitmapEx(),
-                        basegfx::B2DPoint(),
-                        basegfx::B2DVector(),
-                        false);
-
-                    // never delete; start with RefCount 1, not 0
-                    pDefault->mnRefCount++;
-                }
-
-                return pDefault;
-            }
         };
 
+        namespace
+        {
+            struct theGlobalDefault :
+                public rtl::Static< FillBitmapAttribute::ImplType, theGlobalDefault > {};
+        }
+
         FillBitmapAttribute::FillBitmapAttribute(
             const BitmapEx& rBitmapEx,
             const basegfx::B2DPoint& rTopLeft,
             const basegfx::B2DVector& rSize,
             bool bTiling)
-        :   mpFillBitmapAttribute(new ImpFillBitmapAttribute(
+        :   mpFillBitmapAttribute(ImpFillBitmapAttribute(
                 rBitmapEx, rTopLeft, rSize, bTiling))
         {
         }
@@ -100,59 +91,26 @@ namespace drawinglayer
         FillBitmapAttribute::FillBitmapAttribute(const FillBitmapAttribute& rCandidate)
         :   mpFillBitmapAttribute(rCandidate.mpFillBitmapAttribute)
         {
-            mpFillBitmapAttribute->mnRefCount++;
         }
 
         FillBitmapAttribute::~FillBitmapAttribute()
         {
-            if(mpFillBitmapAttribute->mnRefCount)
-            {
-                mpFillBitmapAttribute->mnRefCount--;
-            }
-            else
-            {
-                delete mpFillBitmapAttribute;
-            }
         }
 
         bool FillBitmapAttribute::isDefault() const
         {
-            return mpFillBitmapAttribute == ImpFillBitmapAttribute::get_global_default();
+            return mpFillBitmapAttribute.same_object(theGlobalDefault::get());
         }
 
         FillBitmapAttribute& FillBitmapAttribute::operator=(const FillBitmapAttribute& rCandidate)
         {
-            if(rCandidate.mpFillBitmapAttribute != mpFillBitmapAttribute)
-            {
-                if(mpFillBitmapAttribute->mnRefCount)
-                {
-                    mpFillBitmapAttribute->mnRefCount--;
-                }
-                else
-                {
-                    delete mpFillBitmapAttribute;
-                }
-
-                mpFillBitmapAttribute = rCandidate.mpFillBitmapAttribute;
-                mpFillBitmapAttribute->mnRefCount++;
-            }
-
+            mpFillBitmapAttribute = rCandidate.mpFillBitmapAttribute;
             return *this;
         }
 
         bool FillBitmapAttribute::operator==(const FillBitmapAttribute& rCandidate) const
         {
-            if(rCandidate.mpFillBitmapAttribute == mpFillBitmapAttribute)
-            {
-                return true;
-            }
-
-            if(rCandidate.isDefault() != isDefault())
-            {
-                return false;
-            }
-
-            return (*rCandidate.mpFillBitmapAttribute == *mpFillBitmapAttribute);
+            return rCandidate.mpFillBitmapAttribute == mpFillBitmapAttribute;
         }
 
         const BitmapEx& FillBitmapAttribute::getBitmapEx() const


More information about the Libreoffice-commits mailing list