Reviewed by Hyatt.
authorantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Apr 2007 09:43:08 +0000 (09:43 +0000)
committerantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Apr 2007 09:43:08 +0000 (09:43 +0000)
        Render tree memory savings, part 2

        - Move staticX and staticY variables to RenderLayer since they are only
          applicable to positioned objects
        - Move very rarely used overrideSize variable to hash

        These changes shrink all box types by 12 bytes

        * rendering/RenderBox.cpp:
        (WebCore::RenderBox::RenderBox):
        (WebCore::RenderBox::destroy):
        (WebCore::RenderBox::overrideSize):
        (WebCore::RenderBox::setOverrideSize):
        (WebCore::RenderBox::overrideWidth):
        (WebCore::RenderBox::overrideHeight):
        (WebCore::RenderBox::position):
        (WebCore::RenderBox::calcWidth):
        (WebCore::RenderBox::calcHeight):
        (WebCore::RenderBox::staticX):
        (WebCore::RenderBox::staticY):
        (WebCore::RenderBox::setStaticX):
        (WebCore::RenderBox::setStaticY):
        (WebCore::RenderBox::calcAbsoluteHorizontal):
        (WebCore::RenderBox::calcAbsoluteVertical):
        (WebCore::RenderBox::calcAbsoluteHorizontalReplaced):
        (WebCore::RenderBox::calcAbsoluteVerticalReplaced):
        * rendering/RenderBox.h:
        * rendering/RenderLayer.cpp:
        (WebCore::RenderLayer::RenderLayer):
        * rendering/RenderLayer.h:
        (WebCore::RenderLayer::staticX):
        (WebCore::RenderLayer::staticY):
        (WebCore::RenderLayer::setStaticX):
        (WebCore::RenderLayer::setStaticY):
        * rendering/RenderObject.cpp:
        (WebCore::RenderObject::RenderObject):
        * rendering/RenderObject.h:
        (WebCore::):
        (WebCore::RenderObject::hasOverrideSize):
        (WebCore::RenderObject::setHasOverrideSize):
        * rendering/RenderWidget.cpp:
        (WebCore::RenderWidget::destroy):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@20653 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/rendering/RenderBox.cpp
WebCore/rendering/RenderBox.h
WebCore/rendering/RenderFlexibleBox.cpp
WebCore/rendering/RenderLayer.cpp
WebCore/rendering/RenderLayer.h
WebCore/rendering/RenderObject.cpp
WebCore/rendering/RenderObject.h
WebCore/rendering/RenderWidget.cpp

index 0976e62f7301964331caba644f1dda71310736da..e8a84c9c62897629cdb255a96a38d246bb5a6438 100644 (file)
@@ -1,3 +1,50 @@
+2007-03-30  Antti Koivisto  <antti@apple.com>
+
+        Reviewed by Hyatt.
+
+        Render tree memory savings, part 2
+        
+        - Move staticX and staticY variables to RenderLayer since they are only
+          applicable to positioned objects
+        - Move very rarely used overrideSize variable to hash
+        
+        These changes shrink all box types by 12 bytes
+
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::RenderBox):
+        (WebCore::RenderBox::destroy):
+        (WebCore::RenderBox::overrideSize):
+        (WebCore::RenderBox::setOverrideSize):
+        (WebCore::RenderBox::overrideWidth):
+        (WebCore::RenderBox::overrideHeight):
+        (WebCore::RenderBox::position):
+        (WebCore::RenderBox::calcWidth):
+        (WebCore::RenderBox::calcHeight):
+        (WebCore::RenderBox::staticX):
+        (WebCore::RenderBox::staticY):
+        (WebCore::RenderBox::setStaticX):
+        (WebCore::RenderBox::setStaticY):
+        (WebCore::RenderBox::calcAbsoluteHorizontal):
+        (WebCore::RenderBox::calcAbsoluteVertical):
+        (WebCore::RenderBox::calcAbsoluteHorizontalReplaced):
+        (WebCore::RenderBox::calcAbsoluteVerticalReplaced):
+        * rendering/RenderBox.h:
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::RenderLayer):
+        * rendering/RenderLayer.h:
+        (WebCore::RenderLayer::staticX):
+        (WebCore::RenderLayer::staticY):
+        (WebCore::RenderLayer::setStaticX):
+        (WebCore::RenderLayer::setStaticY):
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::RenderObject):
+        * rendering/RenderObject.h:
+        (WebCore::):
+        (WebCore::RenderObject::hasOverrideSize):
+        (WebCore::RenderObject::setHasOverrideSize):
+        * rendering/RenderWidget.cpp:
+        (WebCore::RenderWidget::destroy):
+
 2007-03-31  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>
 
         Not reviewed - gdk build fix.
