No subject
Fri Mar 7 15:32:22 PST 2014
3971">r153971</a> by <jchaffraix at chromium.org>
This patches reuse the OrderIterator's Vector. It provides a helper class=
OrderIteratorPopulator, used for
manipulating the Vector directly. Which allows to consolidate the code in=
to a single implementation across
flexbox and grid.
No new tests, already covered by current tests.
* rendering/OrderIterator.cpp:
(WebCore::OrderIteratorPopulator::~OrderIteratorPopulator): Reset OrderIt=
erator and call
removeDuplicatedOrderValues().
(WebCore::OrderIteratorPopulator::removeDuplicatedOrderValues): Sorts the=
Vector and removes the duplicated
order values.
(WebCore::OrderIteratorPopulator::collectChild): Collect order value info=
rmation from child.
(WebCore::OrderIterator::setOrderValues): Deleted.
* rendering/OrderIterator.h:
(WebCore::OrderIteratorPopulator::OrderIteratorPopulator): Add helper cla=
ss to manipulate OrderValues Vector.
* rendering/RenderFlexibleBox.cpp:
(WebCore::RenderFlexibleBox::layoutBlock): Remove unneeded code related t=
o old OrderValues vector.
(WebCore::RenderFlexibleBox::prepareOrderIteratorAndMargins): Populate Or=
derIterator using collectChild().
(WebCore::RenderFlexibleBox::computeMainAxisPreferredSizes): Deleted.
* rendering/RenderFlexibleBox.h: Rename computeMainAxisPreferredSizes() t=
o prepareOrderIteratorAndMargins().
* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::populateExplicitGridAndOrderIterator): Populate Ord=
erIterator using collectChild().</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href=3D"#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeL=
og</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingOrderIteratorcpp">trunk/Source=
/WebCore/rendering/OrderIterator.cpp</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingOrderIteratorh">trunk/Source/W=
ebCore/rendering/OrderIterator.h</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingRenderFlexibleBoxcpp">trunk/So=
urce/WebCore/rendering/RenderFlexibleBox.cpp</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingRenderFlexibleBoxh">trunk/Sour=
ce/WebCore/rendering/RenderFlexibleBox.h</a></li>
<li><a href=3D"#trunkSourceWebCorerenderingRenderGridcpp">trunk/Source/We=
bCore/rendering/RenderGrid.cpp</a></li>
</ul>
</div>
<div id=3D"patch">
<h3>Diff</h3>
<a id=3D"trunkSourceWebCoreChangeLog"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (1693=
71 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/ChangeLog 2014-05-27 07:05:=
44 UTC (rev 169371)
+++ trunk/Source/WebCore/ChangeLog 2014-05-27 07:17:52 UTC (rev 169372)
</span><span class=3D"lines">@@ -1,3 +1,35 @@
</span><ins>+2014-05-27 Manuel Rego Casasnovas <rego at igalia.com>
+
+ Setting up OrderIterator shouldn't require an extra Vector
+ https://bugs.webkit.org/show_bug.cgi?id=3D119061
+
+ Reviewed by Darin Adler.
+
+ From Blink r153971 by <jchaffraix at chromium.org>
+
+ This patches reuse the OrderIterator's Vector. It provides a hel=
per class OrderIteratorPopulator, used for
+ manipulating the Vector directly. Which allows to consolidate th=
e code into a single implementation across
+ flexbox and grid.
+
+ No new tests, already covered by current tests.
+
+ * rendering/OrderIterator.cpp:
+ (WebCore::OrderIteratorPopulator::~OrderIteratorPopulator): Rese=
t OrderIterator and call
+ removeDuplicatedOrderValues().
+ (WebCore::OrderIteratorPopulator::removeDuplicatedOrderValues): =
Sorts the Vector and removes the duplicated
+ order values.
+ (WebCore::OrderIteratorPopulator::collectChild): Collect order v=
alue information from child.
+ (WebCore::OrderIterator::setOrderValues): Deleted.
+ * rendering/OrderIterator.h:
+ (WebCore::OrderIteratorPopulator::OrderIteratorPopulator): Add h=
elper class to manipulate OrderValues Vector.
+ * rendering/RenderFlexibleBox.cpp:
+ (WebCore::RenderFlexibleBox::layoutBlock): Remove unneeded code =
related to old OrderValues vector.
+ (WebCore::RenderFlexibleBox::prepareOrderIteratorAndMargins): Po=
pulate OrderIterator using collectChild().
+ (WebCore::RenderFlexibleBox::computeMainAxisPreferredSizes): Del=
eted.
+ * rendering/RenderFlexibleBox.h: Rename computeMainAxisPreferred=
Sizes() to prepareOrderIteratorAndMargins().
+ * rendering/RenderGrid.cpp:
+ (WebCore::RenderGrid::populateExplicitGridAndOrderIterator): Pop=
ulate OrderIterator using collectChild().
+
</ins><span class=3D"cx"> 2014-05-26 Tim Horton <timothy_horton at appl=
e.com>
</span><span class=3D"cx">=20
</span><span class=3D"cx"> [wk2] RemoteLayerBackingStore front bu=
ffers should be purgeable when unparented
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingOrderIteratorcpp"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Order=
Iterator.cpp (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/OrderIterator.cpp=
2014-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/OrderIterator.cpp 2014-05-27 07:17:52 =
UTC (rev 169372)
</span><span class=3D"lines">@@ -32,8 +32,7 @@
</span><span class=3D"cx"> #include "config.h"
</span><span class=3D"cx"> #include "OrderIterator.h"
</span><span class=3D"cx">=20
</span><del>-#include "RenderFlexibleBox.h"
-#include "RenderGrid.h"
</del><ins>+#include "RenderBox.h"
</ins><span class=3D"cx">=20
</span><span class=3D"cx"> namespace WebCore {
</span><span class=3D"cx">=20
</span><span class=3D"lines">@@ -45,18 +44,6 @@
</span><span class=3D"cx"> reset();
</span><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><del>-void OrderIterator::setOrderValues(OrderValues&& ord=
erValues)
-{
- reset();
- m_orderValues =3D std::move(orderValues);
- if (m_orderValues.size() < 2)
- return;
-
- std::sort(m_orderValues.begin(), m_orderValues.end());
- auto nextElement =3D std::unique(m_orderValues.begin(), m_orderValue=
s.end());
- m_orderValues.shrinkCapacity(nextElement - m_orderValues.begin());
-}
-
</del><span class=3D"cx"> RenderBox* OrderIterator::first()
</span><span class=3D"cx"> {
</span><span class=3D"cx"> reset();
</span><span class=3D"lines">@@ -94,4 +81,35 @@
</span><span class=3D"cx"> m_orderIndex =3D cInvalidIndex;
</span><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><ins>+OrderIteratorPopulator::OrderIteratorPopulator(OrderIterator=
& iterator)
+ : m_iterator(iterator)
+{
+ // Note that we don't release the memory here, we only invalidate th=
e size
+ // This avoids unneeded reallocation if the size ends up not changin=
g.
+ m_iterator.m_orderValues.shrink(0);
+}
+
+OrderIteratorPopulator::~OrderIteratorPopulator()
+{
+ m_iterator.reset();
+
+ if (m_iterator.m_orderValues.size() > 1)
+ removeDuplicatedOrderValues();
+}
+
+void OrderIteratorPopulator::removeDuplicatedOrderValues()
+{
+ auto& orderValues =3D m_iterator.m_orderValues;
+
+ std::sort(orderValues.begin(), orderValues.end());
+ auto nextElement =3D std::unique(orderValues.begin(), orderValues.en=
d());
+ orderValues.shrinkCapacity(nextElement - orderValues.begin());
+}
+
+void OrderIteratorPopulator::collectChild(const RenderBox& child)
+{
+ m_iterator.m_orderValues.append(child.style().order());
+}
+
+
</ins><span class=3D"cx"> } // namespace WebCore
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingOrderIteratorh"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Order=
Iterator.h (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/OrderIterator.h 2=
014-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/OrderIterator.h 2014-05-27 07:17:52 UT=
C (rev 169372)
</span><span class=3D"lines">@@ -41,10 +41,9 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx"> class OrderIterator {
</span><span class=3D"cx"> public:
</span><del>- OrderIterator(RenderBox&);
</del><ins>+ friend class OrderIteratorPopulator;
</ins><span class=3D"cx">=20
</span><del>- typedef Vector<int, 1> OrderValues;
- void setOrderValues(OrderValues&&);
</del><ins>+ explicit OrderIterator(RenderBox&);
</ins><span class=3D"cx">=20
</span><span class=3D"cx"> RenderBox* currentChild() const { return m=
_currentChild; }
</span><span class=3D"cx"> RenderBox* first();
</span><span class=3D"lines">@@ -55,10 +54,24 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx"> RenderBox& m_containerBox;
</span><span class=3D"cx"> RenderBox* m_currentChild;
</span><del>- OrderValues m_orderValues;
</del><ins>+
+ Vector<int, 1> m_orderValues;
</ins><span class=3D"cx"> int m_orderIndex;
</span><span class=3D"cx"> };
</span><span class=3D"cx">=20
</span><ins>+class OrderIteratorPopulator {
+public:
+ OrderIteratorPopulator(OrderIterator&);
+ ~OrderIteratorPopulator();
+
+ void collectChild(const RenderBox&);
+
+private:
+ void removeDuplicatedOrderValues();
+
+ OrderIterator& m_iterator;
+};
+
</ins><span class=3D"cx"> } // namespace WebCore
</span><span class=3D"cx">=20
</span><span class=3D"cx"> #endif // OrderIterator_h
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingRenderFlexibleBoxcpp"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Rende=
rFlexibleBox.cpp (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/RenderFlexibleBox=
.cpp 2014-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp 2014-05-27 07:17=
:52 UTC (rev 169372)
</span><span class=3D"lines">@@ -275,13 +275,11 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx"> dirtyForLayoutFromPercentageHeightDescenda=
nts();
</span><span class=3D"cx">=20
</span><del>- Vector<LineContext> lineContexts;
- OrderIterator::OrderValues orderValues;
- computeMainAxisPreferredSizes(orderValues);
- m_orderIterator.setOrderValues(std::move(orderValues));
</del><ins>+ prepareOrderIteratorAndMargins();
</ins><span class=3D"cx">=20
</span><span class=3D"cx"> ChildFrameRects oldChildRects;
</span><span class=3D"cx"> appendChildFrameRects(oldChildRects);
</span><ins>+ Vector<LineContext> lineContexts;
</ins><span class=3D"cx"> layoutFlexItems(relayoutChildren, lineConte=
xts);
</span><span class=3D"cx">=20
</span><span class=3D"cx"> updateLogicalHeight();
</span><span class=3D"lines">@@ -834,16 +832,12 @@
</span><span class=3D"cx"> return minimumValueForLength(margin, avail=
ableSize);
</span><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><del>-void RenderFlexibleBox::computeMainAxisPreferredSizes(OrderI=
terator::OrderValues& orderValues)
</del><ins>+void RenderFlexibleBox::prepareOrderIteratorAndMargins()
</ins><span class=3D"cx"> {
</span><del>- ASSERT(orderValues.isEmpty());
</del><ins>+ OrderIteratorPopulator populator(m_orderIterator);
</ins><span class=3D"cx">=20
</span><span class=3D"cx"> for (RenderBox* child =3D firstChildBox();=
child; child =3D child->nextSiblingBox()) {
</span><del>- // Avoid growing the vector for the common-case defa=
ult value of 0. This optimizes the most common case which is
- // one or a few values with the default order 0
- int order =3D child->style().order();
- if (orderValues.isEmpty() || orderValues.last() !=3D order)
- orderValues.append(order);
</del><ins>+ populator.collectChild(*child);
</ins><span class=3D"cx">=20
</span><span class=3D"cx"> if (child->isOutOfFlowPositioned())
</span><span class=3D"cx"> continue;
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingRenderFlexibleBoxh"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Rende=
rFlexibleBox.h (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/RenderFlexibleBox=
.h 2014-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.h 2014-05-27 07:17:5=
2 UTC (rev 169372)
</span><span class=3D"lines">@@ -137,7 +137,7 @@
</span><span class=3D"cx"> LayoutUnit marginBoxAscentForChild(RenderB=
ox&);
</span><span class=3D"cx">=20
</span><span class=3D"cx"> LayoutUnit computeChildMarginValue(const L=
ength& margin);
</span><del>- void computeMainAxisPreferredSizes(OrderIterator::OrderV=
alues&);
</del><ins>+ void prepareOrderIteratorAndMargins();
</ins><span class=3D"cx"> LayoutUnit adjustChildSizeForMinAndMax(Rend=
erBox&, LayoutUnit childSize);
</span><span class=3D"cx"> bool computeNextFlexLine(OrderedFlexItemLi=
st& orderedChildren, LayoutUnit& preferredMainAxisExtent, double&=
amp; totalFlexGrow, double& totalWeightedFlexShrink, LayoutUnit& =
minMaxAppliedMainAxisExtent, bool& hasInfiniteLineLength);
</span><span class=3D"cx">=20
</span></span></pre></div>
<a id=3D"trunkSourceWebCorerenderingRenderGridcpp"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/rendering/Rende=
rGrid.cpp (169371 =3D> 169372)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/rendering/RenderGrid.cpp 20=
14-05-27 07:05:44 UTC (rev 169371)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp 2014-05-27 07:17:52 UTC=
(rev 169372)
</span><span class=3D"lines">@@ -698,17 +698,12 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx"> void RenderGrid::populateExplicitGridAndOrderI=
terator()
</span><span class=3D"cx"> {
</span><del>- // FIXME: We should find a way to share OrderValues's in=
itialization code with RenderFlexibleBox.
- OrderIterator::OrderValues orderValues;
</del><ins>+ OrderIteratorPopulator populator(m_orderIterator);
</ins><span class=3D"cx"> size_t maximumRowIndex =3D std::max<size=
_t>(1, explicitGridRowCount());
</span><span class=3D"cx"> size_t maximumColumnIndex =3D std::max<=
size_t>(1, explicitGridColumnCount());
</span><span class=3D"cx">=20
</span><span class=3D"cx"> for (RenderBox* child =3D firstChildBox();=
child; child =3D child->nextSiblingBox()) {
</span><del>- // Avoid growing the vector for the common-case defa=
ult value of 0. This optimizes the most common case which is
- // one or a few values with the default order 0
- int order =3D child->style().order();
- if (orderValues.isEmpty() || orderValues.last() !=3D order)
- orderValues.append(order);
</del><ins>+ populator.collectChild(*child);
</ins><span class=3D"cx">=20
</span><span class=3D"cx"> // This function bypasses the cache (c=
achedGridCoordinate()) as it is used to build it.
</span><span class=3D"cx"> std::unique_ptr<GridSpan> rowPos=
itions =3D resolveGridPositionsFromStyle(child, ForRows);
</span><span class=3D"lines">@@ -725,8 +720,6 @@
</span><span class=3D"cx"> m_grid.grow(maximumRowIndex);
</span><span class=3D"cx"> for (size_t i =3D 0; i < m_grid.size();=
++i)
</span><span class=3D"cx"> m_grid[i].grow(maximumColumnIndex);
</span><del>-
- m_orderIterator.setOrderValues(std::move(orderValues));
</del><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><span class=3D"cx"> void RenderGrid::placeSpecifiedMajorAxisItemsO=
nGrid(const Vector<RenderBox*>& autoGridItems)
</span></span></pre>
</div>
</div>
</body>
</html>
More information about the webkit-changes
mailing list