Title: [125465] trunk/Source/WebCore
Revision
125465
Author
[email protected]
Date
2012-08-13 15:44:49 -0700 (Mon, 13 Aug 2012)

Log Message

Reduce the size of empty NinePieceImage objects.
<http://webkit.org/b/93747>

Reviewed by Antti Koivisto.

Move the members of NinePieceImage into a NinePieceImageData class, leaving NinePieceImage
with a single OwnPtr<NinePieceImageData> member. The constant NinePieceImage::defaultData()
provides default values for objects with null m_data.

RenderStyle's "StyleSurroundData" member has a BorderData, which in turn holds a NinePieceImage.
This means that anything with left/right/top/bottom, margin, padding or border style but *no*
border-image will save 104 bytes (assuming their RenderStyle is unshared, which is fairly common.)

This reduces the size of StyleSurroundData by 104 bytes, effectively reducing memory consumption
by 1.72MB when viewing the full HTML5 spec at <http://whatwg.org/c>

* rendering/style/NinePieceImage.cpp:
(WebCore::NinePieceImageData::operator==):
(WebCore::NinePieceImage::defaultData):
(WebCore):
* rendering/style/NinePieceImage.h:
(WebCore::NinePieceImageData::NinePieceImageData):
(NinePieceImageData):
(WebCore::NinePieceImageData::operator!=):
(WebCore):
(NinePieceImage):
(WebCore::NinePieceImage::NinePieceImage):
(WebCore::NinePieceImage::operator=):
(WebCore::NinePieceImage::operator==):
(WebCore::NinePieceImage::operator!=):
(WebCore::NinePieceImage::hasImage):
(WebCore::NinePieceImage::image):
(WebCore::NinePieceImage::setImage):
(WebCore::NinePieceImage::imageSlices):
(WebCore::NinePieceImage::setImageSlices):
(WebCore::NinePieceImage::fill):
(WebCore::NinePieceImage::setFill):
(WebCore::NinePieceImage::borderSlices):
(WebCore::NinePieceImage::setBorderSlices):
(WebCore::NinePieceImage::outset):
(WebCore::NinePieceImage::setOutset):
(WebCore::NinePieceImage::horizontalRule):
(WebCore::NinePieceImage::setHorizontalRule):
(WebCore::NinePieceImage::verticalRule):
(WebCore::NinePieceImage::setVerticalRule):
(WebCore::NinePieceImage::copyImageSlicesFrom):
(WebCore::NinePieceImage::copyBorderSlicesFrom):
(WebCore::NinePieceImage::copyOutsetFrom):
(WebCore::NinePieceImage::copyRepeatFrom):
(WebCore::NinePieceImage::setMaskDefaults):
(WebCore::NinePieceImage::ensureData):
(WebCore::NinePieceImage::data):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (125464 => 125465)