index e46e114cb14ec2597505441421721c44fc29076b..59d6ec7e748b6eec9586aa222c3ef044d8f8748d 100644 (file)
@@ -49,6 +49,10 @@ using std::max;
 namespace WebCore {
 
 using namespace HTMLNames;
+    
+// Used by flexible boxes when flexing this element.
+typedef WTF::HashMap<const RenderBox*, int> OverrideSizeMap;
+static OverrideSizeMap* gOverrideSizeMap = 0;
 
 RenderBox::RenderBox(Node* node)
     : RenderObject(node)
@@ -64,9 +68,6 @@ RenderBox::RenderBox(Node* node)
     , m_maxWidth(-1)
     , m_layer(0)
     , m_inlineBoxWrapper(0)
-    , m_overrideSize(-1)
-    , m_staticX(0)
-    , m_staticY(0)
 {
 }
 
@@ -148,6 +149,9 @@ void RenderBox::destroy()
     // A lot of the code in this funtion is just pasted into
     // RenderWidget::destroy. If anything in this function changes,
     // be sure to fix RenderWidget::destroy() as well.
+    
+    if (hasOverrideSize())
+        gOverrideSizeMap->remove(this);
 
     RenderLayer* layer = m_layer;
     RenderArena* arena = renderArena();
@@ -162,14 +166,36 @@ void RenderBox::destroy()
         layer->destroy(arena);
 }
 
+int RenderBox::overrideSize() const
+{
+    if (!hasOverrideSize())
+        return -1;
+    return gOverrideSizeMap->get(this);
+}
+
+void RenderBox::setOverrideSize(int s)
+{
+    if (s == -1) {
+        if (hasOverrideSize()) {
+            setHasOverrideSize(false);
+            gOverrideSizeMap->remove(this);
+        }
+    } else {
+        if (!gOverrideSizeMap)
+            gOverrideSizeMap = new OverrideSizeMap();
+        setHasOverrideSize(true);
+        gOverrideSizeMap->set(this, s);
+    }
+}
+
 int RenderBox::overrideWidth() const
 {
-    return m_overrideSize == -1 ? m_width : m_overrideSize;
+    return hasOverrideSize() ? overrideSize() : m_width;
 }
 
 int RenderBox::overrideHeight() const
 {
-    return m_overrideSize == -1 ? m_height : m_overrideSize;
+    return hasOverrideSize() ? overrideSize() : m_height;
 }
 
 void RenderBox::setPos(int xPos, int yPos)
@@ -821,14 +847,14 @@ void RenderBox::position(InlineBox* box)
             // The value is cached in the xPos of the box.  We only need this value if
             // our object was inline originally, since otherwise it would have ended up underneath
             // the inlines.
-            m_staticX = box->xPos();
+            setStaticX(box->xPos());
             setChildNeedsLayout(true, false); // Just go ahead and mark the positioned object as needing layout, so it will update its position properly.
         } else if (!wasInline && hasStaticY()) {
             // Our object was a block originally, so we make our normal flow position be
             // just below the line box (as though all the inlines that came before us got
             // wrapped in an anonymous block, which is what would have happened had we been
             // in flow).  This value was cached in the yPos() of the box.
-            m_staticY = box->yPos();
+            setStaticY(box->yPos());
             setChildNeedsLayout(true, false); // Just go ahead and mark the positioned object as needing layout, so it will update its position properly.
         }
 
@@ -1015,9 +1041,9 @@ void RenderBox::calcWidth()
 
     // The parent box is flexing us, so it has increased or decreased our
     // width.  Use the width from the style context.
