Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1321)

Unified Diff: Source/core/rendering/RenderGrid.cpp

Issue 22642010: [CSS Grid Layout] Speed up painting on large grids (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebaselined change Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderGrid.cpp
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp
index 20183d4dfbcff6f4b490374b0e1ab6faa268153e..887c26b609aaf5bd32cf3c1c7abb6e4cc4d3e020 100644
--- a/Source/core/rendering/RenderGrid.cpp
+++ b/Source/core/rendering/RenderGrid.cpp
@@ -856,6 +856,8 @@ void RenderGrid::layoutGridItems()
computedUsedBreadthOfGridTracks(ForRows, columnTracks, rowTracks);
ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, rowTracks));
+ populateGridPositions(columnTracks, rowTracks);
+
for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
// Because the grid area cannot be styled, we don't need to adjust
// the grid breadth to account for 'box-sizing'.
@@ -1118,24 +1120,68 @@ LayoutUnit RenderGrid::gridAreaBreadthForChild(const RenderBox* child, TrackSizi
return gridAreaBreadth;
}
+void RenderGrid::populateGridPositions(const Vector<GridTrack>& columnTracks, const Vector<GridTrack>& rowTracks)
+{
+ m_columnPositions.resize(columnTracks.size() + 1);
+ m_columnPositions[0] = borderAndPaddingStart();
+ for (size_t i = 0; i < m_columnPositions.size() - 1; ++i)
+ m_columnPositions[i + 1] = m_columnPositions[i] + columnTracks[i].m_usedBreadth;
+
+ m_rowPositions.resize(rowTracks.size() + 1);
+ m_rowPositions[0] = borderAndPaddingBefore();
+ for (size_t i = 0; i < m_rowPositions.size() - 1; ++i)
+ m_rowPositions[i + 1] = m_rowPositions[i] + rowTracks[i].m_usedBreadth;
+}
+
LayoutPoint RenderGrid::findChildLogicalPosition(RenderBox* child, const Vector<GridTrack>& columnTracks, const Vector<GridTrack>& rowTracks)
{
const GridCoordinate& coordinate = cachedGridCoordinate(child);
+ ASSERT(coordinate.columns.initialPositionIndex < columnTracks.size());
+ ASSERT(coordinate.rows.initialPositionIndex < rowTracks.size());
// The grid items should be inside the grid container's border box, that's why they need to be shifted.
- LayoutPoint offset(borderAndPaddingStart() + marginStartForChild(child), borderAndPaddingBefore() + marginBeforeForChild(child));
- // FIXME: |columnTrack| and |rowTrack| should be smaller than our column / row count.
- for (size_t i = 0; i < coordinate.columns.initialPositionIndex && i < columnTracks.size(); ++i)
- offset.setX(offset.x() + columnTracks[i].m_usedBreadth);
- for (size_t i = 0; i < coordinate.rows.initialPositionIndex && i < rowTracks.size(); ++i)
- offset.setY(offset.y() + rowTracks[i].m_usedBreadth);
-
- return offset;
+ return LayoutPoint(m_columnPositions[coordinate.columns.initialPositionIndex] + marginStartForChild(child), m_rowPositions[coordinate.rows.initialPositionIndex] + marginBeforeForChild(child));
+}
+
+static GridSpan dirtiedGridAreas(const Vector<LayoutUnit>& coordinates, LayoutUnit start, LayoutUnit end)
+{
+ // This function does a binary search over the coordinates.
+ // FIXME: This doesn't work with grid items overflowing their grid areas and should be tested & fixed.
+
+ size_t startGridAreaIndex = std::upper_bound(coordinates.begin(), coordinates.end() - 1, start) - coordinates.begin();
+ if (startGridAreaIndex > 0)
+ --startGridAreaIndex;
+
+ size_t endGridAreaIndex = std::upper_bound(coordinates.begin() + startGridAreaIndex, coordinates.end() - 1, end) - coordinates.begin();
+ return GridSpan(startGridAreaIndex, endGridAreaIndex);
}
void RenderGrid::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
- for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next())
+ ASSERT_WITH_SECURITY_IMPLICATION(!gridIsDirty());
+
+ LayoutRect localRepaintRect = paintInfo.rect;
+ localRepaintRect.moveBy(-paintOffset);
+
+ GridSpan dirtiedColumns = dirtiedGridAreas(m_columnPositions, localRepaintRect.x(), localRepaintRect.maxX());
+ GridSpan dirtiedRows = dirtiedGridAreas(m_rowPositions, localRepaintRect.y(), localRepaintRect.maxY());
+
+ OrderIterator paintIterator(this);
+ {
+ OrderIteratorPopulator populator(paintIterator);
+
+ for (size_t row = dirtiedRows.initialPositionIndex; row < dirtiedRows.finalPositionIndex; ++row) {
+ for (size_t column = dirtiedColumns.initialPositionIndex; column < dirtiedColumns.finalPositionIndex; ++column) {
+ const Vector<RenderBox*, 1> children = m_grid[row][column];
+ // FIXME: If we start adding spanning children in all grid areas they span, this
+ // would make us paint them several times, which is wrong!
+ for (size_t j = 0; j < children.size(); ++j)
+ populator.storeChild(children[j]);
+ }
+ }
+ }
+
+ for (RenderBox* child = paintIterator.first(); child; child = paintIterator.next())
paintChild(child, paintInfo, paintOffset);
}
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698