--- trunk/Source/WebCore/ChangeLog	2012-08-13 22:42:48 UTC (rev 125464)
+++ trunk/Source/WebCore/ChangeLog	2012-08-13 22:44:49 UTC (rev 125465)
@@ -1,3 +1,58 @@
+2012-08-13  Andreas Kling  <[email protected]>
+
+        Reduce the size of empty NinePieceImage objects.
+        <http://webkit.org/b/93747>
+
+        Reviewed by Antti Koivisto.
+
+        Move the members of NinePieceImage into a NinePieceImageData class, leaving NinePieceImage
+        with a single OwnPtr<NinePieceImageData> member. The constant NinePieceImage::defaultData()
+        provides default values for objects with null m_data.
+
+        RenderStyle's "StyleSurroundData" member has a BorderData, which in turn holds a NinePieceImage.
+        This means that anything with left/right/top/bottom, margin, padding or border style but *no*
+        border-image will save 104 bytes (assuming their RenderStyle is unshared, which is fairly common.)
+
+        This reduces the size of StyleSurroundData by 104 bytes, effectively reducing memory consumption
+        by 1.72MB when viewing the full HTML5 spec at <http://whatwg.org/c>
+
+        * rendering/style/NinePieceImage.cpp:
+        (WebCore::NinePieceImageData::operator==):
+        (WebCore::NinePieceImage::defaultData):
+        (WebCore):
+        * rendering/style/NinePieceImage.h:
+        (WebCore::NinePieceImageData::NinePieceImageData):
+        (NinePieceImageData):
+        (WebCore::NinePieceImageData::operator!=):
+        (WebCore):
+        (NinePieceImage):
+        (WebCore::NinePieceImage::NinePieceImage):
+        (WebCore::NinePieceImage::operator=):
+        (WebCore::NinePieceImage::operator==):
+        (WebCore::NinePieceImage::operator!=):
+        (WebCore::NinePieceImage::hasImage):
+        (WebCore::NinePieceImage::image):
+        (WebCore::NinePieceImage::setImage):
+        (WebCore::NinePieceImage::imageSlices):
+        (WebCore::NinePieceImage::setImageSlices):
+        (WebCore::NinePieceImage::fill):
+        (WebCore::NinePieceImage::setFill):
+        (WebCore::NinePieceImage::borderSlices):
+        (WebCore::NinePieceImage::setBorderSlices):
+        (WebCore::NinePieceImage::outset):
+        (WebCore::NinePieceImage::setOutset):
+        (WebCore::NinePieceImage::horizontalRule):
+        (WebCore::NinePieceImage::setHorizontalRule):
+        (WebCore::NinePieceImage::verticalRule):
+        (WebCore::NinePieceImage::setVerticalRule):
+        (WebCore::NinePieceImage::copyImageSlicesFrom):
+        (WebCore::NinePieceImage::copyBorderSlicesFrom):
+        (WebCore::NinePieceImage::copyOutsetFrom):
+        (WebCore::NinePieceImage::copyRepeatFrom):
+        (WebCore::NinePieceImage::setMaskDefaults):
+        (WebCore::NinePieceImage::ensureData):
+        (WebCore::NinePieceImage::data):
+
 2012-08-13  Florin Malita  <[email protected]>
 
         WebKit+SVG does not support color-interpolation-filters or draw filters in correct colorspace

Modified: trunk/Source/WebCore/rendering/style/NinePieceImage.cpp (125464 => 125465)


--- trunk/Source/WebCore/rendering/style/NinePieceImage.cpp	2012-08-13 22:42:48 UTC (rev 125464)
+++ trunk/Source/WebCore/rendering/style/NinePieceImage.cpp	2012-08-13 22:44:49 UTC (rev 125465)
@@ -26,10 +26,16 @@
 
 namespace WebCore {
 
-bool NinePieceImage::operator==(const NinePieceImage& o) const
+bool NinePieceImageData::operator==(const NinePieceImageData& o) const
 {
     return StyleImage::imagesEquivalent(m_image.get(), o.m_image.get()) && m_imageSlices == o.m_imageSlices && m_fill == o.m_fill
            && m_borderSlices == o.m_borderSlices && m_outset == o.m_outset && m_horizontalRule == o.m_horizontalRule && m_verticalRule == o.m_verticalRule;
 }
 
+const NinePieceImageData& NinePieceImage::defaultData()
+{
+    DEFINE_STATIC_LOCAL(NinePieceImageData, data, ());
+    return data;
 }
+
+}

Modified: trunk/Source/WebCore/rendering/style/NinePieceImage.h (125464 => 125465)


--- trunk/Source/WebCore/rendering/style/NinePieceImage.h	2012-08-13 22:42:48 UTC (rev 125464)
+++ trunk/Source/WebCore/rendering/style/NinePieceImage.h	2012-08-13 22:44:49 UTC (rev 125465)
@@ -34,9 +34,9 @@
     StretchImageRule, RoundImageRule, SpaceImageRule, RepeatImageRule
 };
 
