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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 1424913009: [css-grid] Simplify the interface of GridResolvedPosition (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 1071
1072 // We clear the dirty bit here as the grid sizes have been updated. 1072 // We clear the dirty bit here as the grid sizes have been updated.
1073 m_gridIsDirty = false; 1073 m_gridIsDirty = false;
1074 1074
1075 Vector<LayoutBox*> autoMajorAxisAutoGridItems; 1075 Vector<LayoutBox*> autoMajorAxisAutoGridItems;
1076 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; 1076 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems;
1077 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { 1077 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) {
1078 if (child->isOutOfFlowPositioned()) 1078 if (child->isOutOfFlowPositioned())
1079 continue; 1079 continue;
1080 1080
1081 OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositio nsFromStyle(*style(), *child, ForRows); 1081 auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromSt yle(styleRef(), *child, ForRows);
1082 OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPosi tionsFromStyle(*style(), *child, ForColumns); 1082 auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFro mStyle(styleRef(), *child, ForColumns);
1083 if (!rowPositions || !columnPositions) { 1083
1084 GridSpan* majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? columnPositions.get() : rowPositions.get(); 1084 if (unresolvedRowPositions.requiresAutoPlacement() || unresolvedColumnPo sitions.requiresAutoPlacement()) {
1085 if (!majorAxisPositions) 1085 bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirectio n() == ForColumns;
1086 if ((majorAxisDirectionIsForColumns && unresolvedColumnPositions.req uiresAutoPlacement())
1087 || (!majorAxisDirectionIsForColumns && unresolvedRowPositions.re quiresAutoPlacement()))
1086 autoMajorAxisAutoGridItems.append(child); 1088 autoMajorAxisAutoGridItems.append(child);
1087 else 1089 else
1088 specifiedMajorAxisAutoGridItems.append(child); 1090 specifiedMajorAxisAutoGridItems.append(child);
1089 continue; 1091 continue;
1090 } 1092 }
1091 insertItemIntoGrid(*child, GridCoordinate(*rowPositions, *columnPosition s)); 1093 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt yle(unresolvedRowPositions, styleRef());
1094 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro mStyle(unresolvedColumnPositions, styleRef());
1095 insertItemIntoGrid(*child, GridCoordinate(rowPositions, columnPositions) );
1092 } 1096 }
1093 1097
1094 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style() )); 1098 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style() ));
1095 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s tyle())); 1099 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s tyle()));
1096 1100
1097 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); 1101 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems);
1098 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); 1102 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems);
1099 1103
1100 m_grid.shrinkToFit(); 1104 m_grid.shrinkToFit();
1101 } 1105 }
1102 1106
1103 void LayoutGrid::populateExplicitGridAndOrderIterator() 1107 void LayoutGrid::populateExplicitGridAndOrderIterator()
1104 { 1108 {
1105 OrderIteratorPopulator populator(m_orderIterator); 1109 OrderIteratorPopulator populator(m_orderIterator);
1106 1110
1107 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG ridRowCount(*style())); 1111 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG ridRowCount(*style()));
1108 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic itGridColumnCount(*style())); 1112 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic itGridColumnCount(*style()));
1109 1113
1110 ASSERT(m_gridItemsIndexesMap.isEmpty()); 1114 ASSERT(m_gridItemsIndexesMap.isEmpty());
1111 size_t childIndex = 0; 1115 size_t childIndex = 0;
1112 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) { 1116 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) {
1113 if (child->isOutOfFlowPositioned()) 1117 if (child->isOutOfFlowPositioned())
1114 continue; 1118 continue;
1115 1119
1116 populator.collectChild(child); 1120 populator.collectChild(child);
1117 m_gridItemsIndexesMap.set(child, childIndex++); 1121 m_gridItemsIndexesMap.set(child, childIndex++);
1118 1122
1119 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it. 1123 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it.
1120 OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositio nsFromStyle(*style(), *child, ForRows); 1124 auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromSt yle(styleRef(), *child, ForRows);
1121 OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPosi tionsFromStyle(*style(), *child, ForColumns); 1125 if (!unresolvedRowPositions.requiresAutoPlacement()) {
1122 1126 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFr omStyle(unresolvedRowPositions, styleRef());
1123 // |positions| is 0 if we need to run the auto-placement algorithm. 1127 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFin alPosition.next().toInt());
1124 if (rowPositions) {
1125 maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions->re solvedFinalPosition.next().toInt());
1126 } else { 1128 } else {
1127 // Grow the grid for items with a definite row span, getting the lar gest such span. 1129 // Grow the grid for items with a definite row span, getting the lar gest such span.
1128 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(*style(), *child, ForRows, GridResolvedPosition(0)); 1130 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(styleRef(), *child, ForRows, GridResolvedPosition(0));
1129 maximumRowIndex = std::max<size_t>(maximumRowIndex, positions.resolv edFinalPosition.next().toInt()); 1131 maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalP osition.next().toInt());
1130 } 1132 }
1131 1133
1132 if (columnPositions) { 1134 auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFro mStyle(styleRef(), *child, ForColumns);
1133 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPosi tions->resolvedFinalPosition.next().toInt()); 1135 if (!unresolvedColumnPositions.requiresAutoPlacement()) {
1136 GridSpan columnPositions = GridResolvedPosition::resolveGridPosition sFromStyle(unresolvedColumnPositions, styleRef());
1137 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.re solvedFinalPosition.next().toInt());
1134 } else { 1138 } else {
1135 // Grow the grid for items with a definite column span, getting the largest such span. 1139 // Grow the grid for items with a definite column span, getting the largest such span.
1136 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(*style(), *child, ForColumns, GridResolvedPosition(0)); 1140 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(styleRef(), *child, ForColumns, GridResolvedPosition(0));
1137 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, positions. resolvedFinalPosition.next().toInt()); 1141 maximumColumnIndex = std::max(maximumColumnIndex, positions.resolved FinalPosition.next().toInt());
1138 } 1142 }
1143
1139 } 1144 }
1140 1145
1141 m_grid.grow(maximumRowIndex); 1146 m_grid.grow(maximumRowIndex);
1142 for (auto& column : m_grid) 1147 for (auto& column : m_grid)
1143 column.grow(maximumColumnIndex); 1148 column.grow(maximumColumnIndex);
1144 } 1149 }
1145 1150
1146 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const 1151 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const
1147 { 1152 {
1148 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; 1153 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns;
1149 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount(); 1154 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount();
1150 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPosition sFromAutoPlacementPosition(*style(), gridItem, crossDirection, GridResolvedPosit ion(endOfCrossDirection)); 1155 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPosition sFromAutoPlacementPosition(*style(), gridItem, crossDirection, GridResolvedPosit ion(endOfCrossDirection));
1151 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions)); 1156 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions));
1152 } 1157 }
1153 1158
1154 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au toGridItems) 1159 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au toGridItems)
1155 { 1160 {
1156 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; 1161 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns;
1157 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); 1162 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense();
1158 1163
1159 // Mapping between the major axis tracks (rows or columns) and the last auto -placed item's position inserted on 1164 // Mapping between the major axis tracks (rows or columns) and the last auto -placed item's position inserted on
1160 // that track. This is needed to implement "sparse" packing for items locked to a given track. 1165 // that track. This is needed to implement "sparse" packing for items locked to a given track.
1161 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo 1166 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo
1162 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors; 1167 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors;
1163 1168
1164 for (const auto& autoGridItem : autoGridItems) { 1169 for (const auto& autoGridItem : autoGridItems) {
1165 OwnPtr<GridSpan> majorAxisPositions = GridResolvedPosition::resolveGridP ositionsFromStyle(*style(), *autoGridItem, autoPlacementMajorAxisDirection()); 1170 auto unresolvedMajorAxisPositions = GridResolvedPosition::unresolvedSpan FromStyle(styleRef(), *autoGridItem, autoPlacementMajorAxisDirection());
1171 ASSERT(!unresolvedMajorAxisPositions.requiresAutoPlacement());
1172 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositions FromStyle(unresolvedMajorAxisPositions, styleRef());
1166 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirecti on(), GridResolvedPosition(0)); 1173 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirecti on(), GridResolvedPosition(0));
1167 unsigned majorAxisInitialPosition = majorAxisPositions->resolvedInitialP osition.toInt(); 1174 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo sition.toInt();
1168 1175
1169 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx isPositions->resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxi sCursors.get(majorAxisInitialPosition)); 1176 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx isPositions.resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxis Cursors.get(majorAxisInitialPosition));
1170 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA xisPositions->integerSpan(), minorAxisPositions.integerSpan()); 1177 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA xisPositions.integerSpan(), minorAxisPositions.integerSpan());
1171 if (!emptyGridArea) 1178 if (!emptyGridArea)
1172 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), *majorAxisPositions); 1179 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
1173 insertItemIntoGrid(*autoGridItem, *emptyGridArea); 1180 insertItemIntoGrid(*autoGridItem, *emptyGridArea);
1174 1181
1175 if (!isGridAutoFlowDense) 1182 if (!isGridAutoFlowDense)
1176 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.resolvedInitialPosition.toInt() : emptyGridArea->columns.resolvedI nitialPosition.toInt()); 1183 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.resolvedInitialPosition.toInt() : emptyGridArea->columns.resolvedI nitialPosition.toInt());
1177 } 1184 }
1178 } 1185 }
1179 1186
1180 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri dItems) 1187 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri dItems)
1181 { 1188 {
1182 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); 1189 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0);
1183 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); 1190 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense();
1184 1191
1185 for (const auto& autoGridItem : autoGridItems) { 1192 for (const auto& autoGridItem : autoGridItems) {
1186 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); 1193 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor);
1187 1194
1188 // If grid-auto-flow is dense, reset auto-placement cursor. 1195 // If grid-auto-flow is dense, reset auto-placement cursor.
1189 if (isGridAutoFlowDense) { 1196 if (isGridAutoFlowDense) {
1190 autoPlacementCursor.first = 0; 1197 autoPlacementCursor.first = 0;
1191 autoPlacementCursor.second = 0; 1198 autoPlacementCursor.second = 0;
1192 } 1199 }
1193 } 1200 }
1194 } 1201 }
1195 1202
1196 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz e_t, size_t>& autoPlacementCursor) 1203 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz e_t, size_t>& autoPlacementCursor)
1197 { 1204 {
1198 OwnPtr<GridSpan> minorAxisPositions = GridResolvedPosition::resolveGridPosit ionsFromStyle(*style(), gridItem, autoPlacementMinorAxisDirection()); 1205 ASSERT(GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), gridItem, a utoPlacementMajorAxisDirection()).requiresAutoPlacement());
1199 ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), gridIt em, autoPlacementMajorAxisDirection())); 1206 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom AutoPlacementPosition(styleRef(), gridItem, autoPlacementMajorAxisDirection(), G ridResolvedPosition(0));
1200 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom AutoPlacementPosition(*style(), gridItem, autoPlacementMajorAxisDirection(), Gri dResolvedPosition(0));
1201 1207
1202 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount(); 1208 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount();
1203 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; 1209 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first;
1204 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; 1210 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second;
1205 1211
1206 OwnPtr<GridCoordinate> emptyGridArea; 1212 OwnPtr<GridCoordinate> emptyGridArea;
1207 if (minorAxisPositions) { 1213 auto unresolvedMinorAxisPositions = GridResolvedPosition::unresolvedSpanFrom Style(styleRef(), gridItem, autoPlacementMinorAxisDirection());
1214 if (!unresolvedMinorAxisPositions.requiresAutoPlacement()) {
1215 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromStyle(unresolvedMinorAxisPositions, styleRef());
1216
1208 // Move to the next track in major axis if initial position in minor axi s is before auto-placement cursor. 1217 // Move to the next track in major axis if initial position in minor axi s is before auto-placement cursor.
1209 if (minorAxisPositions->resolvedInitialPosition.toInt() < minorAxisAutoP lacementCursor) 1218 if (minorAxisPositions.resolvedInitialPosition.toInt() < minorAxisAutoPl acementCursor)
1210 majorAxisAutoPlacementCursor++; 1219 majorAxisAutoPlacementCursor++;
1211 1220
1212 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { 1221 if (majorAxisAutoPlacementCursor < endOfMajorAxis) {
1213 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions->resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor); 1222 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions.resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor);
1214 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integ erSpan(), majorAxisPositions.integerSpan()); 1223 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege rSpan(), majorAxisPositions.integerSpan());
1215 } 1224 }
1216 1225
1217 if (!emptyGridArea) 1226 if (!emptyGridArea)
1218 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions); 1227 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions);
1219 } else { 1228 } else {
1220 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), gridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0)); 1229 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), gridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0));
1221 1230
1222 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde x < endOfMajorAxis; ++majorAxisIndex) { 1231 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde x < endOfMajorAxis; ++majorAxisIndex) {
1223 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj orAxisIndex, minorAxisAutoPlacementCursor); 1232 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj orAxisIndex, minorAxisAutoPlacementCursor);
1224 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege rSpan(), minorAxisPositions.integerSpan()); 1233 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege rSpan(), minorAxisPositions.integerSpan());
1225 1234
1226 if (emptyGridArea) { 1235 if (emptyGridArea) {
1227 // Check that it fits in the minor axis direction, as we shouldn 't grow in that direction here (it was already managed in populateExplicitGridAn dOrderIterator()). 1236 // Check that it fits in the minor axis direction, as we shouldn 't grow in that direction here (it was already managed in populateExplicitGridAn dOrderIterator()).
1228 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio n : emptyGridArea->rows.resolvedFinalPosition; 1237 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio n : emptyGridArea->rows.resolvedFinalPosition;
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1429 child->setExtraBlockOffset(rowOffset); 1438 child->setExtraBlockOffset(rowOffset);
1430 } 1439 }
1431 1440
1432 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); 1441 LayoutBlock::layoutPositionedObjects(relayoutChildren, info);
1433 } 1442 }
1434 1443
1435 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) 1444 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth)
1436 { 1445 {
1437 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); 1446 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode());
1438 1447
1439 OwnPtr<GridSpan> positions = GridResolvedPosition::resolveGridPositionsFromS tyle(*style(), child, direction); 1448 auto unresolvedPositions = GridResolvedPosition::unresolvedSpanFromStyle(sty leRef(), child, direction);
1440 if (!positions) { 1449 if (unresolvedPositions.requiresAutoPlacement()) {
1441 offset = LayoutUnit(); 1450 offset = LayoutUnit(0);
Manuel Rego 2015/11/10 09:08:03 Why LayoutUnit(0)? We're using LayoutUnit() all ov
svillar 2015/11/10 10:56:37 Yeah LayoutUnit() is more efficient, I thought it
1442 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic alHeight(); 1451 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic alHeight();
1443 return; 1452 return;
1444 } 1453 }
1445 1454
1446 GridPosition startPosition = (direction == ForColumns) ? child.style()->grid ColumnStart() : child.style()->gridRowStart(); 1455 bool isForColumns = direction == ForColumns;
1447 GridPosition endPosition = (direction == ForColumns) ? child.style()->gridCo lumnEnd() : child.style()->gridRowEnd(); 1456 GridPosition startPosition = isForColumns ? child.style()->gridColumnStart() : child.style()->gridRowStart();
1448 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridR owCount()) - 1; 1457 GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : c hild.style()->gridRowEnd();
1458 size_t lastTrackIndex = (isForColumns ? gridColumnCount() : gridRowCount()) - 1;
1449 1459
1460 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(unr esolvedPositions, styleRef());
1450 bool startIsAuto = startPosition.isAuto() 1461 bool startIsAuto = startPosition.isAuto()
1451 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in itialPositionSide(direction))) 1462 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam edLineOrArea(startPosition.namedGridLine(), styleRef(), isForColumns ? ColumnSta rtSide : RowStartSide))
1452 || (positions->resolvedInitialPosition.toInt() > lastTrackIndex); 1463 || (positions.resolvedInitialPosition.toInt() > lastTrackIndex);
1453 bool endIsAuto = endPosition.isAuto() 1464 bool endIsAuto = endPosition.isAuto()
1454 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP ositionSide(direction))) 1465 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed LineOrArea(endPosition.namedGridLine(), styleRef(), isForColumns ? ColumnEndSide : RowEndSide))
1455 || (positions->resolvedFinalPosition.toInt() > lastTrackIndex); 1466 || (positions.resolvedFinalPosition.toInt() > lastTrackIndex);
1456 1467
1457 GridResolvedPosition firstPosition = GridResolvedPosition(0); 1468 GridResolvedPosition firstPosition = GridResolvedPosition(0);
1458 GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positio ns->resolvedInitialPosition; 1469 GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positio ns.resolvedInitialPosition;
1459 GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex); 1470 GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex);
1460 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions->r esolvedFinalPosition; 1471 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.re solvedFinalPosition;
1461 1472
1462 // Positioned children do not grow the grid, so we need to clamp the positio ns to avoid ending up outside of it. 1473 // Positioned children do not grow the grid, so we need to clamp the positio ns to avoid ending up outside of it.
1463 initialPosition = std::min<GridResolvedPosition>(initialPosition, lastPositi on); 1474 initialPosition = std::min<GridResolvedPosition>(initialPosition, lastPositi on);
1464 finalPosition = std::min<GridResolvedPosition>(finalPosition, lastPosition); 1475 finalPosition = std::min<GridResolvedPosition>(finalPosition, lastPosition);
1465 1476
1466 LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ? m_columnPositions[initialPosition.toInt()] : m_rowPositions[initialPosition.toI nt()]; 1477 LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ? m_columnPositions[initialPosition.toInt()] : m_rowPositions[initialPosition.toI nt()];
Manuel Rego 2015/11/10 09:08:03 Now that we've isForColumns we can keep using it h
svillar 2015/11/10 10:56:37 Acknowledged.
1467 LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : lo gicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition.nex t().toInt()] : m_rowPositions[finalPosition.next().toInt()]; 1478 LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : lo gicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition.nex t().toInt()] : m_rowPositions[finalPosition.next().toInt()];
1468 1479
1469 breadth = end - start; 1480 breadth = end - start;
1470 1481
1471 if (startIsAuto) 1482 if (startIsAuto)
1472 breadth -= (direction == ForColumns) ? borderStart() : borderBefore(); 1483 breadth -= (direction == ForColumns) ? borderStart() : borderBefore();
1473 else 1484 else
1474 start -= ((direction == ForColumns) ? borderStart() : borderBefore()); 1485 start -= ((direction == ForColumns) ? borderStart() : borderBefore());
1475 1486
1476 if (endIsAuto) { 1487 if (endIsAuto) {
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after
2014 2025
2015 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); 2026 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child));
2016 } 2027 }
2017 2028
2018 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2029 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
2019 { 2030 {
2020 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2031 GridPainter(*this).paintChildren(paintInfo, paintOffset);
2021 } 2032 }
2022 2033
2023 } // namespace blink 2034 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698