-    if (m_overrideSize != -1 && parent()->style()->boxOrient() == HORIZONTAL
+    if (hasOverrideSize() &&  parent()->style()->boxOrient() == HORIZONTAL
             && parent()->isFlexibleBox() && parent()->isFlexingChildren()) {
-        m_width = m_overrideSize;
+        m_width = overrideSize();
         return;
     }
 
@@ -1200,9 +1226,9 @@ void RenderBox::calcHeight()
 
         // The parent box is flexing us, so it has increased or decreased our height.  We have to
         // grab our cached flexible height.
-        if (m_overrideSize != -1 && parent()->isFlexibleBox() && parent()->style()->boxOrient() == VERTICAL
+        if (hasOverrideSize() && parent()->isFlexibleBox() && parent()->style()->boxOrient() == VERTICAL
                 && parent()->isFlexingChildren())
-            h = Length(m_overrideSize - borderTop() - borderBottom() - paddingTop() - paddingBottom(), Fixed);
+            h = Length(overrideSize() - borderTop() - borderBottom() - paddingTop() - paddingBottom(), Fixed);
         else if (treatAsReplaced)
             h = Length(calcReplacedHeight(), Fixed);
         else {
@@ -1441,12 +1467,30 @@ void RenderBox::calcVerticalMargins()
     m_marginBottom = style()->marginBottom().calcMinValue(cw);
 }
 
+int RenderBox::staticX() const
+{
+    return m_layer ? m_layer->staticX() : 0;
+}
+
+int RenderBox::staticY() const
+{
+    return m_layer ? m_layer->staticY() : 0;
+}
+
+void RenderBox::setStaticX(int staticX)
+{
+    ASSERT(isPositioned());
+    m_layer->setStaticX(staticX);
+}
+
 void RenderBox::setStaticY(int staticY)
 {
-    if (staticY == m_staticY)
+    ASSERT(isPositioned());
+    
+    if (staticY == m_layer->staticY())
         return;
     
-    m_staticY = staticY;
+    m_layer->setStaticY(staticY);
     setChildNeedsLayout(true, false);
 }
 
@@ -1560,15 +1604,15 @@ void RenderBox::calcAbsoluteHorizontal()
     // Calculate the static distance if needed.
     if (left.isAuto() && right.isAuto()) {
         if (containerDirection == LTR) {
-            // 'm_staticX' should already have been set through layout of the parent.
-            int staticPosition = m_staticX - containerBlock->borderLeft();
+            // 'staticX' should already have been set through layout of the parent.
+            int staticPosition = staticX() - containerBlock->borderLeft();
             for (RenderObject* po = parent(); po && po != containerBlock; po = po->parent())
                 staticPosition += po->xPos();
             left.setValue(Fixed, staticPosition);
         } else {
             RenderObject* po = parent();
-            // 'm_staticX' should already have been set through layout of the parent.
-            int staticPosition = m_staticX + containerWidth + containerBlock->borderRight() - po->width();
+            // 'staticX' should already have been set through layout of the parent.
+            int staticPosition = staticX() + containerWidth + containerBlock->borderRight() - po->width();
             for (; po && po != containerBlock; po = po->parent())
                 staticPosition -= po->xPos();
             right.setValue(Fixed, staticPosition);
@@ -1848,8 +1892,8 @@ void RenderBox::calcAbsoluteVertical()
     // see FIXME 2
     // Calculate the static distance if needed.
     if (top.isAuto() && bottom.isAuto()) {
-        // m_staticY should already have been set through layout of the parent()
-        int staticTop = m_staticY - containerBlock->borderTop();
+        // staticY should already have been set through layout of the parent()
+        int staticTop = staticY() - containerBlock->borderTop();
         for (RenderObject* po = parent(); po && po != containerBlock; po = po->parent()) {
             if (!po->isTableRow())
                 staticTop += po->yPos();
@@ -2073,15 +2117,15 @@ void RenderBox::calcAbsoluteHorizontalReplaced()
     if (left.isAuto() && right.isAuto()) {
         // see FIXME 1
         if (containerDirection == LTR) {
-            // 'm_staticX' should already have been set through layout of the parent.
-            int staticPosition = m_staticX - containerBlock->borderLeft();
+            // 'staticX' should already have been set through layout of the parent.
+            int staticPosition = staticX() - containerBlock->borderLeft();
             for (RenderObject* po = parent(); po && po != containerBlock; po = po->parent())
                 staticPosition += po->xPos();
             left.setValue(Fixed, staticPosition);
         } else {
             RenderObject* po = parent();
-            // 'm_staticX' should already have been set through layout of the parent.
-            int staticPosition = m_staticX + containerWidth + containerBlock->borderRight() - po->width();
+            // 'staticX' should already have been set through layout of the parent.
+            int staticPosition = staticX() + containerWidth + containerBlock->borderRight() - po->width();
             for (; po && po != containerBlock; po = po->parent())
                 staticPosition -= po->xPos();
             right.setValue(Fixed, staticPosition);
@@ -2239,8 +2283,8 @@ void RenderBox::calcAbsoluteVerticalReplaced()
     \*-----------------------------------------------------------------------*/
     // see FIXME 2
     if (top.isAuto() && bottom.isAuto()) {
-        // m_staticY should already have been set through layout of the parent().
-        int staticTop = m_staticY - containerBlock->borderTop();
+        // staticY should already have been set through layout of the parent().
+        int staticTop = staticY() - containerBlock->borderTop();
         for (RenderObject* po = parent(); po && po != containerBlock; po = po->parent()) {
             if (!po->isTableRow())
                 staticTop += po->yPos();
index 28c640933b43cf0f80b7643dda97e5f354502e2b..19bd46d29659cb580d361fb2015b1d01fb9f4c4c 100644 (file)
@@ -45,10 +45,10 @@ public:
     virtual int minWidth() const { return m_minWidth; }
     virtual int maxWidth() const { return m_maxWidth; }
 
-    virtual int overrideSize() const { return m_overrideSize; }
+    virtual int overrideSize() const;
     virtual int overrideWidth() const;
     virtual int overrideHeight() const;
-    virtual void setOverrideSize(int s) { m_overrideSize = s; }
+    virtual void setOverrideSize(int);
 
     virtual bool absolutePosition(int& x, int& y, bool fixed = false) const;
 
@@ -141,9 +141,9 @@ public:
     virtual void paintBackgroundExtended(GraphicsContext*, const Color&, const BackgroundLayer*, int clipY, int clipHeight,
                                          int tx, int ty, int width, int height, bool includeLeftEdge = true, bool includeRightEdge = true);
 
-    virtual int staticX() const { return m_staticX; }
-    virtual int staticY() const { return m_staticY; }
-    virtual void setStaticX(int staticX) { m_staticX = staticX; }
+    virtual int staticX() const;
+    virtual int staticY() const;
+    virtual void setStaticX(int staticX);
     virtual void setStaticY(int staticY);
 
     virtual IntRect getOverflowClipRect(int tx, int ty);
@@ -208,14 +208,6 @@ protected:
 
     // For inline replaced elements, the inline box that owns us.
     InlineBox* m_inlineBoxWrapper;
-
-private:
-    // Used by flexible boxes when flexing this element.
-    int m_overrideSize;
-
-    // Cached normal flow values for absolute positioned elements with static left/top values.
-    int m_staticX;
-    int m_staticY;
 };
 
 } // namespace WebCore
index 984c70b451f7b32d86b9fafba74c51a6270376cc..2300edc92e564eb321851b4ae70944eb77ce0e9e 100644 (file)
@@ -314,11 +314,14 @@ void RenderFlexibleBox::layoutBlock(bool relayoutChildren)
         // bottom margin max values to 0.  This way we don't factor in the values
         // twice when we collapse with our previous vertically adjacent and
         // following vertically adjacent blocks.
-        if (m_maxBottomPosMargin > m_maxTopPosMargin)
-            m_maxTopPosMargin = m_maxBottomPosMargin;
-        if (m_maxBottomNegMargin > m_maxTopNegMargin)
-            m_maxTopNegMargin = m_maxBottomNegMargin;
-        m_maxBottomNegMargin = m_maxBottomPosMargin = 0;
+        int pos = maxTopPosMargin();
+        int neg = maxTopNegMargin();
+        if (maxBottomPosMargin() > pos)
+            pos = maxBottomPosMargin();
+        if (maxBottomNegMargin() > neg)
+            neg = maxBottomNegMargin();
+        setMaxTopMargins(pos, neg);
+        setMaxBottomMargins(0, 0);
     }
 
     // Always ensure our overflow width is at least as large as our width.
index 77c54f3973a542799caf5ace5aa5a3125ad803ca..c7d761406dc662337b70d5958ab0a6480343320d 100644 (file)
@@ -148,6 +148,8 @@ RenderLayer::RenderLayer(RenderObject* object)
     , m_visibleDescendantStatusDirty(false)
     , m_hasVisibleDescendant(false)
     , m_marquee(0)
+    , m_staticX(0)
+    , m_staticY(0)
 {
     if (!object->firstChild() && object->style()) {
         m_visibleContentStatusDirty = false;
index 824959045be957bbe4946a7096ba4c95ee9b82e7..4ef87a38e994affa2537947e607f8c5ed97597cb 100644 (file)
@@ -338,6 +338,11 @@ public:
     void updateHoverActiveState(const HitTestRequest&, HitTestResult&);
 
     IntRect repaintRect() const { return m_repaintRect; }
+    
+    int staticX() const { return m_staticX; }
+    int staticY() const { return m_staticY; }
+    void setStaticX(int staticX) { m_staticX = staticX; }
+    void setStaticY(int staticY) { m_staticY = staticY; }
 
     void destroy(RenderArena*);
 
@@ -450,6 +455,10 @@ protected:
     bool m_hasVisibleDescendant : 1;
 
     Marquee* m_marquee; // Used by layers with overflow:marquee
+    
+    // Cached normal flow values for absolute positioned elements with static left/top values.
+    int m_staticX;
+    int m_staticY;
 };
 
 } // namespace WebCore
index 56325db8a834ddcb29f35b20c54184862f9421c2..ec3d38be493f32c08cba9a614e61df4baf7d2815 100644 (file)
@@ -188,6 +188,7 @@ RenderObject::RenderObject(Node* node)
     , m_replaced(false)
     , m_isDragging(false)
     , m_hasOverflowClip(false)
+    , m_hasOverrideSize(false)
     , m_hasCounterNodeMap(false)
 {
 #ifndef NDEBUG
index 2b54907bfd08ef38ecb505a1f6a081dcdcb2f594..de51cd2d63b7f9a0d7c2de06e488ff5d3a68fb59 100644 (file)
@@ -101,9 +101,9 @@ enum HitTestAction {
 };
 
 enum VerticalPositionHint {
-    PositionTop = -0x4000,
-    PositionBottom = 0x4000,
-    PositionUndefined = 0x3fff
+    PositionTop = -0x2000,
+    PositionBottom = 0x2000,
+    PositionUndefined = 0x1fff
 };
 
 struct DashboardRegionValue {
@@ -881,6 +881,9 @@ public:
         return !paintInfo.paintingRoot || paintInfo.paintingRoot == this;
     }
 
+    bool hasOverrideSize() const { return m_hasOverrideSize; }
+    void setHasOverrideSize(bool b) { m_hasOverrideSize = b; }
+    
     void remove() { if (parent()) parent()->removeChild(this); }
 
 protected:
@@ -904,7 +907,7 @@ private:
     RenderObject* m_previous;
     RenderObject* m_next;
 
-    mutable short m_verticalPosition;
+    mutable short m_verticalPosition : 15;
 
     bool m_needsLayout               : 1;
     bool m_normalChildNeedsLayout    : 1;
@@ -926,6 +929,8 @@ private:
 
     bool m_hasOverflowClip           : 1;
 
+    bool m_hasOverrideSize           : 1;
+    
 public:
     bool m_hasCounterNodeMap         : 1;
 };
index 6e443e6a259e8e04885e380397be280e332e3109..87e71742460a0c973702ffd12d739e937daca2c7 100644 (file)
@@ -84,6 +84,10 @@ void RenderWidget::destroy()
             m_view->removeChild(m_widget);
         widgetRendererMap().remove(m_widget);
     }
+    
+    // removes from override size map
+    if (hasOverrideSize())
+        setOverrideSize(-1);
 
     RenderLayer* layer = m_layer;
     RenderArena* arena = renderArena();