-class NinePieceImage {
+class NinePieceImageData {
 public:
-    NinePieceImage()
+    NinePieceImageData()
         : m_image(0)
         , m_imageSlices(Length(100, Percent), Length(100, Percent), Length(100, Percent), Length(100, Percent))
         , m_borderSlices(Length(1, Relative), Length(1, Relative), Length(1, Relative), Length(1, Relative))
@@ -47,7 +47,7 @@
     {
     }
 
-    NinePieceImage(PassRefPtr<StyleImage> image, LengthBox imageSlices, bool fill, LengthBox borderSlices, LengthBox outset, ENinePieceImageRule h, ENinePieceImageRule v) 
+    NinePieceImageData(PassRefPtr<StyleImage> image, LengthBox imageSlices, bool fill, LengthBox borderSlices, LengthBox outset, ENinePieceImageRule h, ENinePieceImageRule v)
       : m_image(image)
       , m_imageSlices(imageSlices)
       , m_borderSlices(borderSlices)
@@ -58,24 +58,55 @@
     {
     }
 
-    bool operator==(const NinePieceImage& o) const;
-    bool operator!=(const NinePieceImage& o) const { return !(*this == o); }
+    bool operator==(const NinePieceImageData&) const;
+    bool operator!=(const NinePieceImageData& o) const { return !(*this == o); }
 
-    bool hasImage() const { return m_image != 0; }
-    StyleImage* image() const { return m_image.get(); }
-    void setImage(PassRefPtr<StyleImage> image) { m_image = image; }
+    RefPtr<StyleImage> m_image;
+    LengthBox m_imageSlices;
+    LengthBox m_borderSlices;
+    LengthBox m_outset;
+    bool m_fill : 1;
+    unsigned m_horizontalRule : 2; // ENinePieceImageRule
+    unsigned m_verticalRule : 2; // ENinePieceImageRule
+};
+
+class NinePieceImage {
+public:
+    NinePieceImage() { }
+
+    NinePieceImage(PassRefPtr<StyleImage> image, LengthBox imageSlices, bool fill, LengthBox borderSlices, LengthBox outset, ENinePieceImageRule h, ENinePieceImageRule v)
+        : m_data(adoptPtr(new NinePieceImageData(image, imageSlices, fill, borderSlices, outset, h, v)))
+    { }
+
+    NinePieceImage(const NinePieceImage& other)
+    {
+        *this = other;
+    }
+
+    void operator=(const NinePieceImage& other)
+    {
+        const NinePieceImageData& otherData = other.data();
+        m_data = adoptPtr(new NinePieceImageData(otherData.m_image, otherData.m_imageSlices, otherData.m_fill, otherData.m_borderSlices, otherData.m_outset, static_cast<ENinePieceImageRule>(otherData.m_horizontalRule), static_cast<ENinePieceImageRule>(otherData.m_verticalRule)));
+    }
+
+    bool operator==(const NinePieceImage& other) const { return data() == other.data(); }
+    bool operator!=(const NinePieceImage& other) const { return !(*this == other); }
+
+    bool hasImage() const { return m_data && m_data->m_image; }
+    StyleImage* image() const { return m_data ? m_data->m_image.get() : 0; }
+    void setImage(PassRefPtr<StyleImage> image) { ensureData(); m_data->m_image = image; }
     
-    const LengthBox& imageSlices() const { return m_imageSlices; }
-    void setImageSlices(const LengthBox& slices) { m_imageSlices = slices; }
+    const LengthBox& imageSlices() const { return data().m_imageSlices; }
+    void setImageSlices(const LengthBox& slices) { ensureData(); m_data->m_imageSlices = slices; }
 
-    bool fill() const { return m_fill; }
-    void setFill(bool fill) { m_fill = fill; }
+    bool fill() const { return data().m_fill; }
+    void setFill(bool fill) { ensureData(); m_data->m_fill = fill; }
 
-    const LengthBox& borderSlices() const { return m_borderSlices; }
-    void setBorderSlices(const LengthBox& slices) { m_borderSlices = slices; }
+    const LengthBox& borderSlices() const { return data().m_borderSlices; }
+    void setBorderSlices(const LengthBox& slices) { ensureData(); m_data->m_borderSlices = slices; }
 
-    const LengthBox& outset() const { return m_outset; }
-    void setOutset(const LengthBox& outset) { m_outset = outset; }
+    const LengthBox& outset() const { return data().m_outset; }
+    void setOutset(const LengthBox& outset) { ensureData(); m_data->m_outset = outset; }
     
     static LayoutUnit computeOutset(Length outsetSide, LayoutUnit borderSide)
     {
@@ -84,49 +115,63 @@
         return outsetSide.value();
     }
 
-    ENinePieceImageRule horizontalRule() const { return static_cast<ENinePieceImageRule>(m_horizontalRule); }
-    void setHorizontalRule(ENinePieceImageRule rule) { m_horizontalRule = rule; }
+    ENinePieceImageRule horizontalRule() const { return static_cast<ENinePieceImageRule>(data().m_horizontalRule); }
+    void setHorizontalRule(ENinePieceImageRule rule) { ensureData(); m_data->m_horizontalRule = rule; }
     
-    ENinePieceImageRule verticalRule() const { return static_cast<ENinePieceImageRule>(m_verticalRule); }
-    void setVerticalRule(ENinePieceImageRule rule) { m_verticalRule = rule; }
+    ENinePieceImageRule verticalRule() const { return static_cast<ENinePieceImageRule>(data().m_verticalRule); }
+    void setVerticalRule(ENinePieceImageRule rule) { ensureData(); m_data->m_verticalRule = rule; }
 
     void copyImageSlicesFrom(const NinePieceImage& other)
     {
-        m_imageSlices = other.m_imageSlices;
-        m_fill = other.m_fill;
+        ensureData();
+        m_data->m_imageSlices = other.data().m_imageSlices;
+        m_data->m_fill = other.data().m_fill;
     }
 
     void copyBorderSlicesFrom(const NinePieceImage& other)
     {
-        m_borderSlices = other.m_borderSlices;
+        ensureData();
+        m_data->m_borderSlices = other.data().m_borderSlices;
     }
     
     void copyOutsetFrom(const NinePieceImage& other)
     {
-        m_outset = other.m_outset;
+        ensureData();
+        m_data->m_outset = other.data().m_outset;
     }
 
     void copyRepeatFrom(const NinePieceImage& other)
     {
-        m_horizontalRule = other.m_horizontalRule;
-        m_verticalRule = other.m_verticalRule;
+        ensureData();
+        m_data->m_horizontalRule = other.data().m_horizontalRule;
+        m_data->m_verticalRule = other.data().m_verticalRule;
     }
 
     void setMaskDefaults()
     {
-        m_imageSlices = LengthBox(0);
-        m_fill = true;
-        m_borderSlices = LengthBox();
+        ensureData();
+        m_data->m_imageSlices = LengthBox(0);
+        m_data->m_fill = true;
+        m_data->m_borderSlices = LengthBox();
     }
 
 private:
-    RefPtr<StyleImage> m_image;
-    LengthBox m_imageSlices;
-    LengthBox m_borderSlices;
-    LengthBox m_outset;
-    bool m_fill : 1;
-    unsigned m_horizontalRule : 2; // ENinePieceImageRule
-    unsigned m_verticalRule : 2; // ENinePieceImageRule
+    static const NinePieceImageData& defaultData();
+
+    void ensureData()
+    {
+        if (!m_data)
+            m_data = adoptPtr(new NinePieceImageData);
+    }
+
+    const NinePieceImageData& data() const
+    {
+        if (m_data)
+            return *m_data;
+        return defaultData();
+    }
+
+    OwnPtr<NinePieceImageData> m_data;
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to