<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[20673] trunk/WebCore</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/20673">20673</a></dd>
<dt>Author</dt> <dd>antti</dd>
<dt>Date</dt> <dd>2007-04-02 18:01:09 -0700 (Mon, 02 Apr 2007)</dd>
</dl>

<h3>Log Message</h3>
<pre>        Reviewed by Hyatt.

        Render tree memory savings, part 3
        
        These changes shrink all RenderBlocks by additional 28 bytes. Together with parts 1 and 2
        RenderBlock goes from 172 bytes to 128 bytes, a saving of 26%.
        
        - Pack bitfields together in RenderFlow
        - Move top/bottom min/max margin values to a struct that is only allocated in case these
          variables have non default values. Usually this is &lt;5% of all blocks. 
        - Move rarely used column variables to hash

        * rendering/RenderBlock.cpp:
        (WebCore::ColumnInfo::ColumnInfo):
        (WebCore::RenderBlock::RenderBlock):
        (WebCore::RenderBlock::~RenderBlock):
        (WebCore::RenderBlock::layoutBlock):
        (WebCore::RenderBlock::collapseMargins):
        (WebCore::RenderBlock::clearFloatsIfNeeded):
        (WebCore::RenderBlock::setCollapsedBottomMargin):
        (WebCore::RenderBlock::layoutBlockChildren):
        (WebCore::RenderBlock::paintColumns):
        (WebCore::RenderBlock::paintObject):
        (WebCore::RenderBlock::fillSelectionGaps):
        (WebCore::RenderBlock::lowestPosition):
        (WebCore::RenderBlock::rightmostPosition):
        (WebCore::RenderBlock::leftmostPosition):
        (WebCore::RenderBlock::nodeAtPoint):
        (WebCore::RenderBlock::hitTestColumns):
        (WebCore::RenderBlock::positionForCoordinates):
        (WebCore::RenderBlock::availableWidth):
        (WebCore::RenderBlock::calcColumnWidth):
        (WebCore::RenderBlock::setDesiredColumnCountAndWidth):
        (WebCore::RenderBlock::desiredColumnWidth):
        (WebCore::RenderBlock::desiredColumnCount):
        (WebCore::RenderBlock::columnRects):
        (WebCore::RenderBlock::layoutColumns):
        (WebCore::RenderBlock::adjustPointToColumnContents):
        (WebCore::RenderBlock::adjustRectForColumns):
        (WebCore::RenderBlock::setMaxTopMargins):
        (WebCore::RenderBlock::setMaxBottomMargins):
        * rendering/RenderBlock.h:
        (WebCore::RenderBlock::maxTopMargin):
        (WebCore::RenderBlock::maxBottomMargin):
        (WebCore::RenderBlock::maxTopPosMargin):
        (WebCore::RenderBlock::maxTopNegMargin):
        (WebCore::RenderBlock::maxBottomPosMargin):
        (WebCore::RenderBlock::maxBottomNegMargin):
        (WebCore::RenderBlock::initMaxMarginValues):
        (WebCore::RenderBlock::MaxMargin::MaxMargin):
        (WebCore::RenderBlock::MaxMargin::topPosDefault):
        (WebCore::RenderBlock::MaxMargin::topNegDefault):
        (WebCore::RenderBlock::MaxMargin::bottomPosDefault):
        (WebCore::RenderBlock::MaxMargin::bottomNegDefault):
        * rendering/RenderFlexibleBox.cpp:
        (WebCore::RenderFlexibleBox::layoutBlock):
        * rendering/RenderFlow.h:
        (WebCore::RenderFlow::RenderFlow):
        (WebCore::RenderFlow::hasColumns):
        * rendering/RenderInline.cpp:
        (WebCore::RenderInline::RenderInline):
        * rendering/RenderInline.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebCoreChangeLog">trunk/WebCore/ChangeLog</a></li>
