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

Unified Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 2524963002: [css-grid] Move LayoutGrid attributes to Grid class (Closed)
Patch Set: Patch for landing v2 Created 4 years, 1 month 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 | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/layout/LayoutGrid.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index 361720fa2aa0271a698e9a718821f2587cf8346f..d210ac81ce679c04faa54e1fb8bffeef8f3723af 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -57,7 +57,9 @@ void LayoutGrid::Grid::ensureGridSize(size_t maximumRowSize,
}
}
-void LayoutGrid::Grid::insert(LayoutBox& child, const GridArea& area) {
+void LayoutGrid::Grid::insert(LayoutBox& child,
+ const GridArea& area,
+ bool isOrthogonalChild) {
DCHECK(area.rows.isTranslatedDefinite() &&
area.columns.isTranslatedDefinite());
ensureGridSize(area.rows.endLine(), area.columns.endLine());
@@ -66,10 +68,53 @@ void LayoutGrid::Grid::insert(LayoutBox& child, const GridArea& area) {
for (const auto& column : area.columns)
m_grid[row][column].append(&child);
}
+
+ setGridItemArea(child, area);
+
+ m_hasAnyOrthogonalChildren = m_hasAnyOrthogonalChildren || isOrthogonalChild;
+}
+
+void LayoutGrid::Grid::setSmallestTracksStart(int rowStart, int columnStart) {
+ m_smallestRowStart = rowStart;
+ m_smallestColumnStart = columnStart;
+}
+
+int LayoutGrid::Grid::smallestTrackStart(
+ GridTrackSizingDirection direction) const {
+ return direction == ForRows ? m_smallestRowStart : m_smallestColumnStart;
+}
+
+GridArea LayoutGrid::Grid::gridItemArea(const LayoutBox& item) const {
+ DCHECK(m_gridItemArea.contains(&item));
+ return m_gridItemArea.get(&item);
+}
+
+void LayoutGrid::Grid::setGridItemArea(const LayoutBox& item, GridArea area) {
+ m_gridItemArea.set(&item, area);
+}
+
+size_t LayoutGrid::Grid::gridItemPaintOrder(const LayoutBox& item) const {
+ return m_gridItemsIndexesMap.get(&item);
+}
+
+void LayoutGrid::Grid::setGridItemPaintOrder(const LayoutBox& item,
+ size_t order) {
+ m_gridItemsIndexesMap.set(&item, order);
}
+#if ENABLE(ASSERT)
+bool LayoutGrid::Grid::hasAnyGridItemPaintOrder() const {
+ return !m_gridItemsIndexesMap.isEmpty();
+}
+#endif
+
void LayoutGrid::Grid::clear() {
m_grid.resize(0);
+ m_gridItemArea.clear();
+ m_gridItemsIndexesMap.clear();
+ m_hasAnyOrthogonalChildren = false;
+ m_smallestRowStart = 0;
+ m_smallestColumnStart = 0;
}
class GridTrack {
@@ -486,7 +531,7 @@ void LayoutGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData,
// all the cases with orthogonal flows require this extra cycle; we need a
// more specific condition to detect whether child's min-content contribution
// has changed or not.
- if (m_hasAnyOrthogonalChildren) {
+ if (m_grid.hasAnyOrthogonalChildren()) {
computeTrackSizesForDefiniteSize(ForColumns, sizingData,
availableSpaceForColumns);
computeTrackSizesForDefiniteSize(ForRows, sizingData,
@@ -882,7 +927,7 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(
tracks[trackIndex],
gridTrackSize(direction, trackIndex).maxTrackBreadth().flex()));
- if (!m_gridItemArea.isEmpty()) {
+ if (m_grid.hasInFlowGridItems()) {
for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) {
GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i]);
while (LayoutBox* gridItem = iterator.nextGridItem()) {
@@ -1133,8 +1178,7 @@ const GridTrackSize& LayoutGrid::rawGridTrackSize(
size_t explicitTracksCount = trackStyles.size() + autoRepeatTracksCount;
int untranslatedIndexAsInt =
- translatedIndex +
- (isRowAxis ? m_smallestColumnStart : m_smallestRowStart);
+ translatedIndex + m_grid.smallestTrackStart(direction);
size_t autoTrackStylesSize = autoTrackStyles.size();
if (untranslatedIndexAsInt < 0) {
int index = untranslatedIndexAsInt % static_cast<int>(autoTrackStylesSize);
@@ -1408,7 +1452,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctions(
GridTrackSizingDirection direction,
GridSizingData& sizingData) const {
sizingData.itemsSortedByIncreasingSpan.shrink(0);
- if (!m_gridItemArea.isEmpty()) {
+ if (m_grid.hasInFlowGridItems()) {
HashSet<LayoutBox*> itemsSet;
for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
GridIterator iterator(m_grid, direction, trackIndex);
@@ -1943,12 +1987,11 @@ LayoutGrid::computeEmptyTracksForAutoRepeat(
? styleRef().gridAutoRepeatColumnsInsertionPoint()
: styleRef().gridAutoRepeatRowsInsertionPoint();
size_t firstAutoRepeatTrack =
- insertionPoint +
- std::abs(isRowAxis ? m_smallestColumnStart : m_smallestRowStart);
+ insertionPoint + std::abs(m_grid.smallestTrackStart(direction));
size_t lastAutoRepeatTrack =
firstAutoRepeatTrack + autoRepeatCountForDirection(direction);
- if (m_gridItemArea.isEmpty()) {
+ if (!m_grid.hasInFlowGridItems()) {
emptyTrackIndexes = wrapUnique(new OrderedTrackIndexSet);
for (size_t trackIndex = firstAutoRepeatTrack;
trackIndex < lastAutoRepeatTrack; ++trackIndex)
@@ -1971,7 +2014,7 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
if (!m_gridIsDirty)
return;
- DCHECK(m_gridItemArea.isEmpty());
+ DCHECK(!m_grid.hasInFlowGridItems());
if (sizingOperation == IntrinsicSizeComputation) {
m_autoRepeatColumns = styleRef().gridAutoRepeatColumns().size();
@@ -1988,27 +2031,26 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
Vector<LayoutBox*> autoMajorAxisAutoGridItems;
Vector<LayoutBox*> specifiedMajorAxisAutoGridItems;
- DCHECK(m_gridItemsIndexesMap.isEmpty());
+#if ENABLE(ASSERT)
+ DCHECK(!m_grid.hasAnyGridItemPaintOrder());
+#endif
+ DCHECK(!m_grid.hasAnyOrthogonalChildren());
size_t childIndex = 0;
- m_hasAnyOrthogonalChildren = false;
for (LayoutBox* child = m_orderIterator.first(); child;
child = m_orderIterator.next()) {
if (child->isOutOfFlowPositioned())
continue;
- m_gridItemsIndexesMap.set(child, childIndex++);
-
- m_hasAnyOrthogonalChildren =
- m_hasAnyOrthogonalChildren || isOrthogonalChild(*child);
+ m_grid.setGridItemPaintOrder(*child, childIndex++);
- GridArea area = cachedGridArea(*child);
+ GridArea area = m_grid.gridItemArea(*child);
if (!area.rows.isIndefinite())
- area.rows.translate(abs(m_smallestRowStart));
+ area.rows.translate(abs(m_grid.smallestTrackStart(ForRows)));
if (!area.columns.isIndefinite())
- area.columns.translate(abs(m_smallestColumnStart));
- m_gridItemArea.set(child, area);
+ area.columns.translate(abs(m_grid.smallestTrackStart(ForColumns)));
if (area.rows.isIndefinite() || area.columns.isIndefinite()) {
+ m_grid.setGridItemArea(*child, area);
GridSpan majorAxisPositions =
(autoPlacementMajorAxisDirection() == ForColumns) ? area.columns
: area.rows;
@@ -2018,11 +2060,11 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
specifiedMajorAxisAutoGridItems.append(child);
continue;
}
- m_grid.insert(*child, area);
+ m_grid.insert(*child, area, isOrthogonalChild(*child));
}
#if ENABLE(ASSERT)
- if (!m_gridItemArea.isEmpty()) {
+ if (m_grid.hasInFlowGridItems()) {
DCHECK_GE(gridRowCount(), GridPositionsResolver::explicitGridRowCount(
*style(), m_autoRepeatRows));
DCHECK_GE(gridColumnCount(), GridPositionsResolver::explicitGridColumnCount(
@@ -2045,7 +2087,7 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
if (child->isOutOfFlowPositioned())
continue;
- GridArea area = cachedGridArea(*child);
+ GridArea area = m_grid.gridItemArea(*child);
ASSERT(area.rows.isTranslatedDefinite() &&
area.columns.isTranslatedDefinite());
}
@@ -2054,8 +2096,8 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
void LayoutGrid::populateExplicitGridAndOrderIterator() {
OrderIteratorPopulator populator(m_orderIterator);
-
- m_smallestRowStart = m_smallestColumnStart = 0;
+ int smallestRowStart = 0;
+ int smallestColumnStart = 0;
size_t maximumRowIndex =
GridPositionsResolver::explicitGridRowCount(*style(), m_autoRepeatRows);
@@ -2066,7 +2108,7 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() {
child = child->nextInFlowSiblingBox()) {
populator.collectChild(child);
- // This function bypasses the cache (cachedGridArea()) as it is used to
+ // This function bypasses the cache (gridItemArea()) as it is used to
// build it.
GridSpan rowPositions =
GridPositionsResolver::resolveGridPositionsFromStyle(
@@ -2074,12 +2116,12 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() {
GridSpan columnPositions =
GridPositionsResolver::resolveGridPositionsFromStyle(
*style(), *child, ForColumns, m_autoRepeatColumns);
- m_gridItemArea.set(child, GridArea(rowPositions, columnPositions));
+ m_grid.setGridItemArea(*child, GridArea(rowPositions, columnPositions));
// |positions| is 0 if we need to run the auto-placement algorithm.
if (!rowPositions.isIndefinite()) {
- m_smallestRowStart =
- std::min(m_smallestRowStart, rowPositions.untranslatedStartLine());
+ smallestRowStart =
+ std::min(smallestRowStart, rowPositions.untranslatedStartLine());
maximumRowIndex =
std::max<int>(maximumRowIndex, rowPositions.untranslatedEndLine());
} else {
@@ -2091,8 +2133,8 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() {
}
if (!columnPositions.isIndefinite()) {
- m_smallestColumnStart = std::min(m_smallestColumnStart,
- columnPositions.untranslatedStartLine());
+ smallestColumnStart = std::min(smallestColumnStart,
+ columnPositions.untranslatedStartLine());
maximumColumnIndex = std::max<int>(maximumColumnIndex,
columnPositions.untranslatedEndLine());
} else {
@@ -2104,8 +2146,9 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() {
}
}
- m_grid.ensureGridSize(maximumRowIndex + abs(m_smallestRowStart),
- maximumColumnIndex + abs(m_smallestColumnStart));
+ m_grid.setSmallestTracksStart(smallestRowStart, smallestColumnStart);
+ m_grid.ensureGridSize(maximumRowIndex + abs(smallestRowStart),
+ maximumColumnIndex + abs(smallestColumnStart));
}
std::unique_ptr<GridArea>
@@ -2163,8 +2206,8 @@ void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(
emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(
*autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
- m_gridItemArea.set(autoGridItem, *emptyGridArea);
- m_grid.insert(*autoGridItem, *emptyGridArea);
+ m_grid.insert(*autoGridItem, *emptyGridArea,
+ isOrthogonalChild(*autoGridItem));
if (!isGridAutoFlowDense)
minorAxisCursors.set(majorAxisInitialPosition,
@@ -2271,8 +2314,7 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(
GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize));
}
- m_gridItemArea.set(&gridItem, *emptyGridArea);
- m_grid.insert(gridItem, *emptyGridArea);
+ m_grid.insert(gridItem, *emptyGridArea, isOrthogonalChild(gridItem));
// Move auto-placement cursor to the new position.
autoPlacementCursor.first = emptyGridArea->rows.startLine();
autoPlacementCursor.second = emptyGridArea->columns.startLine();
@@ -2291,9 +2333,7 @@ void LayoutGrid::dirtyGrid() {
return;
m_grid.clear();
- m_gridItemArea.clear();
m_gridItemsOverflowingGridArea.resize(0);
- m_gridItemsIndexesMap.clear();
m_autoRepeatColumns = 0;
m_autoRepeatRows = 0;
m_gridIsDirty = true;
@@ -2445,7 +2485,7 @@ void LayoutGrid::layoutGridItems(GridSizingData& sizingData) {
updateAutoMarginsInColumnAxisIfNeeded(*child);
updateAutoMarginsInRowAxisIfNeeded(*child);
- const GridArea& area = cachedGridArea(*child);
+ const GridArea& area = m_grid.gridItemArea(*child);
#if ENABLE(ASSERT)
ASSERT(area.columns.startLine() < sizingData.columnTracks.size());
ASSERT(area.rows.startLine() < sizingData.rowTracks.size());
@@ -2532,8 +2572,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(
// For positioned items we cannot use GridSpan::translate(). Because we could
// end up with negative values, as the positioned items do not create implicit
// tracks per spec.
- int smallestStart =
- abs(isForColumns ? m_smallestColumnStart : m_smallestRowStart);
+ int smallestStart = abs(m_grid.smallestTrackStart(direction));
int startLine = positions.untranslatedStartLine() + smallestStart;
int endLine = positions.untranslatedEndLine() + smallestStart;
@@ -2615,14 +2654,9 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(
}
}
-GridArea LayoutGrid::cachedGridArea(const LayoutBox& gridItem) const {
- ASSERT(m_gridItemArea.contains(&gridItem));
- return m_gridItemArea.get(&gridItem);
-}
-
GridSpan LayoutGrid::cachedGridSpan(const LayoutBox& gridItem,
GridTrackSizingDirection direction) const {
- GridArea area = cachedGridArea(gridItem);
+ GridArea area = m_grid.gridItemArea(gridItem);
return direction == ForColumns ? area.columns : area.rows;
}
@@ -3003,7 +3037,7 @@ bool LayoutGrid::isInlineBaselineAlignedChild(const LayoutBox* child) const {
}
int LayoutGrid::firstLineBoxBaseline() const {
- if (isWritingModeRoot() || m_gridItemArea.isEmpty())
+ if (isWritingModeRoot() || !m_grid.hasInFlowGridItems())
return -1;
const LayoutBox* baselineChild = nullptr;
const LayoutBox* firstChild = nullptr;
@@ -3024,8 +3058,8 @@ int LayoutGrid::firstLineBoxBaseline() const {
}
if (!baselineChild) {
// Use dom order for items in the same cell.
- if (!firstChild || (m_gridItemsIndexesMap.get(child) <
- m_gridItemsIndexesMap.get(firstChild)))
+ if (!firstChild || (m_grid.gridItemPaintOrder(*child) <
+ m_grid.gridItemPaintOrder(*firstChild)))
firstChild = child;
}
}
@@ -3488,7 +3522,7 @@ LayoutPoint LayoutGrid::gridAreaLogicalPosition(const GridArea& area) const {
void LayoutGrid::paintChildren(const PaintInfo& paintInfo,
const LayoutPoint& paintOffset) const {
- if (!m_gridItemArea.isEmpty())
+ if (m_grid.hasInFlowGridItems())
GridPainter(*this).paintChildren(paintInfo, paintOffset);
}
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698