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/2954

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/54/2954/1

fdo#62525: use cow_wrapper for FillGradientAttribute

a       xmlsecurity/workben/signaturetest.cxx.wo

Change-Id: I13aa9817d7abd3753579f6825c166191a836eef3
---
M drawinglayer/inc/drawinglayer/attribute/fillgradientattribute.hxx
M drawinglayer/source/attribute/fillgradientattribute.cxx
2 files changed, 30 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..6664791 100644
--- a/drawinglayer/source/attribute/fillgradientattribute.cxx
+++ b/drawinglayer/source/attribute/fillgradientattribute.cxx
@@ -19,6 +19,7 @@
 
 #include <drawinglayer/attribute/fillgradientattribute.hxx>
 #include <basegfx/color/bcolor.hxx>
+#include <rtl/instance.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -29,9 +30,6 @@
         class ImpFillGradientAttribute
         {
         public:
-            // refcounter
-            sal_uInt32                              mnRefCount;
-
             // data definitions
             GradientStyle                           meStyle;
             double                                  mfBorder;
@@ -51,8 +49,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 +57,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 +93,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 +110,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/2954
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I13aa9817d7abd3753579f6825c166191a836eef3
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.