<!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" />
<title>[172529] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { 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 #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#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>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/172529">172529</a></dd>
<dt>Author</dt> <dd>bjonesbe@adobe.com</dd>
<dt>Date</dt> <dd>2014-08-13 12:05:21 -0700 (Wed, 13 Aug 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Refactor ShapeOutsideInfo so it isn't mutated for each line
https://bugs.webkit.org/show_bug.cgi?id=135781

Reviewed by Zoltan Horvath.

Encapsulate the per line state into a ShapeOutsideDeltas object.
updateDeltasForContainingBlockLine has been renamed to
computeDeltasForContainingBlockLine, and it returns an instance of the
ShapeOutsideDeltas object for that line. This object is cached, but
none of the functionality of ShapeOutsideInfo is dependant on any line
specific data anymore.

No new tests, no behavior change.

* rendering/FloatingObjects.cpp:
(WebCore::ComputeFloatOffsetForFloatLayoutAdapter&lt;FloatingObject::FloatLeft&gt;::updateOffsetIfNeeded):
    Update to take a FloatingObject reference because the FloatingObject cannot be null.
(WebCore::ComputeFloatOffsetForFloatLayoutAdapter&lt;FloatingObject::FloatRight&gt;::updateOffsetIfNeeded):
    Ditto.
(WebCore::ComputeFloatOffsetAdapter&lt;FloatTypeValue&gt;::collectIfNeeded): Pass FloatingObject to
    updateOffsetIfNeeded as a reference, since it cannot be null.
(WebCore::ComputeFloatOffsetForLineLayoutAdapter&lt;FloatingObject::FloatLeft&gt;::updateOffsetIfNeeded):
    Use ShapeOutsideDeltas object to calculate the offset and take the FloatingObject as a
    reference.
(WebCore::ComputeFloatOffsetForLineLayoutAdapter&lt;FloatingObject::FloatRight&gt;::updateOffsetIfNeeded):
    Ditto.
(WebCore::shapeInfoForFloat): Deleted.
* rendering/line/LineWidth.cpp:
(WebCore::LineWidth::shrinkAvailableWidthForNewFloatIfNeeded): Update to use ShapeOutsideDeltas object.
* rendering/shapes/ShapeOutsideInfo.cpp:
(WebCore::ShapeOutsideInfo::computeDeltasForContainingBlockLine): Return a ShaoeOutsideDeltas object
    instead of storing line specific data in instance variables.
(WebCore::ShapeOutsideInfo::updateDeltasForContainingBlockLine): Deleted.
* rendering/shapes/ShapeOutsideInfo.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingFloatingObjectscpp">trunk/Source/WebCore/rendering/FloatingObjects.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderinglineLineWidthcpp">trunk/Source/WebCore/rendering/line/LineWidth.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingshapesShapeOutsideInfocpp">trunk/Source/WebCore/rendering/shapes/ShapeOutsideInfo.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingshapesShapeOutsideInfoh">trunk/Source/WebCore/rendering/shapes/ShapeOutsideInfo.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (172528 => 172529)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-08-13 19:03:56 UTC (rev 172528)
+++ trunk/Source/WebCore/ChangeLog        2014-08-13 19:05:21 UTC (rev 172529)
</span><span class="lines">@@ -1,3 +1,40 @@
</span><ins>+2014-08-13  Bem Jones-Bey  &lt;bjonesbe@adobe.com&gt;
+
+        Refactor ShapeOutsideInfo so it isn't mutated for each line
+        https://bugs.webkit.org/show_bug.cgi?id=135781
+
+        Reviewed by Zoltan Horvath.
+
+        Encapsulate the per line state into a ShapeOutsideDeltas object.
+        updateDeltasForContainingBlockLine has been renamed to
+        computeDeltasForContainingBlockLine, and it returns an instance of the
+        ShapeOutsideDeltas object for that line. This object is cached, but
+        none of the functionality of ShapeOutsideInfo is dependant on any line
+        specific data anymore.
+
+        No new tests, no behavior change.
+
+        * rendering/FloatingObjects.cpp:
+        (WebCore::ComputeFloatOffsetForFloatLayoutAdapter&lt;FloatingObject::FloatLeft&gt;::updateOffsetIfNeeded):
+            Update to take a FloatingObject reference because the FloatingObject cannot be null.
+        (WebCore::ComputeFloatOffsetForFloatLayoutAdapter&lt;FloatingObject::FloatRight&gt;::updateOffsetIfNeeded):
+            Ditto.
+        (WebCore::ComputeFloatOffsetAdapter&lt;FloatTypeValue&gt;::collectIfNeeded): Pass FloatingObject to
+            updateOffsetIfNeeded as a reference, since it cannot be null.
+        (WebCore::ComputeFloatOffsetForLineLayoutAdapter&lt;FloatingObject::FloatLeft&gt;::updateOffsetIfNeeded):
+            Use ShapeOutsideDeltas object to calculate the offset and take the FloatingObject as a
+            reference.
+        (WebCore::ComputeFloatOffsetForLineLayoutAdapter&lt;FloatingObject::FloatRight&gt;::updateOffsetIfNeeded):
+            Ditto.
+        (WebCore::shapeInfoForFloat): Deleted.
+        * rendering/line/LineWidth.cpp:
+        (WebCore::LineWidth::shrinkAvailableWidthForNewFloatIfNeeded): Update to use ShapeOutsideDeltas object.
+        * rendering/shapes/ShapeOutsideInfo.cpp:
+        (WebCore::ShapeOutsideInfo::computeDeltasForContainingBlockLine): Return a ShaoeOutsideDeltas object
+            instead of storing line specific data in instance variables.
+        (WebCore::ShapeOutsideInfo::updateDeltasForContainingBlockLine): Deleted.
+        * rendering/shapes/ShapeOutsideInfo.h:
+
</ins><span class="cx"> 2014-08-13  Zoltan Horvath  &lt;zoltan@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS3-Text] Add rendering support for the none value of text-justify property
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingFloatingObjectscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/FloatingObjects.cpp (172528 => 172529)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/FloatingObjects.cpp        2014-08-13 19:03:56 UTC (rev 172528)
+++ trunk/Source/WebCore/rendering/FloatingObjects.cpp        2014-08-13 19:05:21 UTC (rev 172529)
</span><span class="lines">@@ -141,7 +141,7 @@
</span><span class="cx">     LayoutUnit offset() const { return m_offset; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    virtual bool updateOffsetIfNeeded(const FloatingObject*) = 0;
</del><ins>+    virtual bool updateOffsetIfNeeded(const FloatingObject&amp;) = 0;
</ins><span class="cx"> 
</span><span class="cx">     const RenderBlockFlow&amp; m_renderer;
</span><span class="cx">     LayoutUnit m_lineTop;
</span><span class="lines">@@ -151,7 +151,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template &lt;FloatingObject::Type FloatTypeValue&gt;
</span><del>-class ComputeFloatOffsetForFloatLayoutAdapter : public ComputeFloatOffsetAdapter&lt;FloatTypeValue&gt; { 
</del><ins>+class ComputeFloatOffsetForFloatLayoutAdapter : public ComputeFloatOffsetAdapter&lt;FloatTypeValue&gt; {
</ins><span class="cx"> public:
</span><span class="cx">     ComputeFloatOffsetForFloatLayoutAdapter(const RenderBlockFlow&amp; renderer, LayoutUnit lineTop, LayoutUnit lineBottom, LayoutUnit offset)
</span><span class="cx">         : ComputeFloatOffsetAdapter&lt;FloatTypeValue&gt;(renderer, lineTop, lineBottom, offset)
</span><span class="lines">@@ -163,7 +163,7 @@
</span><span class="cx">     LayoutUnit heightRemaining() const;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    virtual bool updateOffsetIfNeeded(const FloatingObject*) override final;
</del><ins>+    virtual bool updateOffsetIfNeeded(const FloatingObject&amp;) override final;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template &lt;FloatingObject::Type FloatTypeValue&gt;
</span><span class="lines">@@ -177,7 +177,7 @@
</span><span class="cx">     virtual ~ComputeFloatOffsetForLineLayoutAdapter() { }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    virtual bool updateOffsetIfNeeded(const FloatingObject*) override final;
</del><ins>+    virtual bool updateOffsetIfNeeded(const FloatingObject&amp;) override final;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class FindNextFloatLogicalBottomAdapter {
</span><span class="lines">@@ -425,9 +425,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline bool ComputeFloatOffsetForFloatLayoutAdapter&lt;FloatingObject::FloatLeft&gt;::updateOffsetIfNeeded(const FloatingObject* floatingObject)
</del><ins>+inline bool ComputeFloatOffsetForFloatLayoutAdapter&lt;FloatingObject::FloatLeft&gt;::updateOffsetIfNeeded(const FloatingObject&amp; floatingObject)
</ins><span class="cx"> {
</span><del>-    LayoutUnit logicalRight = m_renderer.logicalRightForFloat(floatingObject);
</del><ins>+    LayoutUnit logicalRight = m_renderer.logicalRightForFloat(&amp;floatingObject);
</ins><span class="cx">     if (logicalRight &gt; m_offset) {
</span><span class="cx">         m_offset = logicalRight;
</span><span class="cx">         return true;
</span><span class="lines">@@ -436,9 +436,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline bool ComputeFloatOffsetForFloatLayoutAdapter&lt;FloatingObject::FloatRight&gt;::updateOffsetIfNeeded(const FloatingObject* floatingObject)
</del><ins>+inline bool ComputeFloatOffsetForFloatLayoutAdapter&lt;FloatingObject::FloatRight&gt;::updateOffsetIfNeeded(const FloatingObject&amp; floatingObject)
</ins><span class="cx"> {
</span><del>-    LayoutUnit logicalLeft = m_renderer.logicalLeftForFloat(floatingObject);
</del><ins>+    LayoutUnit logicalLeft = m_renderer.logicalLeftForFloat(&amp;floatingObject);
</ins><span class="cx">     if (logicalLeft &lt; m_offset) {
</span><span class="cx">         m_offset = logicalLeft;
</span><span class="cx">         return true;
</span><span class="lines">@@ -463,35 +463,22 @@
</span><span class="cx">     ASSERT(floatingObject-&gt;isPlaced());
</span><span class="cx">     ASSERT(rangesIntersect(m_renderer.logicalTopForFloat(floatingObject), m_renderer.logicalBottomForFloat(floatingObject), m_lineTop, m_lineBottom));
</span><span class="cx"> 
</span><del>-    bool floatIsNewExtreme = updateOffsetIfNeeded(floatingObject);
</del><ins>+    bool floatIsNewExtreme = updateOffsetIfNeeded(*floatingObject);
</ins><span class="cx">     if (floatIsNewExtreme)
</span><span class="cx">         m_outermostFloat = floatingObject;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#if ENABLE(CSS_SHAPES)
-static inline ShapeOutsideInfo* shapeInfoForFloat(const FloatingObject* floatingObject, const RenderBlockFlow&amp; containingBlock, LayoutUnit lineTop, LayoutUnit lineBottom)
-{
-    if (floatingObject) {
-        if (ShapeOutsideInfo* shapeOutside = floatingObject-&gt;renderer().shapeOutsideInfo()) {
-            shapeOutside-&gt;updateDeltasForContainingBlockLine(containingBlock, *floatingObject, lineTop, lineBottom - lineTop);
-            return shapeOutside;
-        }
-    }
-
-    return nullptr;
-}
-#endif
-
</del><span class="cx"> template&lt;&gt;
</span><del>-inline bool ComputeFloatOffsetForLineLayoutAdapter&lt;FloatingObject::FloatLeft&gt;::updateOffsetIfNeeded(const FloatingObject* floatingObject)
</del><ins>+inline bool ComputeFloatOffsetForLineLayoutAdapter&lt;FloatingObject::FloatLeft&gt;::updateOffsetIfNeeded(const FloatingObject&amp; floatingObject)
</ins><span class="cx"> {
</span><del>-    LayoutUnit logicalRight = m_renderer.logicalRightForFloat(floatingObject);
</del><ins>+    LayoutUnit logicalRight = m_renderer.logicalRightForFloat(&amp;floatingObject);
</ins><span class="cx"> #if ENABLE(CSS_SHAPES)
</span><del>-    if (ShapeOutsideInfo* shapeOutside = shapeInfoForFloat(floatingObject, m_renderer, m_lineTop, m_lineBottom)) {
-        if (!shapeOutside-&gt;lineOverlapsShape())
</del><ins>+    if (ShapeOutsideInfo* shapeOutside = floatingObject.renderer().shapeOutsideInfo()) {
+        ShapeOutsideDeltas shapeDeltas = shapeOutside-&gt;computeDeltasForContainingBlockLine(m_renderer, floatingObject, m_lineTop, m_lineBottom - m_lineTop);
+        if (!shapeDeltas.lineOverlapsShape())
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        logicalRight += shapeOutside-&gt;rightMarginBoxDelta();
</del><ins>+        logicalRight += shapeDeltas.rightMarginBoxDelta();
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx">     if (logicalRight &gt; m_offset) {
</span><span class="lines">@@ -503,15 +490,16 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline bool ComputeFloatOffsetForLineLayoutAdapter&lt;FloatingObject::FloatRight&gt;::updateOffsetIfNeeded(const FloatingObject* floatingObject)
</del><ins>+inline bool ComputeFloatOffsetForLineLayoutAdapter&lt;FloatingObject::FloatRight&gt;::updateOffsetIfNeeded(const FloatingObject&amp; floatingObject)
</ins><span class="cx"> {
</span><del>-    LayoutUnit logicalLeft = m_renderer.logicalLeftForFloat(floatingObject);
</del><ins>+    LayoutUnit logicalLeft = m_renderer.logicalLeftForFloat(&amp;floatingObject);
</ins><span class="cx"> #if ENABLE(CSS_SHAPES)
</span><del>-    if (ShapeOutsideInfo* shapeOutside = shapeInfoForFloat(floatingObject, m_renderer, m_lineTop, m_lineBottom)) {
-        if (!shapeOutside-&gt;lineOverlapsShape())
</del><ins>+    if (ShapeOutsideInfo* shapeOutside = floatingObject.renderer().shapeOutsideInfo()) {
+        ShapeOutsideDeltas shapeDeltas = shapeOutside-&gt;computeDeltasForContainingBlockLine(m_renderer, floatingObject, m_lineTop, m_lineBottom - m_lineTop);
+        if (!shapeDeltas.lineOverlapsShape())
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        logicalLeft += shapeOutside-&gt;leftMarginBoxDelta();
</del><ins>+        logicalLeft += shapeDeltas.leftMarginBoxDelta();
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx">     if (logicalLeft &lt; m_offset) {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderinglineLineWidthcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/line/LineWidth.cpp (172528 => 172529)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/line/LineWidth.cpp        2014-08-13 19:03:56 UTC (rev 172528)
+++ trunk/Source/WebCore/rendering/line/LineWidth.cpp        2014-08-13 19:05:21 UTC (rev 172529)
</span><span class="lines">@@ -83,10 +83,10 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_SHAPES)
</span><del>-    ShapeOutsideInfo* shapeOutsideInfo = newFloat-&gt;renderer().shapeOutsideInfo();
-    if (shapeOutsideInfo) {
</del><ins>+    ShapeOutsideDeltas shapeDeltas;
+    if (ShapeOutsideInfo* shapeOutsideInfo = newFloat-&gt;renderer().shapeOutsideInfo()) {
</ins><span class="cx">         LayoutUnit lineHeight = m_block.lineHeight(m_isFirstLine, m_block.isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes);
</span><del>-        shapeOutsideInfo-&gt;updateDeltasForContainingBlockLine(m_block, *newFloat, m_block.logicalHeight(), lineHeight);
</del><ins>+        shapeDeltas = shapeOutsideInfo-&gt;computeDeltasForContainingBlockLine(m_block, *newFloat, m_block.logicalHeight(), lineHeight);
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -95,9 +95,9 @@
</span><span class="cx">         if (shouldIndentText() &amp;&amp; m_block.style().isLeftToRightDirection())
</span><span class="cx">             newLeft += floorToInt(m_block.textIndentOffset());
</span><span class="cx"> #if ENABLE(CSS_SHAPES)
</span><del>-        if (shapeOutsideInfo) {
-            if (shapeOutsideInfo-&gt;lineOverlapsShape())
-                newLeft += shapeOutsideInfo-&gt;rightMarginBoxDelta();
</del><ins>+        if (shapeDeltas.isValid()) {
+            if (shapeDeltas.lineOverlapsShape())
+                newLeft += shapeDeltas.rightMarginBoxDelta();
</ins><span class="cx">             else // If the line doesn't overlap the shape, then we need to act as if this float didn't exist.
</span><span class="cx">                 newLeft = m_left;
</span><span class="cx">         }
</span><span class="lines">@@ -108,9 +108,9 @@
</span><span class="cx">         if (shouldIndentText() &amp;&amp; !m_block.style().isLeftToRightDirection())
</span><span class="cx">             newRight -= floorToInt(m_block.textIndentOffset());
</span><span class="cx"> #if ENABLE(CSS_SHAPES)
</span><del>-        if (shapeOutsideInfo) {
-            if (shapeOutsideInfo-&gt;lineOverlapsShape())
-                newRight += shapeOutsideInfo-&gt;leftMarginBoxDelta();
</del><ins>+        if (shapeDeltas.isValid()) {
+            if (shapeDeltas.lineOverlapsShape())
+                newRight += shapeDeltas.leftMarginBoxDelta();
</ins><span class="cx">             else // If the line doesn't overlap the shape, then we need to act as if this float didn't exist.
</span><span class="cx">                 newRight = m_right;
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingshapesShapeOutsideInfocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/shapes/ShapeOutsideInfo.cpp (172528 => 172529)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/shapes/ShapeOutsideInfo.cpp        2014-08-13 19:03:56 UTC (rev 172528)
+++ trunk/Source/WebCore/rendering/shapes/ShapeOutsideInfo.cpp        2014-08-13 19:05:21 UTC (rev 172529)
</span><span class="lines">@@ -303,42 +303,39 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ShapeOutsideInfo::updateDeltasForContainingBlockLine(const RenderBlockFlow&amp; containingBlock, const FloatingObject&amp; floatingObject, LayoutUnit lineTop, LayoutUnit lineHeight)
</del><ins>+ShapeOutsideDeltas ShapeOutsideInfo::computeDeltasForContainingBlockLine(const RenderBlockFlow&amp; containingBlock, const FloatingObject&amp; floatingObject, LayoutUnit lineTop, LayoutUnit lineHeight)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(lineHeight &gt;= 0);
</span><del>-
</del><span class="cx">     LayoutUnit borderBoxTop = containingBlock.logicalTopForFloat(&amp;floatingObject) + containingBlock.marginBeforeForChild(m_renderer);
</span><span class="cx">     LayoutUnit borderBoxLineTop = lineTop - borderBoxTop;
</span><span class="cx"> 
</span><del>-    if (isShapeDirty() || m_borderBoxLineTop != borderBoxLineTop || m_lineHeight != lineHeight) {
-        m_borderBoxLineTop = borderBoxLineTop;
-        m_referenceBoxLineTop = borderBoxLineTop - logicalTopOffset();
-        m_lineHeight = lineHeight;
-
</del><ins>+    if (isShapeDirty() || !m_shapeOutsideDeltas.isForLine(borderBoxLineTop, lineHeight)) {
+        LayoutUnit referenceBoxLineTop = borderBoxLineTop - logicalTopOffset();
</ins><span class="cx">         LayoutUnit floatMarginBoxWidth = containingBlock.logicalWidthForFloat(&amp;floatingObject);
</span><span class="cx"> 
</span><del>-        if (computedShape().lineOverlapsShapeMarginBounds(m_referenceBoxLineTop, m_lineHeight)) {
</del><ins>+        if (computedShape().lineOverlapsShapeMarginBounds(referenceBoxLineTop, lineHeight)) {
</ins><span class="cx">             LineSegment segment = computedShape().getExcludedInterval((borderBoxLineTop - logicalTopOffset()), std::min(lineHeight, shapeLogicalBottom() - borderBoxLineTop));
</span><span class="cx">             if (segment.isValid) {
</span><span class="cx">                 LayoutUnit logicalLeftMargin = containingBlock.style().isLeftToRightDirection() ? containingBlock.marginStartForChild(m_renderer) : containingBlock.marginEndForChild(m_renderer);
</span><span class="cx">                 LayoutUnit rawLeftMarginBoxDelta = segment.logicalLeft + logicalLeftOffset() + logicalLeftMargin;
</span><del>-                m_leftMarginBoxDelta = clampTo&lt;LayoutUnit&gt;(rawLeftMarginBoxDelta, LayoutUnit(), floatMarginBoxWidth);
</del><ins>+                LayoutUnit leftMarginBoxDelta = clampTo&lt;LayoutUnit&gt;(rawLeftMarginBoxDelta, LayoutUnit(), floatMarginBoxWidth);
</ins><span class="cx"> 
</span><span class="cx">                 LayoutUnit logicalRightMargin = containingBlock.style().isLeftToRightDirection() ? containingBlock.marginEndForChild(m_renderer) : containingBlock.marginStartForChild(m_renderer);
</span><span class="cx">                 LayoutUnit rawRightMarginBoxDelta = segment.logicalRight + logicalLeftOffset() - containingBlock.logicalWidthForChild(m_renderer) - logicalRightMargin;
</span><del>-                m_rightMarginBoxDelta = clampTo&lt;LayoutUnit&gt;(rawRightMarginBoxDelta, -floatMarginBoxWidth, LayoutUnit());
-                m_lineOverlapsShape = true;
-                return;
</del><ins>+                LayoutUnit rightMarginBoxDelta = clampTo&lt;LayoutUnit&gt;(rawRightMarginBoxDelta, -floatMarginBoxWidth, LayoutUnit());
+
+                m_shapeOutsideDeltas = ShapeOutsideDeltas(leftMarginBoxDelta, rightMarginBoxDelta, true, borderBoxLineTop, lineHeight);
+                return m_shapeOutsideDeltas;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Lines that do not overlap the shape should act as if the float
</span><span class="cx">         // wasn't there for layout purposes. So we set the deltas to remove the
</span><span class="cx">         // entire width of the float
</span><del>-        m_leftMarginBoxDelta = floatMarginBoxWidth;
-        m_rightMarginBoxDelta = -floatMarginBoxWidth;
-        m_lineOverlapsShape = false;
</del><ins>+        m_shapeOutsideDeltas = ShapeOutsideDeltas(floatMarginBoxWidth, -floatMarginBoxWidth, false, borderBoxLineTop, lineHeight);
</ins><span class="cx">     }
</span><ins>+
+    return m_shapeOutsideDeltas;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingshapesShapeOutsideInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/shapes/ShapeOutsideInfo.h (172528 => 172529)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/shapes/ShapeOutsideInfo.h        2014-08-13 19:03:56 UTC (rev 172528)
+++ trunk/Source/WebCore/rendering/shapes/ShapeOutsideInfo.h        2014-08-13 19:05:21 UTC (rev 172529)
</span><span class="lines">@@ -43,23 +43,59 @@
</span><span class="cx"> class StyleImage;
</span><span class="cx"> class FloatingObject;
</span><span class="cx"> 
</span><ins>+class ShapeOutsideDeltas final {
+public:
+    ShapeOutsideDeltas()
+        : m_leftMarginBoxDelta(0)
+        , m_rightMarginBoxDelta(0)
+        , m_borderBoxLineTop(0)
+        , m_lineHeight(0)
+        , m_lineOverlapsShape(false)
+        , m_isValid(false)
+    {
+    }
+
+    ShapeOutsideDeltas(LayoutUnit leftMarginBoxDelta, LayoutUnit rightMarginBoxDelta, bool lineOverlapsShape, LayoutUnit borderBoxLineTop, LayoutUnit lineHeight)
+        : m_leftMarginBoxDelta(leftMarginBoxDelta)
+        , m_rightMarginBoxDelta(rightMarginBoxDelta)
+        , m_borderBoxLineTop(borderBoxLineTop)
+        , m_lineHeight(lineHeight)
+        , m_lineOverlapsShape(lineOverlapsShape)
+        , m_isValid(true)
+    {
+    }
+
+    bool isForLine(LayoutUnit borderBoxLineTop, LayoutUnit lineHeight)
+    {
+        return m_isValid &amp;&amp; m_borderBoxLineTop == borderBoxLineTop &amp;&amp; m_lineHeight == lineHeight;
+    }
+
+    bool isValid() { return m_isValid; }
+    LayoutUnit leftMarginBoxDelta() { ASSERT(m_isValid); return m_leftMarginBoxDelta; }
+    LayoutUnit rightMarginBoxDelta() { ASSERT(m_isValid); return m_rightMarginBoxDelta; }
+    bool lineOverlapsShape() { ASSERT(m_isValid); return m_lineOverlapsShape; }
+
+private:
+    LayoutUnit m_leftMarginBoxDelta;
+    LayoutUnit m_rightMarginBoxDelta;
+    LayoutUnit m_borderBoxLineTop;
+    LayoutUnit m_lineHeight;
+    bool m_lineOverlapsShape;
+    bool m_isValid;
+};
+
</ins><span class="cx"> class ShapeOutsideInfo final {
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx">     ShapeOutsideInfo(const RenderBox&amp; renderer)
</span><span class="cx">         : m_renderer(renderer)
</span><del>-        , m_lineOverlapsShape(false)
</del><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static bool isEnabledFor(const RenderBox&amp;);
</span><span class="cx"> 
</span><del>-    LayoutUnit leftMarginBoxDelta() const { return m_leftMarginBoxDelta; }
-    LayoutUnit rightMarginBoxDelta() const { return m_rightMarginBoxDelta; }
-    bool lineOverlapsShape() const { return m_lineOverlapsShape; }
</del><ins>+    ShapeOutsideDeltas computeDeltasForContainingBlockLine(const RenderBlockFlow&amp;, const FloatingObject&amp;, LayoutUnit lineTop, LayoutUnit lineHeight);
</ins><span class="cx"> 
</span><del>-    void updateDeltasForContainingBlockLine(const RenderBlockFlow&amp;, const FloatingObject&amp;, LayoutUnit lineTop, LayoutUnit lineHeight);
-
</del><span class="cx">     void setReferenceBoxLogicalSize(LayoutSize);
</span><span class="cx"> 
</span><span class="cx">     LayoutUnit shapeLogicalTop() const { return computedShape().shapeMarginLogicalBoundingBox().y() + logicalTopOffset(); }
</span><span class="lines">@@ -69,10 +105,6 @@
</span><span class="cx">     LayoutUnit shapeLogicalWidth() const { return computedShape().shapeMarginLogicalBoundingBox().width(); }
</span><span class="cx">     LayoutUnit shapeLogicalHeight() const { return computedShape().shapeMarginLogicalBoundingBox().height(); }
</span><span class="cx"> 
</span><del>-    LayoutUnit logicalLineTop() const { return m_referenceBoxLineTop + logicalTopOffset(); }
-    LayoutUnit logicalLineBottom() const { return m_referenceBoxLineTop + m_lineHeight + logicalTopOffset(); }
-    LayoutUnit logicalLineBottom(LayoutUnit lineHeight) const { return m_referenceBoxLineTop + lineHeight + logicalTopOffset(); }
-
</del><span class="cx">     void markShapeAsDirty() { m_shape = nullptr; }
</span><span class="cx">     bool isShapeDirty() { return !m_shape; }
</span><span class="cx"> 
</span><span class="lines">@@ -110,13 +142,8 @@
</span><span class="cx"> 
</span><span class="cx">     mutable std::unique_ptr&lt;Shape&gt; m_shape;
</span><span class="cx">     LayoutSize m_referenceBoxLogicalSize;
</span><del>-    LayoutUnit m_referenceBoxLineTop;
-    LayoutUnit m_lineHeight;
</del><span class="cx"> 
</span><del>-    LayoutUnit m_leftMarginBoxDelta;
-    LayoutUnit m_rightMarginBoxDelta;
-    LayoutUnit m_borderBoxLineTop;
-    bool m_lineOverlapsShape;
</del><ins>+    ShapeOutsideDeltas m_shapeOutsideDeltas;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>