Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/2951

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/51/2951/1

fdo#62525: use cow_wrapper for FillGradientAttribute

Change-Id: I85a9864820f49da8ebcc4a7d2c80a3c9d0c13b27
---
M drawinglayer/inc/drawinglayer/attribute/fillgradientattribute.hxx
M drawinglayer/source/attribute/fillgradientattribute.cxx
2 files changed, 29 insertions(+), 65 deletions(-)



diff --git a/drawinglayer/inc/drawinglayer/attribute/fillgradientattribute.hxx 
b/drawinglayer/inc/drawinglayer/attribute/fillgradientattribute.hxx
index 6d01c86..e791193 100644
--- a/drawinglayer/inc/drawinglayer/attribute/fillgradientattribute.hxx
+++ b/drawinglayer/inc/drawinglayer/attribute/fillgradientattribute.hxx
@@ -21,6 +21,7 @@
 #define INCLUDED_DRAWINGLAYER_ATTRIBUTE_FILLGRADIENTATTRIBUTE_HXX
 
 #include <drawinglayer/drawinglayerdllapi.h>
+#include <o3tl/cow_wrapper.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
 // predefines
@@ -58,8 +59,11 @@
     {
         class DRAWINGLAYER_DLLPUBLIC FillGradientAttribute
         {
+        public:
+            typedef o3tl::cow_wrapper< ImpFillGradientAttribute > ImplType;
+
         private:
-            ImpFillGradientAttribute*           mpFillGradientAttribute;
+            ImplType mpFillGradientAttribute;
 
         public:
             /// constructors/assignmentoperator/destructor
diff --git a/drawinglayer/source/attribute/fillgradientattribute.cxx 
b/drawinglayer/source/attribute/fillgradientattribute.cxx
index 987082c..638aa93 100644
--- a/drawinglayer/source/attribute/fillgradientattribute.cxx
+++ b/drawinglayer/source/attribute/fillgradientattribute.cxx
@@ -29,9 +29,6 @@
         class ImpFillGradientAttribute
         {
         public:
-            // refcounter
-            sal_uInt32                              mnRefCount;
-
             // data definitions
             GradientStyle                           meStyle;
             double                                  mfBorder;
@@ -51,8 +48,7 @@
                 const basegfx::BColor& rStartColor,
                 const basegfx::BColor& rEndColor,
                 sal_uInt16 nSteps)
-            :   mnRefCount(0),
-                meStyle(eStyle),
+            :   meStyle(eStyle),
                 mfBorder(fBorder),
                 mfOffsetX(fOffsetX),
                 mfOffsetY(fOffsetY),
@@ -60,6 +56,18 @@
                 maStartColor(rStartColor),
                 maEndColor(rEndColor),
                 mnSteps(nSteps)
+            {
+            }
+
+            ImpFillGradientAttribute()
+            :   meStyle(GRADIENTSTYLE_LINEAR),
+                mfBorder(0.0),
+                mfOffsetX(0.0),
+                mfOffsetY(0.0),
+                mfAngle(0.0),
+                maStartColor(basegfx::BColor()),
+                maEndColor(basegfx::BColor()),
+                mnSteps(0)
             {
             }
 
@@ -84,27 +92,13 @@
                     && getEndColor() == rCandidate.getEndColor()
                     && getSteps() == rCandidate.getSteps());
             }
-
-            static ImpFillGradientAttribute* get_global_default()
-            {
-                static ImpFillGradientAttribute* pDefault = 0;
-
-                if(!pDefault)
-                {
-                    pDefault = new ImpFillGradientAttribute(
-                        GRADIENTSTYLE_LINEAR,
-                        0.0, 0.0, 0.0, 0.0,
-                        basegfx::BColor(),
-                        basegfx::BColor(),
-                        0);
-
-                    // never delete; start with RefCount 1, not 0
-                    pDefault->mnRefCount++;
-                }
-
-                return pDefault;
-            }
         };
+
+        namespace
+        {
+            struct theGlobalDefault :
+                public rtl::Static< FillGradientAttribute::ImplType, theGlobalDefault > {};
+        }
 
         FillGradientAttribute::FillGradientAttribute(
             GradientStyle eStyle,
@@ -115,73 +109,39 @@
             const basegfx::BColor& rStartColor,
             const basegfx::BColor& rEndColor,
             sal_uInt16 nSteps)
-        :   mpFillGradientAttribute(new ImpFillGradientAttribute(
+        :   mpFillGradientAttribute(ImpFillGradientAttribute(
                 eStyle, fBorder, fOffsetX, fOffsetY, fAngle, rStartColor, rEndColor, nSteps))
         {
         }
 
         FillGradientAttribute::FillGradientAttribute()
-        :   mpFillGradientAttribute(ImpFillGradientAttribute::get_global_default())
+        :   mpFillGradientAttribute(theGlobalDefault::get())
         {
-            mpFillGradientAttribute->mnRefCount++;
         }
 
         FillGradientAttribute::FillGradientAttribute(const FillGradientAttribute& rCandidate)
         :   mpFillGradientAttribute(rCandidate.mpFillGradientAttribute)
         {
-            mpFillGradientAttribute->mnRefCount++;
         }
 
         FillGradientAttribute::~FillGradientAttribute()
         {
-            if(mpFillGradientAttribute->mnRefCount)
-            {
-                mpFillGradientAttribute->mnRefCount--;
-            }
-            else
-            {
-                delete mpFillGradientAttribute;
-            }
         }
 
         bool FillGradientAttribute::isDefault() const
         {
-            return mpFillGradientAttribute == ImpFillGradientAttribute::get_global_default();
+            return mpFillGradientAttribute.same_object(theGlobalDefault::get());
         }
 
         FillGradientAttribute& FillGradientAttribute::operator=(const FillGradientAttribute& 
rCandidate)
         {
-            if(rCandidate.mpFillGradientAttribute != mpFillGradientAttribute)
-            {
-                if(mpFillGradientAttribute->mnRefCount)
-                {
-                    mpFillGradientAttribute->mnRefCount--;
-                }
-                else
-                {
-                    delete mpFillGradientAttribute;
-                }
-
-                mpFillGradientAttribute = rCandidate.mpFillGradientAttribute;
-                mpFillGradientAttribute->mnRefCount++;
-            }
-
+            mpFillGradientAttribute = rCandidate.mpFillGradientAttribute;
             return *this;
         }
 
         bool FillGradientAttribute::operator==(const FillGradientAttribute& rCandidate) const
         {
-            if(rCandidate.mpFillGradientAttribute == mpFillGradientAttribute)
-            {
-                return true;
-            }
-
-            if(rCandidate.isDefault() != isDefault())
-            {
-                return false;
-            }
-
-            return (*rCandidate.mpFillGradientAttribute == *mpFillGradientAttribute);
+            return rCandidate.mpFillGradientAttribute == mpFillGradientAttribute;
         }
 
         const basegfx::BColor& FillGradientAttribute::getStartColor() const

-- 
To view, visit https://gerrit.libreoffice.org/2951
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I85a9864820f49da8ebcc4a7d2c80a3c9d0c13b27
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Thomas Arnhold <thomas@arnhold.org>


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.