<li><a href="#trunkWebCorerenderingRenderBlockcpp">trunk/WebCore/rendering/RenderBlock.cpp</a></li>
<li><a href="#trunkWebCorerenderingRenderBlockh">trunk/WebCore/rendering/RenderBlock.h</a></li>
<li><a href="#trunkWebCorerenderingRenderFlexibleBoxcpp">trunk/WebCore/rendering/RenderFlexibleBox.cpp</a></li>
<li><a href="#trunkWebCorerenderingRenderFlowh">trunk/WebCore/rendering/RenderFlow.h</a></li>
<li><a href="#trunkWebCorerenderingRenderInlinecpp">trunk/WebCore/rendering/RenderInline.cpp</a></li>
<li><a href="#trunkWebCorerenderingRenderInlineh">trunk/WebCore/rendering/RenderInline.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/ChangeLog (20672 => 20673)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/ChangeLog        2007-04-03 00:22:30 UTC (rev 20672)
+++ trunk/WebCore/ChangeLog        2007-04-03 01:01:09 UTC (rev 20673)
</span><span class="lines">@@ -2,6 +2,71 @@
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Hyatt.
</span><span class="cx"> 
</span><ins>+        Render tree memory savings, part 3
+        
+        These changes shrink all RenderBlocks by additional 28 bytes. Together with parts 1 and 2
+        RenderBlock goes from 172 bytes to 128 bytes, a saving of 26%.
+        
+        - Pack bitfields together in RenderFlow
+        - Move top/bottom min/max margin values to a struct that is only allocated in case these
+          variables have non default values. Usually this is &lt;5% of all blocks. 
+        - Move rarely used column variables to hash
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::ColumnInfo::ColumnInfo):
+        (WebCore::RenderBlock::RenderBlock):
+        (WebCore::RenderBlock::~RenderBlock):
+        (WebCore::RenderBlock::layoutBlock):
+        (WebCore::RenderBlock::collapseMargins):
+        (WebCore::RenderBlock::clearFloatsIfNeeded):
+        (WebCore::RenderBlock::setCollapsedBottomMargin):
+        (WebCore::RenderBlock::layoutBlockChildren):
+        (WebCore::RenderBlock::paintColumns):
+        (WebCore::RenderBlock::paintObject):
+        (WebCore::RenderBlock::fillSelectionGaps):
+        (WebCore::RenderBlock::lowestPosition):
+        (WebCore::RenderBlock::rightmostPosition):
+        (WebCore::RenderBlock::leftmostPosition):
+        (WebCore::RenderBlock::nodeAtPoint):
+        (WebCore::RenderBlock::hitTestColumns):
+        (WebCore::RenderBlock::positionForCoordinates):
+        (WebCore::RenderBlock::availableWidth):
+        (WebCore::RenderBlock::calcColumnWidth):
+        (WebCore::RenderBlock::setDesiredColumnCountAndWidth):
+        (WebCore::RenderBlock::desiredColumnWidth):
+        (WebCore::RenderBlock::desiredColumnCount):
+        (WebCore::RenderBlock::columnRects):
+        (WebCore::RenderBlock::layoutColumns):
+        (WebCore::RenderBlock::adjustPointToColumnContents):
+        (WebCore::RenderBlock::adjustRectForColumns):
+        (WebCore::RenderBlock::setMaxTopMargins):
+        (WebCore::RenderBlock::setMaxBottomMargins):
+        * rendering/RenderBlock.h:
+        (WebCore::RenderBlock::maxTopMargin):
+        (WebCore::RenderBlock::maxBottomMargin):
+        (WebCore::RenderBlock::maxTopPosMargin):
+        (WebCore::RenderBlock::maxTopNegMargin):
+        (WebCore::RenderBlock::maxBottomPosMargin):
+        (WebCore::RenderBlock::maxBottomNegMargin):
+        (WebCore::RenderBlock::initMaxMarginValues):
+        (WebCore::RenderBlock::MaxMargin::MaxMargin):
+        (WebCore::RenderBlock::MaxMargin::topPosDefault):
+        (WebCore::RenderBlock::MaxMargin::topNegDefault):
+        (WebCore::RenderBlock::MaxMargin::bottomPosDefault):
+        (WebCore::RenderBlock::MaxMargin::bottomNegDefault):
+        * rendering/RenderFlexibleBox.cpp:
+        (WebCore::RenderFlexibleBox::layoutBlock):
+        * rendering/RenderFlow.h:
+        (WebCore::RenderFlow::RenderFlow):
+        (WebCore::RenderFlow::hasColumns):
+        * rendering/RenderInline.cpp:
+        (WebCore::RenderInline::RenderInline):
+        * rendering/RenderInline.h:
+
+2007-04-03  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        Reviewed by Hyatt.
+
</ins><span class="cx">         Fix asserts, these may also be called for rel positioned elements
</span><span class="cx"> 
</span><span class="cx">         * rendering/RenderBox.cpp:
</span></span></pre></div>
<a id="trunkWebCorerenderingRenderBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/rendering/RenderBlock.cpp (20672 => 20673)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/rendering/RenderBlock.cpp        2007-04-03 00:22:30 UTC (rev 20672)
+++ trunk/WebCore/rendering/RenderBlock.cpp        2007-04-03 01:01:09 UTC (rev 20673)
</span><span class="lines">@@ -52,6 +52,19 @@
</span><span class="cx"> 
</span><span class="cx"> using namespace HTMLNames;
</span><span class="cx"> 
</span><ins>+struct ColumnInfo {
+    ColumnInfo()
+        : m_desiredColumnWidth(0)
+        , m_desiredColumnCount(1)
+        { }
+    int m_desiredColumnWidth;
+    unsigned m_desiredColumnCount;
+    Vector&lt;IntRect&gt; m_columnRects;
+};
+
+typedef WTF::HashMap&lt;const RenderBox*, ColumnInfo*&gt; ColumnInfoMap;
+static ColumnInfoMap* gColumnInfoMap = 0;
+
</ins><span class="cx"> // Our MarginInfo state used when laying out block children.
</span><span class="cx"> RenderBlock::MarginInfo::MarginInfo(RenderBlock* block, int top, int bottom)
</span><span class="cx"> {
</span><span class="lines">@@ -87,29 +100,28 @@
</span><span class="cx"> // -------------------------------------------------------------------------------------------------------
</span><span class="cx"> 
</span><span class="cx"> RenderBlock::RenderBlock(Node* node)
</span><del>-:RenderFlow(node)
</del><ins>+      : RenderFlow(node)
+      , m_floatingObjects(0)
+      , m_positionedObjects(0)
+      , m_maxMargin(0)
+      , m_overflowHeight(0)
+      , m_overflowWidth(0)
+      , m_overflowLeft(0)
+      , m_overflowTop(0)
</ins><span class="cx"> {
</span><del>-    m_childrenInline = true;
-    m_floatingObjects = 0;
-    m_positionedObjects = 0;
-    m_firstLine = false;
-    m_hasMarkupTruncation = false;
-    m_selectionState = SelectionNone;
-    m_clearStatus = CNONE;
-    m_maxTopPosMargin = m_maxTopNegMargin = m_maxBottomPosMargin = m_maxBottomNegMargin = 0;
-    m_topMarginQuirk = m_bottomMarginQuirk = false;
-    m_overflowHeight = m_overflowWidth = 0;
-    m_overflowLeft = m_overflowTop = 0;
-    m_desiredColumnCount = 1;
-    m_desiredColumnWidth = 0;
-    m_columnRects = 0;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RenderBlock::~RenderBlock()
</span><span class="cx"> {
</span><span class="cx">     delete m_floatingObjects;
</span><span class="cx">     delete m_positionedObjects;
</span><del>-    delete m_columnRects;
</del><ins>+    delete m_maxMargin;
+    
+    if (m_hasColumns) {
+        ColumnInfoMap::iterator it = gColumnInfoMap-&gt;find(this);
+        delete it-&gt;second;
+        gColumnInfoMap-&gt;remove(it);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderBlock::setStyle(RenderStyle* _style)
</span><span class="lines">@@ -494,7 +506,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     int oldWidth = m_width;
</span><del>-    int oldColumnWidth = m_desiredColumnWidth;
</del><ins>+    int oldColumnWidth = desiredColumnWidth();
</ins><span class="cx"> 
</span><span class="cx">     calcWidth();
</span><span class="cx">     calcColumnWidth();
</span><span class="lines">@@ -502,7 +514,7 @@
</span><span class="cx">     m_overflowWidth = m_width;
</span><span class="cx">     m_overflowLeft = 0;
</span><span class="cx"> 
</span><del>-    if (oldWidth != m_width || oldColumnWidth != m_desiredColumnWidth)
</del><ins>+    if (oldWidth != m_width || oldColumnWidth != desiredColumnWidth())
</ins><span class="cx">         relayoutChildren = true;
</span><span class="cx"> 
</span><span class="cx">     clearFloats();
</span><span class="lines">@@ -531,7 +543,7 @@
</span><span class="cx">         if (element() &amp;&amp; element()-&gt;hasTagName(formTag) &amp;&amp; element()-&gt;isMalformed())
</span><span class="cx">             // See if this form is malformed (i.e., unclosed). If so, don't give the form
</span><span class="cx">             // a bottom margin.
</span><del>-            m_maxBottomPosMargin = m_maxBottomNegMargin = 0;
</del><ins>+            setMaxBottomMargins(0, 0);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // For overflow:scroll blocks, ensure we have both scrollbars in place always.
</span><span class="lines">@@ -552,7 +564,7 @@
</span><span class="cx">     // Expand our intrinsic height to encompass floats.
</span><span class="cx">     int toAdd = borderBottom() + paddingBottom() + horizontalScrollbarHeight();
</span><span class="cx">     if (floatBottom() &gt; (m_height - toAdd) &amp;&amp; (isInlineBlockOrInlineTable() || isFloatingOrPositioned() || hasOverflowClip() ||
</span><del>-                                    (parent() &amp;&amp; parent()-&gt;isFlexibleBox() || hasColumns())))
</del><ins>+                                    (parent() &amp;&amp; parent()-&gt;isFlexibleBox() || m_hasColumns)))
</ins><span class="cx">         m_height = floatBottom() + toAdd;
</span><span class="cx">     
</span><span class="cx">     // Now lay out our columns within this intrinsic height, since they can slightly affect the intrinsic height as
</span><span class="lines">@@ -832,10 +844,8 @@
</span><span class="cx">         // This child is collapsing with the top of the
</span><span class="cx">         // block.  If it has larger margin values, then we need to update
</span><span class="cx">         // our own maximal values.
</span><del>-        if (!style()-&gt;htmlHacks() || !marginInfo.quirkContainer() || !topQuirk) {
-            m_maxTopPosMargin = max(posTop, m_maxTopPosMargin);
-            m_maxTopNegMargin = max(negTop, m_maxTopNegMargin);
-        }
</del><ins>+        if (!style()-&gt;htmlHacks() || !marginInfo.quirkContainer() || !topQuirk)
+            setMaxTopMargins(max(posTop, maxTopPosMargin()), max(negTop, maxTopNegMargin()));
</ins><span class="cx"> 
</span><span class="cx">         // The minute any of the margins involved isn't a quirk, don't
</span><span class="cx">         // collapse it away, even if the margin is smaller (www.webreference.com
</span><span class="lines">@@ -952,8 +962,7 @@
</span><span class="cx">             // FIXME: This isn't quite correct.  Need clarification for what to do
</span><span class="cx">             // if the height the cleared block is offset by is smaller than the
</span><span class="cx">             // margins involved.
</span><del>-            m_maxTopPosMargin = oldTopPosMargin;
-            m_maxTopNegMargin = oldTopNegMargin;
</del><ins>+            setMaxTopMargins(oldTopPosMargin, oldTopNegMargin);
</ins><span class="cx">             marginInfo.setAtTopOfBlock(false);
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1042,8 +1051,7 @@
</span><span class="cx">     if (marginInfo.canCollapseWithBottom() &amp;&amp; !marginInfo.canCollapseWithTop()) {
</span><span class="cx">         // Update our max pos/neg bottom margins, since we collapsed our bottom margins
</span><span class="cx">         // with our children.
</span><del>-        m_maxBottomPosMargin = max(m_maxBottomPosMargin, marginInfo.posMargin());
-        m_maxBottomNegMargin = max(m_maxBottomNegMargin, marginInfo.negMargin());
</del><ins>+        setMaxBottomMargins(max(maxBottomPosMargin(), marginInfo.posMargin()), max(maxBottomNegMargin(), marginInfo.negMargin()));
</ins><span class="cx"> 
</span><span class="cx">         if (!marginInfo.bottomQuirk())
</span><span class="cx">             m_bottomMarginQuirk = false;
</span><span class="lines">@@ -1113,8 +1121,8 @@
</span><span class="cx">             continue; // Skip the legend, since it has already been positioned up in the fieldset's border.
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        int oldTopPosMargin = m_maxTopPosMargin;
-        int oldTopNegMargin = m_maxTopNegMargin;
</del><ins>+        int oldTopPosMargin = maxTopPosMargin();
+        int oldTopNegMargin = maxTopNegMargin();
</ins><span class="cx"> 
</span><span class="cx">         // Make sure we layout children if they need it.
</span><span class="cx">         // FIXME: Technically percentage height objects only need a relayout if their percentage isn't going to be turned into
</span><span class="lines">@@ -1341,10 +1349,11 @@
</span><span class="cx">     EBorderStyle ruleStyle = style()-&gt;columnRuleStyle();
</span><span class="cx">     int ruleWidth = style()-&gt;columnRuleWidth();
</span><span class="cx">     bool renderRule = !paintingFloats &amp;&amp; ruleStyle &gt; BHIDDEN &amp;&amp; !ruleTransparent &amp;&amp; ruleWidth &lt;= colGap;
</span><del>-    unsigned colCount = m_columnRects-&gt;size();
</del><ins>+    Vector&lt;IntRect&gt;* colRects = columnRects();
+    unsigned colCount = colRects-&gt;size();
</ins><span class="cx">     for (unsigned i = 0; i &lt; colCount; i++) {
</span><span class="cx">         // For each rect, we clip to the rect, and then we adjust our coords.
</span><del>-        IntRect colRect = m_columnRects-&gt;at(i);
</del><ins>+        IntRect colRect = colRects-&gt;at(i);
</ins><span class="cx">         colRect.move(tx, ty);
</span><span class="cx">         context-&gt;save();
</span><span class="cx">         
</span><span class="lines">@@ -1479,7 +1488,7 @@
</span><span class="cx"> 
</span><span class="cx">     // 2. paint contents
</span><span class="cx">     if (paintPhase != PaintPhaseSelfOutline) {
</span><del>-        if (hasColumns())
</del><ins>+        if (m_hasColumns)
</ins><span class="cx">             paintColumns(paintInfo, scrolledX, scrolledY);
</span><span class="cx">         else
</span><span class="cx">             paintContents(paintInfo, scrolledX, scrolledY);
</span><span class="lines">@@ -1488,12 +1497,12 @@
</span><span class="cx">     // 3. paint selection
</span><span class="cx">     // FIXME: Make this work with multi column layouts.  For now don't fill gaps.
</span><span class="cx">     bool isPrinting = document()-&gt;printing();
</span><del>-    if (!inlineFlow &amp;&amp; !isPrinting &amp;&amp; !hasColumns())
</del><ins>+    if (!inlineFlow &amp;&amp; !isPrinting &amp;&amp; !m_hasColumns)
</ins><span class="cx">         paintSelection(paintInfo, scrolledX, scrolledY); // Fill in gaps in selection on lines and between blocks.
</span><span class="cx"> 
</span><span class="cx">     // 4. paint floats.
</span><span class="cx">     if (!inlineFlow &amp;&amp; (paintPhase == PaintPhaseFloat || paintPhase == PaintPhaseSelection)) {
</span><del>-        if (hasColumns())
</del><ins>+        if (m_hasColumns)
</ins><span class="cx">             paintColumns(paintInfo, scrolledX, scrolledY, true);
</span><span class="cx">         else
</span><span class="cx">             paintFloats(paintInfo, scrolledX, scrolledY, paintPhase == PaintPhaseSelection);
</span><span class="lines">@@ -1649,7 +1658,7 @@
</span><span class="cx">     if (!isBlockFlow()) // FIXME: Make multi-column selection gap filling work someday.
</span><span class="cx">         return result;
</span><span class="cx"> 
</span><del>-    if (hasColumns()) {
</del><ins>+    if (m_hasColumns) {
</ins><span class="cx">         // FIXME: We should learn how to gap fill multiple columns eventually.
</span><span class="cx">         lastTop = (ty - blockY) + height();
</span><span class="cx">         lastLeft = leftSelectionOffset(rootBlock, height());
</span><span class="lines">@@ -2264,9 +2273,10 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (hasColumns()) {
-        for (unsigned i = 0; i &lt; m_columnRects-&gt;size(); i++)
-            bottom = max(bottom, m_columnRects-&gt;at(i).bottom());
</del><ins>+    if (m_hasColumns) {
+        Vector&lt;IntRect&gt;* colRects = columnRects();
+        for (unsigned i = 0; i &lt; colRects-&gt;size(); i++)
+            bottom = max(bottom, colRects-&gt;at(i).bottom());
</ins><span class="cx">         return bottom;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -2312,10 +2322,10 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (hasColumns()) {
</del><ins>+    if (m_hasColumns) {
</ins><span class="cx">         // This only matters for LTR
</span><span class="cx">         if (style()-&gt;direction() == LTR)
</span><del>-            right = max(m_columnRects-&gt;last().right(), right);
</del><ins>+            right = max(columnRects()-&gt;last().right(), right);
</ins><span class="cx">         return right;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -2366,10 +2376,10 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (hasColumns()) {
</del><ins>+    if (m_hasColumns) {
</ins><span class="cx">         // This only matters for RTL
</span><span class="cx">         if (style()-&gt;direction() == RTL)
</span><del>-            left = min(m_columnRects-&gt;last().x(), left);
</del><ins>+            left = min(columnRects()-&gt;last().x(), left);
</ins><span class="cx">         return left;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -2702,11 +2712,11 @@
</span><span class="cx">             m_layer-&gt;subtractScrollOffset(scrolledX, scrolledY);
</span><span class="cx"> 
</span><span class="cx">         // Hit test contents if we don't have columns.
</span><del>-        if (!hasColumns() &amp;&amp; hitTestContents(request, result, _x, _y, scrolledX, scrolledY, hitTestAction))
</del><ins>+        if (!m_hasColumns &amp;&amp; hitTestContents(request, result, _x, _y, scrolledX, scrolledY, hitTestAction))
</ins><span class="cx">             return true;
</span><span class="cx">             
</span><span class="cx">         // Hit test our columns if we do have them.
</span><del>-        if (hasColumns() &amp;&amp; hitTestColumns(request, result, _x, _y, scrolledX, scrolledY, hitTestAction))
</del><ins>+        if (m_hasColumns &amp;&amp; hitTestColumns(request, result, _x, _y, scrolledX, scrolledY, hitTestAction))
</ins><span class="cx">             return true;
</span><span class="cx"> 
</span><span class="cx">         // Hit test floats.
</span><span class="lines">@@ -2752,8 +2762,9 @@
</span><span class="cx">     int currXOffset = 0;
</span><span class="cx">     int currYOffset = 0;
</span><span class="cx">     int colGap = columnGap();
</span><del>-    for (unsigned i = 0; i &lt; m_columnRects-&gt;size(); i++) {
-        IntRect colRect = m_columnRects-&gt;at(i);
</del><ins>+    Vector&lt;IntRect&gt;* colRects = columnRects();
+    for (unsigned i = 0; i &lt; colRects-&gt;size(); i++) {
+        IntRect colRect = colRects-&gt;at(i);
</ins><span class="cx">         colRect.move(tx, ty);
</span><span class="cx">         
</span><span class="cx">         if (colRect.contains(x, y)) {
</span><span class="lines">@@ -2848,7 +2859,7 @@
</span><span class="cx">     int contentsY = y - borderTopExtra();
</span><span class="cx">     if (hasOverflowClip())
</span><span class="cx">         m_layer-&gt;scrollOffset(contentsX, contentsY);
</span><del>-    if (hasColumns()) {
</del><ins>+    if (m_hasColumns) {
</ins><span class="cx">         IntPoint contentsPoint(contentsX, contentsY);
</span><span class="cx">         adjustPointToColumnContents(contentsPoint);
</span><span class="cx">         contentsX = contentsPoint.x();
</span><span class="lines">@@ -2956,8 +2967,8 @@
</span><span class="cx"> int RenderBlock::availableWidth() const
</span><span class="cx"> {
</span><span class="cx">     // If we have multiple columns, then the available width is reduced to our column width.
</span><del>-    if (hasColumns())
-        return m_desiredColumnWidth;
</del><ins>+    if (m_hasColumns)
+        return desiredColumnWidth();
</ins><span class="cx">     return contentWidth();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -2971,30 +2982,32 @@
</span><span class="cx"> void RenderBlock::calcColumnWidth()
</span><span class="cx"> {    
</span><span class="cx">     // Calculate our column width and column count.
</span><del>-    m_desiredColumnCount = 1;
-    m_desiredColumnWidth = contentWidth();
</del><ins>+    unsigned desiredColumnCount = 1;
+    int desiredColumnWidth = contentWidth();
</ins><span class="cx">     
</span><span class="cx">     // For now, we don't support multi-column layouts when printing, since we have to do a lot of work for proper pagination.
</span><del>-    if (document()-&gt;printing() || (style()-&gt;hasAutoColumnCount() &amp;&amp; style()-&gt;hasAutoColumnWidth()))
</del><ins>+    if (document()-&gt;printing() || (style()-&gt;hasAutoColumnCount() &amp;&amp; style()-&gt;hasAutoColumnWidth())) {
+        setDesiredColumnCountAndWidth(desiredColumnCount, desiredColumnWidth);
</ins><span class="cx">         return;
</span><ins>+    }
</ins><span class="cx">         
</span><del>-    int availWidth = m_desiredColumnWidth;
</del><ins>+    int availWidth = desiredColumnWidth;
</ins><span class="cx">     int colGap = columnGap();
</span><span class="cx"> 
</span><span class="cx">     if (style()-&gt;hasAutoColumnWidth()) {
</span><span class="cx">         int colCount = style()-&gt;columnCount();
</span><span class="cx">         if ((colCount - 1) * colGap &lt; availWidth) {
</span><del>-            m_desiredColumnCount = colCount;
-            m_desiredColumnWidth = (availWidth - (m_desiredColumnCount - 1) * colGap) / m_desiredColumnCount;
</del><ins>+            desiredColumnCount = colCount;
+            desiredColumnWidth = (availWidth - (desiredColumnCount - 1) * colGap) / desiredColumnCount;
</ins><span class="cx">         } else if (colGap &lt; availWidth) {
</span><del>-            m_desiredColumnCount = availWidth / colGap;
-            m_desiredColumnWidth = (availWidth - (m_desiredColumnCount - 1) * colGap) / m_desiredColumnCount;
</del><ins>+            desiredColumnCount = availWidth / colGap;
+            desiredColumnWidth = (availWidth - (desiredColumnCount - 1) * colGap) / desiredColumnCount;
</ins><span class="cx">         }
</span><span class="cx">     } else if (style()-&gt;hasAutoColumnCount()) {
</span><span class="cx">         int colWidth = static_cast&lt;int&gt;(style()-&gt;columnWidth());
</span><span class="cx">         if (colWidth &lt; availWidth) {
</span><del>-            m_desiredColumnCount = (availWidth + colGap) / (colWidth + colGap);
-            m_desiredColumnWidth = (availWidth - (m_desiredColumnCount - 1) * colGap) / m_desiredColumnCount;
</del><ins>+            desiredColumnCount = (availWidth + colGap) / (colWidth + colGap);
+            desiredColumnWidth = (availWidth - (desiredColumnCount - 1) * colGap) / desiredColumnCount;
</ins><span class="cx">         }
</span><span class="cx">     } else {
</span><span class="cx">         // Both are set.
</span><span class="lines">@@ -3002,30 +3015,82 @@
</span><span class="cx">         int colCount = style()-&gt;columnCount();
</span><span class="cx">     
</span><span class="cx">         if (colCount * colWidth + (colCount - 1) * colGap &lt;= availWidth) {
</span><del>-            m_desiredColumnCount = colCount;
-            m_desiredColumnWidth = colWidth;
</del><ins>+            desiredColumnCount = colCount;
+            desiredColumnWidth = colWidth;
</ins><span class="cx">         } else if (colWidth &lt; availWidth) {
</span><del>-            m_desiredColumnCount = (availWidth + colGap) / (colWidth + colGap);
-            m_desiredColumnWidth = (availWidth - (m_desiredColumnCount - 1) * colGap) / m_desiredColumnCount;
</del><ins>+            desiredColumnCount = (availWidth + colGap) / (colWidth + colGap);
+            desiredColumnWidth = (availWidth - (desiredColumnCount - 1) * colGap) / desiredColumnCount;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><ins>+    setDesiredColumnCountAndWidth(desiredColumnCount, desiredColumnWidth);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderBlock::setDesiredColumnCountAndWidth(int count, int width)
+{
+    if (count == 1) {
+        if (m_hasColumns) {
+            ColumnInfoMap::iterator it = gColumnInfoMap-&gt;find(this);
+            delete it-&gt;second;
+            gColumnInfoMap-&gt;remove(it);
+            m_hasColumns = false;
+        }
+    } else {
+        ColumnInfo* info;
+        if (m_hasColumns)
+            info = gColumnInfoMap-&gt;get(this);
+        else {
+            if (!gColumnInfoMap)
+                gColumnInfoMap = new ColumnInfoMap;
+            info = new ColumnInfo;
+            gColumnInfoMap-&gt;add(this, info);
+            m_hasColumns = true;
+        }
+        info-&gt;m_desiredColumnCount = count;
+        info-&gt;m_desiredColumnWidth = width;   
+    }
+}
+
+int RenderBlock::desiredColumnWidth() const
+{
+    if (!m_hasColumns)
+        return contentWidth();
+    return gColumnInfoMap-&gt;get(this)-&gt;m_desiredColumnWidth;
+}
+
+unsigned RenderBlock::desiredColumnCount() const
+{
+    if (!m_hasColumns)
+        return 1;
+    return gColumnInfoMap-&gt;get(this)-&gt;m_desiredColumnCount;
+}
+
+Vector&lt;IntRect&gt;* RenderBlock::columnRects() const
+{
+    if (!m_hasColumns)
+        return 0;
+    return &amp;gColumnInfoMap-&gt;get(this)-&gt;m_columnRects;    
+}
+
</ins><span class="cx"> int RenderBlock::layoutColumns(int endOfContent)
</span><span class="cx"> {
</span><span class="cx">     // Don't do anything if we have no columns
</span><del>-    if (!hasColumns())
</del><ins>+    if (!m_hasColumns)
</ins><span class="cx">         return -1;
</span><span class="cx"> 
</span><ins>+    ColumnInfo* info = gColumnInfoMap-&gt;get(this);
+    int desiredColumnWidth = info-&gt;m_desiredColumnWidth;
+    int desiredColumnCount = info-&gt;m_desiredColumnCount;
+    Vector&lt;IntRect&gt;* columnRects = &amp;info-&gt;m_columnRects;
+    
</ins><span class="cx">     bool computeIntrinsicHeight = (endOfContent == -1);
</span><span class="cx"> 
</span><span class="cx">     // Fill the columns in to the available height.  Attempt to balance the height of the columns
</span><span class="cx">     int availableHeight = contentHeight();
</span><del>-    int colHeight = computeIntrinsicHeight ? availableHeight / m_desiredColumnCount : availableHeight;
</del><ins>+    int colHeight = computeIntrinsicHeight ? availableHeight / desiredColumnCount : availableHeight;
</ins><span class="cx">     
</span><span class="cx">     // Add in half our line-height to help with best-guess initial balancing.
</span><span class="cx">     int columnSlop = lineHeight(false) / 2;
</span><del>-    int remainingSlopSpace = columnSlop * m_desiredColumnCount;
</del><ins>+    int remainingSlopSpace = columnSlop * desiredColumnCount;
</ins><span class="cx"> 
</span><span class="cx">     if (computeIntrinsicHeight)
</span><span class="cx">         colHeight += columnSlop;
</span><span class="lines">@@ -3033,8 +3098,7 @@
</span><span class="cx">     int colGap = columnGap();
</span><span class="cx"> 
</span><span class="cx">     // Compute a collection of column rects.
</span><del>-    delete m_columnRects;
-    m_columnRects = new Vector&lt;IntRect&gt;();
</del><ins>+    columnRects-&gt;clear();
</ins><span class="cx">     
</span><span class="cx">     // Then we do a simulated &quot;paint&quot; into the column slices and allow the content to slightly adjust our individual column rects.
</span><span class="cx">     // FIXME: We need to take into account layers that are affected by the columns as well here so that they can have an opportunity
</span><span class="lines">@@ -3042,9 +3106,9 @@
</span><span class="cx">     RenderView* v = view();
</span><span class="cx">     int left = borderLeft() + paddingLeft();
</span><span class="cx">     int top = borderTop() + paddingTop();
</span><del>-    int currX = style()-&gt;direction() == LTR ? borderLeft() + paddingLeft() : borderLeft() + paddingLeft() + contentWidth() - m_desiredColumnWidth;
</del><ins>+    int currX = style()-&gt;direction() == LTR ? borderLeft() + paddingLeft() : borderLeft() + paddingLeft() + contentWidth() - desiredColumnWidth;
</ins><span class="cx">     int currY = top;
</span><del>-    unsigned colCount = m_desiredColumnCount;
</del><ins>+    unsigned colCount = desiredColumnCount;
</ins><span class="cx">     int maxColBottom = borderTop() + paddingTop();
</span><span class="cx">     int contentBottom = top + availableHeight; 
</span><span class="cx">     for (unsigned i = 0; i &lt; colCount; i++) {
</span><span class="lines">@@ -3053,19 +3117,18 @@
</span><span class="cx">             colHeight = availableHeight;
</span><span class="cx"> 
</span><span class="cx">         // This represents the real column position.
</span><del>-        IntRect colRect(currX, top, m_desiredColumnWidth, colHeight);
</del><ins>+        IntRect colRect(currX, top, desiredColumnWidth, colHeight);
</ins><span class="cx">         
</span><span class="cx">         // For the simulated paint, we pretend like everything is in one long strip.
</span><del>-        IntRect pageRect(left, currY, m_desiredColumnWidth, colHeight);
</del><ins>+        IntRect pageRect(left, currY, desiredColumnWidth, colHeight);
</ins><span class="cx">         v-&gt;setPrintRect(pageRect);
</span><span class="cx">         v-&gt;setTruncatedAt(currY + colHeight);
</span><span class="cx">         GraphicsContext context((PlatformGraphicsContext*)0);
</span><span class="cx">         RenderObject::PaintInfo paintInfo(&amp;context, pageRect, PaintPhaseForeground, false, 0, 0);
</span><span class="cx">         
</span><del>-        int oldColCount = m_desiredColumnCount;
-        m_desiredColumnCount = 1;
</del><ins>+        m_hasColumns = false;
</ins><span class="cx">         paintObject(paintInfo, 0, 0);
</span><del>-        m_desiredColumnCount = oldColCount;
</del><ins>+        m_hasColumns = true;
</ins><span class="cx"> 
</span><span class="cx">         int adjustedBottom = v-&gt;bestTruncatedAt();
</span><span class="cx">         if (adjustedBottom &lt;= currY)
</span><span class="lines">@@ -3087,16 +3150,16 @@
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         if (style()-&gt;direction() == LTR)
</span><del>-            currX += m_desiredColumnWidth + colGap;
</del><ins>+            currX += desiredColumnWidth + colGap;
</ins><span class="cx">         else
</span><del>-            currX -= (m_desiredColumnWidth + colGap);
</del><ins>+            currX -= (desiredColumnWidth + colGap);
</ins><span class="cx"> 
</span><span class="cx">         currY += colRect.height();
</span><span class="cx">         availableHeight -= colRect.height();
</span><span class="cx"> 
</span><span class="cx">         maxColBottom = max(colRect.bottom(), maxColBottom);
</span><span class="cx"> 
</span><del>-        m_columnRects-&gt;append(colRect);
</del><ins>+        columnRects-&gt;append(colRect);
</ins><span class="cx">         
</span><span class="cx">         // Start adding in more columns as long as there's still content left.
</span><span class="cx">         if (currY &lt; endOfContent &amp;&amp; i == colCount - 1)
</span><span class="lines">@@ -3104,7 +3167,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     m_overflowWidth = max(m_width, currX - colGap);
</span><del>-    m_overflowLeft = min(0, currX + m_desiredColumnWidth + colGap);
</del><ins>+    m_overflowLeft = min(0, currX + desiredColumnWidth + colGap);
</ins><span class="cx"> 
</span><span class="cx">     m_overflowHeight = maxColBottom;
</span><span class="cx">     int toAdd = borderBottom() + paddingBottom() + horizontalScrollbarHeight();
</span><span class="lines">@@ -3115,7 +3178,7 @@
</span><span class="cx">     v-&gt;setPrintRect(IntRect());
</span><span class="cx">     v-&gt;setTruncatedAt(0);
</span><span class="cx">     
</span><del>-    ASSERT(m_columnRects &amp;&amp; colCount == m_columnRects-&gt;size());
</del><ins>+    ASSERT(colCount == columnRects-&gt;size());
</ins><span class="cx">     
</span><span class="cx">     return contentBottom;
</span><span class="cx"> }
</span><span class="lines">@@ -3123,17 +3186,19 @@
</span><span class="cx"> void RenderBlock::adjustPointToColumnContents(IntPoint&amp; point) const
</span><span class="cx"> {
</span><span class="cx">     // Just bail if we have no columns.
</span><del>-    if (!hasColumns() || !m_columnRects)
</del><ins>+    if (!m_hasColumns)
</ins><span class="cx">         return;
</span><ins>+    
+    Vector&lt;IntRect&gt;* colRects = columnRects();
</ins><span class="cx"> 
</span><span class="cx">     // Determine which columns we intersect.
</span><span class="cx">     int colGap = columnGap();
</span><span class="cx">     int leftGap = colGap / 2;
</span><del>-    IntPoint columnPoint(m_columnRects-&gt;at(0).location());
</del><ins>+    IntPoint columnPoint(colRects-&gt;at(0).location());
</ins><span class="cx">     int yOffset = 0;
</span><del>-    for (unsigned i = 0; i &lt; m_columnRects-&gt;size(); i++) {
</del><ins>+    for (unsigned i = 0; i &lt; colRects-&gt;size(); i++) {
</ins><span class="cx">         // Add in half the column gap to the left and right of the rect.
</span><del>-        IntRect colRect = m_columnRects-&gt;at(i);
</del><ins>+        IntRect colRect = colRects-&gt;at(i);
</ins><span class="cx">         IntRect gapAndColumnRect(colRect.x() - leftGap, colRect.y(), colRect.width() + colGap, colRect.height());
</span><span class="cx">         
</span><span class="cx">         if (gapAndColumnRect.contains(point)) {
</span><span class="lines">@@ -3150,8 +3215,10 @@
</span><span class="cx"> void RenderBlock::adjustRectForColumns(IntRect&amp; r) const
</span><span class="cx"> {
</span><span class="cx">     // Just bail if we have no columns.
</span><del>-    if (!hasColumns() || !m_columnRects)
</del><ins>+    if (!m_hasColumns)
</ins><span class="cx">         return;
</span><ins>+    
+    Vector&lt;IntRect&gt;* colRects = columnRects();
</ins><span class="cx"> 
</span><span class="cx">     // Begin with a result rect that is empty.
</span><span class="cx">     IntRect result;
</span><span class="lines">@@ -3160,8 +3227,8 @@
</span><span class="cx">     int currXOffset = 0;
</span><span class="cx">     int currYOffset = 0;
</span><span class="cx">     int colGap = columnGap();
</span><del>-    for (unsigned i = 0; i &lt; m_columnRects-&gt;size(); i++) {
-        IntRect colRect = m_columnRects-&gt;at(i);
</del><ins>+    for (unsigned i = 0; i &lt; colRects-&gt;size(); i++) {
+        IntRect colRect = colRects-&gt;at(i);
</ins><span class="cx">         
</span><span class="cx">         IntRect repaintRect = r;
</span><span class="cx">         repaintRect.move(currXOffset, currYOffset);
</span><span class="lines">@@ -4154,6 +4221,28 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderBlock::setMaxTopMargins(int pos, int neg)
+{
+    if (!m_maxMargin) {
+        if (pos == MaxMargin::topPosDefault(this) &amp;&amp; neg == MaxMargin::topNegDefault(this))
+            return;
+        m_maxMargin = new MaxMargin(this);
+    }
+    m_maxMargin-&gt;m_topPos = pos;
+    m_maxMargin-&gt;m_topNeg = neg;
+}
+
+void RenderBlock::setMaxBottomMargins(int pos, int neg)
+{
+    if (!m_maxMargin) {
+        if (pos == MaxMargin::bottomPosDefault(this) &amp;&amp; neg == MaxMargin::bottomNegDefault(this))
+            return;
+        m_maxMargin = new MaxMargin(this);
+    }
+    m_maxMargin-&gt;m_bottomPos = pos;
+    m_maxMargin-&gt;m_bottomNeg = neg;
+}
+
</ins><span class="cx"> const char* RenderBlock::renderName() const
</span><span class="cx"> {
</span><span class="cx">     if (isBody())
</span></span></pre></div>
<a id="trunkWebCorerenderingRenderBlockh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/rendering/RenderBlock.h (20672 => 20673)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/rendering/RenderBlock.h        2007-04-03 00:22:30 UTC (rev 20672)
+++ trunk/WebCore/rendering/RenderBlock.h        2007-04-03 01:01:09 UTC (rev 20673)
</span><span class="lines">@@ -76,27 +76,24 @@
</span><span class="cx">     virtual bool isTopMarginQuirk() const { return m_topMarginQuirk; }
</span><span class="cx">     virtual bool isBottomMarginQuirk() const { return m_bottomMarginQuirk; }
</span><span class="cx"> 
</span><del>-    virtual int maxTopMargin(bool positive) const { return positive ? m_maxTopPosMargin : m_maxTopNegMargin; }
-    virtual int maxBottomMargin(bool positive) const { return positive ? m_maxBottomPosMargin : m_maxBottomNegMargin; }
</del><ins>+    virtual int maxTopMargin(bool positive) const { return positive ? maxTopPosMargin() : maxTopNegMargin(); }
+    virtual int maxBottomMargin(bool positive) const { return positive ? maxBottomPosMargin() : maxBottomNegMargin(); }
</ins><span class="cx"> 
</span><ins>+    int maxTopPosMargin() const { return m_maxMargin ? m_maxMargin-&gt;m_topPos : MaxMargin::topPosDefault(this); }
+    int maxTopNegMargin() const { return m_maxMargin ? m_maxMargin-&gt;m_topNeg : MaxMargin::topNegDefault(this); }
+    int maxBottomPosMargin() const { return m_maxMargin ? m_maxMargin-&gt;m_bottomPos : MaxMargin::bottomPosDefault(this); }
+    int maxBottomNegMargin() const { return m_maxMargin ? m_maxMargin-&gt;m_bottomNeg : MaxMargin::bottomNegDefault(this); }
+    void setMaxTopMargins(int pos, int neg);
+    void setMaxBottomMargins(int pos, int neg);
+    
</ins><span class="cx">     void initMaxMarginValues()
</span><span class="cx">     {
</span><del>-        int margTop = marginTop();
-        if (margTop &gt;= 0) {
-            m_maxTopPosMargin = margTop;
-            m_maxTopNegMargin = 0;
-        } else {
-            m_maxTopNegMargin = -margTop;
-            m_maxTopPosMargin = 0;
</del><ins>+        if (m_maxMargin) {
+            m_maxMargin-&gt;m_topPos = MaxMargin::topPosDefault(this);
+            m_maxMargin-&gt;m_topNeg = MaxMargin::topNegDefault(this);
+            m_maxMargin-&gt;m_bottomPos = MaxMargin::bottomPosDefault(this);
+            m_maxMargin-&gt;m_bottomNeg = MaxMargin::bottomNegDefault(this);
</ins><span class="cx">         }
</span><del>-        int margBottom = marginBottom();
-        if (margBottom &gt;= 0) {
-            m_maxBottomPosMargin = margBottom;
-            m_maxBottomNegMargin = 0;
-        } else {
-            m_maxBottomNegMargin = -margBottom;
-            m_maxBottomPosMargin = 0;
-        }
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     virtual void addChildToFlow(RenderObject* newChild, RenderObject* beforeChild);
</span><span class="lines">@@ -285,7 +282,11 @@
</span><span class="cx">     int heightForLineCount(int);
</span><span class="cx">     void clearTruncation();
</span><span class="cx"> 
</span><del>-    virtual bool hasColumns() const { return m_desiredColumnCount &gt; 1; }
</del><ins>+    int desiredColumnWidth() const;
+    unsigned desiredColumnCount() const;
+    Vector&lt;IntRect&gt;* columnRects() const;
+    void setDesiredColumnCountAndWidth(int count, int width);
+    
</ins><span class="cx">     void adjustRectForColumns(IntRect&amp;) const;
</span><span class="cx"> private:
</span><span class="cx">     void adjustPointToColumnContents(IntPoint&amp;) const;
</span><span class="lines">@@ -436,33 +437,35 @@
</span><span class="cx"> private:
</span><span class="cx">     DeprecatedPtrList&lt;FloatingObject&gt;* m_floatingObjects;
</span><span class="cx">     DeprecatedPtrList&lt;RenderObject&gt;* m_positionedObjects;
</span><ins>+         
+     // Allocated only when some of these fields have non-default values
+     struct MaxMargin {
+         MaxMargin(const RenderBlock* o) 
+             : m_topPos(topPosDefault(o))
+             , m_topNeg(topNegDefault(o))
+             , m_bottomPos(bottomPosDefault(o))
+             , m_bottomNeg(bottomNegDefault(o))
+             { 
+             }
+         static int topPosDefault(const RenderBlock* o) { return o-&gt;marginTop() &gt; 0 ? o-&gt;marginTop() : 0; }
+         static int topNegDefault(const RenderBlock* o) { return o-&gt;marginTop() &lt; 0 ? -o-&gt;marginTop() : 0; }
+         static int bottomPosDefault(const RenderBlock* o) { return o-&gt;marginBottom() &gt; 0 ? o-&gt;marginBottom() : 0; }
+         static int bottomNegDefault(const RenderBlock* o) { return o-&gt;marginBottom() &lt; 0 ? -o-&gt;marginBottom() : 0; }
+         
+         int m_topPos;
+         int m_topNeg;
+         int m_bottomPos;
+         int m_bottomNeg;
+     };
</ins><span class="cx"> 
</span><del>-    bool m_childrenInline : 1;
-    bool m_firstLine : 1;
-    unsigned m_clearStatus  : 2; // EClear
-    bool m_topMarginQuirk : 1;
-    bool m_bottomMarginQuirk : 1;
-    bool m_hasMarkupTruncation : 1;
-    unsigned m_selectionState : 3; // SelectionState
</del><ins>+    MaxMargin* m_maxMargin;
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    int m_maxTopPosMargin;
-    int m_maxTopNegMargin;
-    int m_maxBottomPosMargin;
-    int m_maxBottomNegMargin;
-
</del><span class="cx">     // How much content overflows out of our block vertically or horizontally.
</span><span class="cx">     int m_overflowHeight;
</span><span class="cx">     int m_overflowWidth;
</span><span class="cx">     int m_overflowLeft;
</span><span class="cx">     int m_overflowTop;
</span><del>-
-private:
-
-    // Column information.
-    int m_desiredColumnWidth;
-    unsigned m_desiredColumnCount;
-    Vector&lt;IntRect&gt;* m_columnRects;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorerenderingRenderFlexibleBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/rendering/RenderFlexibleBox.cpp (20672 => 20673)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/rendering/RenderFlexibleBox.cpp        2007-04-03 00:22:30 UTC (rev 20672)
+++ trunk/WebCore/rendering/RenderFlexibleBox.cpp        2007-04-03 01:01:09 UTC (rev 20673)
</span><span class="lines">@@ -314,11 +314,14 @@
</span><span class="cx">         // bottom margin max values to 0.  This way we don't factor in the values
</span><span class="cx">         // twice when we collapse with our previous vertically adjacent and
</span><span class="cx">         // following vertically adjacent blocks.
</span><del>-        if (m_maxBottomPosMargin &gt; m_maxTopPosMargin)
-            m_maxTopPosMargin = m_maxBottomPosMargin;
-        if (m_maxBottomNegMargin &gt; m_maxTopNegMargin)
-            m_maxTopNegMargin = m_maxBottomNegMargin;
-        m_maxBottomNegMargin = m_maxBottomPosMargin = 0;
</del><ins>+        int pos = maxTopPosMargin();
+        int neg = maxTopNegMargin();
+        if (maxBottomPosMargin() &gt; pos)
+            pos = maxBottomPosMargin();
+        if (maxBottomNegMargin() &gt; neg)
+            neg = maxBottomNegMargin();
+        setMaxTopMargins(pos, neg);
+        setMaxBottomMargins(0, 0);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Always ensure our overflow width is at least as large as our width.
</span></span></pre></div>
<a id="trunkWebCorerenderingRenderFlowh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/rendering/RenderFlow.h (20672 => 20673)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/rendering/RenderFlow.h        2007-04-03 00:22:30 UTC (rev 20672)
+++ trunk/WebCore/rendering/RenderFlow.h        2007-04-03 01:01:09 UTC (rev 20673)
</span><span class="lines">@@ -46,6 +46,15 @@
</span><span class="cx">         , m_firstLineBox(0)
</span><span class="cx">         , m_lastLineBox(0)
</span><span class="cx">         , m_lineHeight(-1)
</span><ins>+        , m_childrenInline(true)
+        , m_firstLine(false)
+        , m_clearStatus(CNONE)
+        , m_topMarginQuirk(false) 
+        , m_bottomMarginQuirk(false)
+        , m_hasMarkupTruncation(false)
+        , m_selectionState(SelectionNone)
+        , m_hasColumns(false)
+        , m_isContinuation(false)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -90,7 +99,7 @@
</span><span class="cx">     void paintOutlineForLine(GraphicsContext*, int tx, int ty, const IntRect&amp; prevLine, const IntRect&amp; thisLine, const IntRect&amp; nextLine);
</span><span class="cx">     void paintOutline(GraphicsContext*, int tx, int ty);
</span><span class="cx"> 
</span><del>-    virtual bool hasColumns() const { return false; }
</del><ins>+    virtual bool hasColumns() const { return m_hasColumns; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     // An inline can be split with blocks occurring in between the inline content.
</span><span class="lines">@@ -107,6 +116,20 @@
</span><span class="cx">     InlineFlowBox* m_lastLineBox;
</span><span class="cx"> 
</span><span class="cx">     mutable short m_lineHeight;
</span><ins>+    
+    // These bitfields are moved here from subclasses to pack them together
+    // from RenderBlock
+    bool m_childrenInline : 1;
+    bool m_firstLine : 1;
+    unsigned m_clearStatus  : 2; // EClear
+    bool m_topMarginQuirk : 1;
+    bool m_bottomMarginQuirk : 1;
+    bool m_hasMarkupTruncation : 1;
+    unsigned m_selectionState : 3; // SelectionState
+    bool m_hasColumns : 1;
+    
+    // from RenderInline
+    bool m_isContinuation : 1; // Whether or not we're a continuation of an inline.
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorerenderingRenderInlinecpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/rendering/RenderInline.cpp (20672 => 20673)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/rendering/RenderInline.cpp        2007-04-03 00:22:30 UTC (rev 20672)
+++ trunk/WebCore/rendering/RenderInline.cpp        2007-04-03 01:01:09 UTC (rev 20673)
</span><span class="lines">@@ -34,7 +34,6 @@
</span><span class="cx"> 
</span><span class="cx"> RenderInline::RenderInline(Node* node)
</span><span class="cx">     : RenderFlow(node)
</span><del>-    , m_isContinuation(false)
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebCorerenderingRenderInlineh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/rendering/RenderInline.h (20672 => 20673)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/rendering/RenderInline.h        2007-04-03 00:22:30 UTC (rev 20672)
+++ trunk/WebCore/rendering/RenderInline.h        2007-04-03 01:01:09 UTC (rev 20673)
</span><span class="lines">@@ -78,8 +78,6 @@
</span><span class="cx"> protected:
</span><span class="cx">     static RenderInline* cloneInline(RenderFlow* src);
</span><span class="cx"> 
</span><del>-private:
-    bool m_isContinuation : 1; // Whether or not we're a continuation of an inline.
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>