Changeset 196691 in webkit
- Timestamp:
- Feb 17, 2016 3:45:30 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r196690 r196691 1 2016-02-17 Manuel Rego Casasnovas <rego@igalia.com> 2 3 [css-grid] GridSpan refactoring 4 https://bugs.webkit.org/show_bug.cgi?id=153868 5 6 Reviewed by Sergio Villar Senin. 7 8 Add new enum to know if a GridSpan is definite or indefinite. 9 That way we don't need GridUnresolvedSpan class (which is removed). 10 We can always have two GridSpans in GridCoordinate, 11 if the position is "auto" the GridSpan will be marked as indefinite. 12 This will allow in a follow-up patch to avoid repeated calls 13 to methods that resolve positions. 14 15 Most operations in GridSpan are restricted to definite GridSpans (access 16 to positions, iterator, etc.). For indefinite GridSpans we only need to 17 know that they're indefinite, we shouldn't use the rest of the data. 18 19 No new tests, no change of behavior. 20 21 * css/CSSGridTemplateAreasValue.cpp: 22 (WebCore::stringForPosition): 23 * css/CSSParser.cpp: 24 (WebCore::CSSParser::parseGridTemplateAreasRow): 25 * css/StyleBuilderConverter.h: 26 (WebCore::StyleBuilderConverter::createImplicitNamedGridLinesFromGridArea): 27 * rendering/RenderGrid.cpp: 28 (WebCore::RenderGrid::GridIterator::nextEmptyGridArea): 29 (WebCore::RenderGrid::computeUsedBreadthOfGridTracks): 30 (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems): 31 (WebCore::RenderGrid::insertItemIntoGrid): 32 (WebCore::RenderGrid::placeItemsOnGrid): 33 (WebCore::RenderGrid::populateExplicitGridAndOrderIterator): 34 (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid): 35 (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid): 36 (WebCore::RenderGrid::offsetAndBreadthForPositionedChild): 37 (WebCore::RenderGrid::gridAreaBreadthForChildIncludingAlignmentOffsets): 38 (WebCore::RenderGrid::columnAxisOffsetForChild): 39 (WebCore::RenderGrid::rowAxisOffsetForChild): 40 (WebCore::RenderGrid::placeAutoMajorAxisItemsOnGrid): Deleted. 41 (WebCore::RenderGrid::autoPlacementMinorAxisDirection): Deleted. 42 (WebCore::RenderGrid::populateGridPositions): Deleted. 43 * rendering/style/GridCoordinate.h: 44 (WebCore::GridSpan::definiteGridSpan): 45 (WebCore::GridSpan::indefiniteGridSpan): 46 (WebCore::GridSpan::operator==): 47 (WebCore::GridSpan::integerSpan): 48 (WebCore::GridSpan::resolvedInitialPosition): 49 (WebCore::GridSpan::resolvedFinalPosition): 50 (WebCore::GridSpan::begin): 51 (WebCore::GridSpan::end): 52 (WebCore::GridSpan::isDefinite): 53 (WebCore::GridSpan::GridSpan): 54 (WebCore::GridCoordinate::GridCoordinate): 55 * rendering/style/GridResolvedPosition.cpp: 56 (WebCore::initialPositionSide): 57 (WebCore::finalPositionSide): 58 (WebCore::adjustGridPositionsFromStyle): 59 (WebCore::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition): 60 (WebCore::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition): 61 (WebCore::resolveNamedGridLinePositionAgainstOppositePosition): 62 (WebCore::resolveGridPositionAgainstOppositePosition): 63 (WebCore::GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition): 64 (WebCore::GridResolvedPosition::resolveGridPositionsFromStyle): 65 (WebCore::implicitNamedGridLineForSide): Deleted. 66 (WebCore::GridResolvedPosition::isNonExistentNamedLineOrArea): Deleted. 67 (WebCore::resolveNamedGridLinePositionFromStyle): Deleted. 68 (WebCore::resolveGridPositionFromStyle): Deleted. 69 * rendering/style/GridResolvedPosition.h: 70 (WebCore::GridResolvedPosition::GridResolvedPosition): Deleted. 71 (WebCore::GridResolvedPosition::operator*): Deleted. 72 (WebCore::GridResolvedPosition::operator++): Deleted. 73 (WebCore::GridResolvedPosition::operator==): Deleted. 74 1 75 2016-02-17 Chris Dumez <cdumez@apple.com> 2 76 -
trunk/Source/WebCore/css/CSSGridTemplateAreasValue.cpp
r195808 r196691 56 56 for (const auto& it : gridAreaMap) { 57 57 const GridCoordinate& coordinate = it.value; 58 if (row >= coordinate.rows.resolvedInitialPosition .toInt() && row < coordinate.rows.resolvedFinalPosition.toInt())58 if (row >= coordinate.rows.resolvedInitialPosition().toInt() && row < coordinate.rows.resolvedFinalPosition().toInt()) 59 59 candidates.append(it.key); 60 60 } … … 62 62 for (const auto& it : gridAreaMap) { 63 63 const GridCoordinate& coordinate = it.value; 64 if (column >= coordinate.columns.resolvedInitialPosition .toInt() && column < coordinate.columns.resolvedFinalPosition.toInt() && candidates.contains(it.key))64 if (column >= coordinate.columns.resolvedInitialPosition().toInt() && column < coordinate.columns.resolvedFinalPosition().toInt() && candidates.contains(it.key)) 65 65 return it.key; 66 66 } -
trunk/Source/WebCore/css/CSSParser.cpp
r196075 r196691 6218 6218 auto gridAreaIterator = gridAreaMap.find(gridAreaName); 6219 6219 if (gridAreaIterator == gridAreaMap.end()) 6220 gridAreaMap.add(gridAreaName, GridCoordinate(GridSpan (rowCount, rowCount + 1),GridSpan(currentColumn, lookAheadColumn)));6220 gridAreaMap.add(gridAreaName, GridCoordinate(GridSpan::definiteGridSpan(rowCount, rowCount + 1), GridSpan::definiteGridSpan(currentColumn, lookAheadColumn))); 6221 6221 else { 6222 6222 GridCoordinate& gridCoordinate = gridAreaIterator->value; … … 6224 6224 // The following checks test that the grid area is a single filled-in rectangle. 6225 6225 // 1. The new row is adjacent to the previously parsed row. 6226 if (rowCount != gridCoordinate.rows.resolvedFinalPosition .toInt())6226 if (rowCount != gridCoordinate.rows.resolvedFinalPosition().toInt()) 6227 6227 return false; 6228 6228 6229 6229 // 2. The new area starts at the same position as the previously parsed area. 6230 if (currentColumn != gridCoordinate.columns.resolvedInitialPosition .toInt())6230 if (currentColumn != gridCoordinate.columns.resolvedInitialPosition().toInt()) 6231 6231 return false; 6232 6232 6233 6233 // 3. The new area ends at the same position as the previously parsed area. 6234 if (lookAheadColumn != gridCoordinate.columns.resolvedFinalPosition .toInt())6234 if (lookAheadColumn != gridCoordinate.columns.resolvedFinalPosition().toInt()) 6235 6235 return false; 6236 6236 6237 ++gridCoordinate.rows.resolvedFinalPosition;6237 gridCoordinate.rows = GridSpan::definiteGridSpan(gridCoordinate.rows.resolvedInitialPosition(), gridCoordinate.rows.resolvedFinalPosition().next()); 6238 6238 } 6239 6239 currentColumn = lookAheadColumn - 1; -
trunk/Source/WebCore/css/StyleBuilderConverter.h
r196075 r196691 887 887 { 888 888 auto& startVector = namedGridLines.add(area.key + "-start", Vector<unsigned>()).iterator->value; 889 startVector.append(areaSpan.resolvedInitialPosition .toInt());889 startVector.append(areaSpan.resolvedInitialPosition().toInt()); 890 890 std::sort(startVector.begin(), startVector.end()); 891 891 } 892 892 { 893 893 auto& endVector = namedGridLines.add(area.key + "-end", Vector<unsigned>()).iterator->value; 894 endVector.append(areaSpan.resolvedFinalPosition .toInt());894 endVector.append(areaSpan.resolvedFinalPosition().toInt()); 895 895 std::sort(endVector.begin(), endVector.end()); 896 896 } -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r195808 r196691 191 191 for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex) { 192 192 if (isEmptyAreaEnough(rowSpan, columnSpan)) { 193 std::unique_ptr<GridCoordinate> result = std::make_unique<GridCoordinate>(GridSpan (m_rowIndex, m_rowIndex + rowSpan),GridSpan(m_columnIndex, m_columnIndex + columnSpan));193 std::unique_ptr<GridCoordinate> result = std::make_unique<GridCoordinate>(GridSpan::definiteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::definiteGridSpan(m_columnIndex, m_columnIndex + columnSpan)); 194 194 // Advance the iterator to avoid an infinite loop where we would return the same grid area over and over. 195 195 ++varyingTrackIndex; … … 567 567 double flexFraction = 0; 568 568 if (hasDefiniteFreeSpace) 569 flexFraction = findFlexFactorUnitSize(tracks, GridSpan (0, tracks.size()), direction, initialFreeSpace.value());569 flexFraction = findFlexFactorUnitSize(tracks, GridSpan::definiteGridSpan(0, tracks.size()), direction, initialFreeSpace.value()); 570 570 else { 571 571 for (const auto& trackIndex : flexibleSizedTracksIndex) … … 578 578 579 579 // Do not include already processed items. 580 if (i > 0 && span.resolvedInitialPosition .toInt() <= flexibleSizedTracksIndex[i - 1])580 if (i > 0 && span.resolvedInitialPosition().toInt() <= flexibleSizedTracksIndex[i - 1]) 581 581 continue; 582 582 … … 866 866 void RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection direction, const GridSpan& span, RenderBox& gridItem, GridTrack& track, Vector<GridTrack>& columnTracks) 867 867 { 868 const GridResolvedPosition trackPosition = span.resolvedInitialPosition ;868 const GridResolvedPosition trackPosition = span.resolvedInitialPosition(); 869 869 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); 870 870 … … 1139 1139 void RenderGrid::insertItemIntoGrid(RenderBox& child, const GridCoordinate& coordinate) 1140 1140 { 1141 ensureGridSize(coordinate.rows.resolvedFinalPosition .toInt(), coordinate.columns.resolvedFinalPosition.toInt());1141 ensureGridSize(coordinate.rows.resolvedFinalPosition().toInt(), coordinate.columns.resolvedFinalPosition().toInt()); 1142 1142 1143 1143 for (auto& row : coordinate.rows) { … … 1161 1161 continue; 1162 1162 1163 auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromStyle(style(), *child, ForRows); 1164 auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFromStyle(style(), *child, ForColumns); 1165 1166 if (unresolvedRowPositions.requiresAutoPlacement() || unresolvedColumnPositions.requiresAutoPlacement()) { 1167 1163 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForRows); 1164 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForColumns); 1165 1166 if (!rowPositions.isDefinite() || !columnPositions.isDefinite()) { 1168 1167 bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirection() == ForColumns; 1169 if ((majorAxisDirectionIsForColumns && unresolvedColumnPositions.requiresAutoPlacement())1170 || (!majorAxisDirectionIsForColumns && unresolvedRowPositions.requiresAutoPlacement()))1168 if ((majorAxisDirectionIsForColumns && !columnPositions.isDefinite()) 1169 || (!majorAxisDirectionIsForColumns && !rowPositions.isDefinite())) 1171 1170 autoMajorAxisAutoGridItems.append(child); 1172 1171 else … … 1174 1173 continue; 1175 1174 } 1176 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedRowPositions, style());1177 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedColumnPositions, style());1178 1175 insertItemIntoGrid(*child, GridCoordinate(rowPositions, columnPositions)); 1179 1176 } … … 1198 1195 populator.collectChild(*child); 1199 1196 1200 auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromStyle(style(), *child, ForRows); 1201 if (!unresolvedRowPositions.requiresAutoPlacement()) { 1202 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedRowPositions, style()); 1203 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFinalPosition.toInt()); 1197 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForRows); 1198 if (rowPositions.isDefinite()) { 1199 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFinalPosition().toInt()); 1204 1200 } else { 1205 1201 // Grow the grid for items with a definite row span, getting the largest such span. 1206 1202 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *child, ForRows, GridResolvedPosition(0)); 1207 maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalPosition.toInt()); 1208 } 1209 1210 auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFromStyle(style(), *child, ForColumns); 1211 if (!unresolvedColumnPositions.requiresAutoPlacement()) { 1212 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedColumnPositions, style()); 1213 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.resolvedFinalPosition.toInt()); 1203 maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalPosition().toInt()); 1204 } 1205 1206 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForColumns); 1207 if (columnPositions.isDefinite()) { 1208 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.resolvedFinalPosition().toInt()); 1214 1209 } else { 1215 1210 // Grow the grid for items with a definite column span, getting the largest such span. 1216 1211 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *child, ForColumns, GridResolvedPosition(0)); 1217 maximumColumnIndex = std::max(maximumColumnIndex, positions.resolvedFinalPosition .toInt());1212 maximumColumnIndex = std::max(maximumColumnIndex, positions.resolvedFinalPosition().toInt()); 1218 1213 } 1219 1214 } … … 1243 1238 1244 1239 for (auto& autoGridItem : autoGridItems) { 1245 auto unresolvedMajorAxisPositions = GridResolvedPosition::unresolvedSpanFromStyle(style(), *autoGridItem, autoPlacementMajorAxisDirection()); 1246 ASSERT(!unresolvedMajorAxisPositions.requiresAutoPlacement()); 1247 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedMajorAxisPositions, style()); 1240 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *autoGridItem, autoPlacementMajorAxisDirection()); 1241 ASSERT(majorAxisPositions.isDefinite()); 1248 1242 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *autoGridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0)); 1249 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition .toInt();1250 1251 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions.resolvedInitialPosition .toInt(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition));1243 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition().toInt(); 1244 1245 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions.resolvedInitialPosition().toInt(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition)); 1252 1246 std::unique_ptr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.integerSpan(), minorAxisPositions.integerSpan()); 1253 1247 if (!emptyGridArea) … … 1256 1250 1257 1251 if (!isGridAutoFlowDense) 1258 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyGridArea->rows.resolvedInitialPosition .toInt() : emptyGridArea->columns.resolvedInitialPosition.toInt());1252 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyGridArea->rows.resolvedInitialPosition().toInt() : emptyGridArea->columns.resolvedInitialPosition().toInt()); 1259 1253 } 1260 1254 } … … 1277 1271 void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox& gridItem, AutoPlacementCursor& autoPlacementCursor) 1278 1272 { 1279 ASSERT( GridResolvedPosition::unresolvedSpanFromStyle(style(), gridItem, autoPlacementMajorAxisDirection()).requiresAutoPlacement());1273 ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(style(), gridItem, autoPlacementMajorAxisDirection()).isDefinite()); 1280 1274 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), gridItem, autoPlacementMajorAxisDirection(), GridResolvedPosition(0)); 1281 1275 … … 1285 1279 1286 1280 std::unique_ptr<GridCoordinate> emptyGridArea; 1287 auto unresolvedMinorAxisPositions = GridResolvedPosition::unresolvedSpanFromStyle(style(), gridItem, autoPlacementMinorAxisDirection()); 1288 if (!unresolvedMinorAxisPositions.requiresAutoPlacement()) { 1289 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedMinorAxisPositions, style()); 1290 1281 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), gridItem, autoPlacementMinorAxisDirection()); 1282 if (minorAxisPositions.isDefinite()) { 1291 1283 // Move to the next track in major axis if initial position in minor axis is before auto-placement cursor. 1292 if (minorAxisPositions.resolvedInitialPosition .toInt() < minorAxisAutoPlacementCursor)1284 if (minorAxisPositions.resolvedInitialPosition().toInt() < minorAxisAutoPlacementCursor) 1293 1285 majorAxisAutoPlacementCursor++; 1294 1286 1295 1287 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { 1296 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions.resolvedInitialPosition .toInt(), majorAxisAutoPlacementCursor);1288 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions.resolvedInitialPosition().toInt(), majorAxisAutoPlacementCursor); 1297 1289 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.integerSpan(), majorAxisPositions.integerSpan()); 1298 1290 } … … 1309 1301 if (emptyGridArea) { 1310 1302 // Check that it fits in the minor axis direction, as we shouldn't grow in that direction here (it was already managed in populateExplicitGridAndOrderIterator()). 1311 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacementMinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition : emptyGridArea->rows.resolvedFinalPosition;1303 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacementMinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGridArea->rows.resolvedFinalPosition(); 1312 1304 const unsigned endOfMinorAxis = autoPlacementMinorAxisDirection() == ForColumns ? gridColumnCount() : gridRowCount(); 1313 1305 if (minorAxisFinalPositionIndex.toInt() <= endOfMinorAxis) … … 1328 1320 1329 1321 insertItemIntoGrid(gridItem, *emptyGridArea); 1330 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition .toInt();1331 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition .toInt();1322 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition().toInt(); 1323 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition().toInt(); 1332 1324 } 1333 1325 … … 1461 1453 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); 1462 1454 1463 auto unresolvedPositions = GridResolvedPosition::unresolvedSpanFromStyle(style(), child, direction);1464 if ( unresolvedPositions.requiresAutoPlacement()) {1455 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), child, direction); 1456 if (!positions.isDefinite()) { 1465 1457 offset = LayoutUnit(); 1466 1458 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogicalHeight(); … … 1472 1464 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridRowCount()) - 1; 1473 1465 1474 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedPositions, style());1475 1466 bool startIsAuto = startPosition.isAuto() 1476 1467 || (startPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(startPosition.namedGridLine(), style(), (direction == ForColumns) ? ColumnStartSide : RowStartSide)) 1477 || (positions.resolvedInitialPosition .toInt() > lastTrackIndex);1468 || (positions.resolvedInitialPosition().toInt() > lastTrackIndex); 1478 1469 bool endIsAuto = endPosition.isAuto() 1479 1470 || (endPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(endPosition.namedGridLine(), style(), (direction == ForColumns) ? ColumnEndSide : RowEndSide)) 1480 || (positions.resolvedFinalPosition .prev().toInt() > lastTrackIndex);1471 || (positions.resolvedFinalPosition().prev().toInt() > lastTrackIndex); 1481 1472 1482 1473 GridResolvedPosition firstPosition = GridResolvedPosition(0); 1483 GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition ;1474 GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition(); 1484 1475 GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex); 1485 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition .prev();1476 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition().prev(); 1486 1477 1487 1478 // Positioned children do not grow the grid, so we need to clamp the positions to avoid ending up outside of it. … … 1543 1534 const auto& linePositions = (direction == ForColumns) ? m_columnPositions : m_rowPositions; 1544 1535 1545 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition .toInt()];1546 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition .prev().toInt()];1536 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition().toInt()]; 1537 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition().prev().toInt()]; 1547 1538 1548 1539 // Track Positions vector stores the 'start' grid line of each track, so we have to add last track's baseSize. 1549 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinalPosition .prev().toInt()].baseSize();1540 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinalPosition().prev().toInt()].baseSize(); 1550 1541 } 1551 1542 … … 1826 1817 { 1827 1818 const GridSpan& rowsSpan = cachedGridSpan(child, ForRows); 1828 unsigned childStartLine = rowsSpan.resolvedInitialPosition .toInt();1819 unsigned childStartLine = rowsSpan.resolvedInitialPosition().toInt(); 1829 1820 LayoutUnit startOfRow = m_rowPositions[childStartLine]; 1830 1821 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); … … 1837 1828 case GridAxisEnd: 1838 1829 case GridAxisCenter: { 1839 unsigned childEndLine = rowsSpan.resolvedFinalPosition .toInt();1830 unsigned childEndLine = rowsSpan.resolvedFinalPosition().toInt(); 1840 1831 LayoutUnit endOfRow = m_rowPositions[childEndLine]; 1841 1832 // m_rowPositions include gutters so we need to substract them to get the actual end position for a given … … 1860 1851 { 1861 1852 const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns); 1862 unsigned childStartLine = columnsSpan.resolvedInitialPosition .toInt();1853 unsigned childStartLine = columnsSpan.resolvedInitialPosition().toInt(); 1863 1854 LayoutUnit startOfColumn = m_columnPositions[childStartLine]; 1864 1855 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); … … 1871 1862 case GridAxisEnd: 1872 1863 case GridAxisCenter: { 1873 unsigned childEndLine = columnsSpan.resolvedFinalPosition .toInt();1864 unsigned childEndLine = columnsSpan.resolvedFinalPosition().toInt(); 1874 1865 LayoutUnit endOfColumn = m_columnPositions[childEndLine]; 1875 1866 // m_columnPositions include gutters so we need to substract them to get the actual end position for a given -
trunk/Source/WebCore/rendering/style/GridCoordinate.h
r195808 r196691 49 49 class GridSpan { 50 50 public: 51 GridSpan(const GridResolvedPosition& resolvedInitialPosition, const GridResolvedPosition& resolvedFinalPosition) 52 : resolvedInitialPosition(std::min(resolvedInitialPosition.toInt(), kGridMaxTracks - 1)) 53 , resolvedFinalPosition(std::min(resolvedFinalPosition.toInt(), kGridMaxTracks)) 51 52 static GridSpan definiteGridSpan(const GridResolvedPosition& resolvedInitialPosition, const GridResolvedPosition& resolvedFinalPosition) 54 53 { 55 ASSERT(resolvedInitialPosition < resolvedFinalPosition); 54 return GridSpan(resolvedInitialPosition, resolvedFinalPosition, Definite); 55 } 56 57 static GridSpan indefiniteGridSpan() 58 { 59 return GridSpan(0, 1, Indefinite); 56 60 } 57 61 58 62 bool operator==(const GridSpan& o) const 59 63 { 60 return resolvedInitialPosition == o.resolvedInitialPosition && resolvedFinalPosition == o.resolvedFinalPosition;64 return m_type == o.m_type && m_resolvedInitialPosition == o.m_resolvedInitialPosition && m_resolvedFinalPosition == o.m_resolvedFinalPosition; 61 65 } 62 66 63 67 unsigned integerSpan() const 64 68 { 65 return resolvedFinalPosition.toInt() - resolvedInitialPosition.toInt(); 69 ASSERT(isDefinite()); 70 return m_resolvedFinalPosition.toInt() - m_resolvedInitialPosition.toInt(); 66 71 } 67 72 68 GridResolvedPosition resolvedInitialPosition; 69 GridResolvedPosition resolvedFinalPosition; 73 const GridResolvedPosition& resolvedInitialPosition() const 74 { 75 ASSERT(isDefinite()); 76 return m_resolvedInitialPosition; 77 } 78 79 const GridResolvedPosition& resolvedFinalPosition() const 80 { 81 ASSERT(isDefinite()); 82 return m_resolvedFinalPosition; 83 } 70 84 71 85 typedef GridResolvedPosition iterator; … … 73 87 iterator begin() const 74 88 { 75 return resolvedInitialPosition; 89 ASSERT(isDefinite()); 90 return m_resolvedInitialPosition; 76 91 } 77 92 78 93 iterator end() const 79 94 { 80 return resolvedFinalPosition; 95 ASSERT(isDefinite()); 96 return m_resolvedFinalPosition; 81 97 } 98 99 bool isDefinite() const 100 { 101 return m_type == Definite; 102 } 103 104 private: 105 106 enum GridSpanType {Definite, Indefinite}; 107 108 GridSpan(const GridResolvedPosition& resolvedInitialPosition, const GridResolvedPosition& resolvedFinalPosition, GridSpanType type) 109 : m_resolvedInitialPosition(std::min(resolvedInitialPosition.toInt(), kGridMaxTracks - 1)) 110 , m_resolvedFinalPosition(std::min(resolvedFinalPosition.toInt(), kGridMaxTracks)) 111 , m_type(type) 112 { 113 ASSERT(resolvedInitialPosition < resolvedFinalPosition); 114 } 115 116 GridResolvedPosition m_resolvedInitialPosition; 117 GridResolvedPosition m_resolvedFinalPosition; 118 GridSpanType m_type; 119 120 82 121 }; 83 122 … … 87 126 // HashMap requires a default constuctor. 88 127 GridCoordinate() 89 : columns( 0, 1)90 , rows( 0, 1)128 : columns(GridSpan::indefiniteGridSpan()) 129 , rows(GridSpan::indefiniteGridSpan()) 91 130 { 92 131 } -
trunk/Source/WebCore/rendering/style/GridResolvedPosition.cpp
r195808 r196691 49 49 } 50 50 51 static inline GridPositionSide initialPositionSide(GridTrackSizingDirection direction) 52 { 53 return direction == ForColumns ? ColumnStartSide : RowStartSide; 54 } 55 56 static inline GridPositionSide finalPositionSide(GridTrackSizingDirection direction) 57 { 58 return direction == ForColumns ? ColumnEndSide : RowEndSide; 59 } 60 51 61 static const NamedGridLinesMap& gridLinesForSide(const RenderStyle& style, GridPositionSide side) 52 62 { … … 65 75 } 66 76 67 bool GridUnresolvedSpan::requiresAutoPlacement() const 68 { 69 return m_initialPosition.shouldBeResolvedAgainstOppositePosition() && m_finalPosition.shouldBeResolvedAgainstOppositePosition(); 70 } 71 72 void GridUnresolvedSpan::adjustGridPositionsFromStyle(const RenderStyle& gridContainerStyle) 73 { 74 ASSERT(isColumnSide(m_initialPositionSide) == isColumnSide(m_finalPositionSide)); 77 static void adjustGridPositionsFromStyle(const RenderStyle& gridContainerStyle, const RenderBox& gridItem, GridTrackSizingDirection direction, GridPosition& initialPosition, GridPosition& finalPosition) 78 { 79 bool isForColumns = direction == ForColumns; 80 initialPosition = isForColumns ? gridItem.style().gridItemColumnStart() : gridItem.style().gridItemRowStart(); 81 finalPosition = isForColumns ? gridItem.style().gridItemColumnEnd() : gridItem.style().gridItemRowEnd(); 75 82 76 83 // We must handle the placement error handling code here instead of in the StyleAdjuster because we don't want to 77 84 // overwrite the specified values. 78 if ( m_initialPosition.isSpan() && m_finalPosition.isSpan())79 m_finalPosition.setAutoPosition();85 if (initialPosition.isSpan() && finalPosition.isSpan()) 86 finalPosition.setAutoPosition(); 80 87 81 88 // Try to early detect the case of non existing named grid lines. This way we could assume later that 82 89 // GridResolvedPosition::resolveGrisPositionFromStyle() won't require the autoplacement to run, i.e., it'll always return a 83 90 // valid resolved position. 84 if ( m_initialPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(m_initialPosition.namedGridLine(), gridContainerStyle, m_initialPositionSide))85 m_initialPosition.setAutoPosition();86 87 if ( m_finalPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(m_finalPosition.namedGridLine(), gridContainerStyle, m_finalPositionSide))88 m_finalPosition.setAutoPosition();91 if (initialPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(initialPosition.namedGridLine(), gridContainerStyle, initialPositionSide(direction))) 92 initialPosition.setAutoPosition(); 93 94 if (finalPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(finalPosition.namedGridLine(), gridContainerStyle, finalPositionSide(direction))) 95 finalPosition.setAutoPosition(); 89 96 90 97 // If the grid item has an automatic position and a grid span for a named line in a given dimension, instead treat the grid span as one. 91 if ( m_initialPosition.isAuto() && m_finalPosition.isSpan() && !m_finalPosition.namedGridLine().isNull())92 m_finalPosition.setSpanPosition(1, String());93 if ( m_finalPosition.isAuto() && m_initialPosition.isSpan() && !m_initialPosition.namedGridLine().isNull())94 m_initialPosition.setSpanPosition(1, String());98 if (initialPosition.isAuto() && finalPosition.isSpan() && !finalPosition.namedGridLine().isNull()) 99 finalPosition.setSpanPosition(1, String()); 100 if (finalPosition.isAuto() && initialPosition.isSpan() && !initialPosition.namedGridLine().isNull()) 101 initialPosition.setSpanPosition(1, String()); 95 102 } 96 103 … … 134 141 { 135 142 if (!resolvedOppositePosition.toInt()) 136 return GridSpan (resolvedOppositePosition, resolvedOppositePosition.next());143 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.next()); 137 144 138 145 unsigned firstLineBeforePositionIndex = 0; … … 146 153 if (resolvedGridLinePosition >= resolvedOppositePosition) 147 154 resolvedGridLinePosition = resolvedOppositePosition.prev(); 148 return GridSpan (std::min<GridResolvedPosition>(resolvedGridLinePosition, resolvedOppositePosition), resolvedOppositePosition);155 return GridSpan::definiteGridSpan(std::min<GridResolvedPosition>(resolvedGridLinePosition, resolvedOppositePosition), resolvedOppositePosition); 149 156 } 150 157 … … 161 168 if (resolvedGridLinePosition <= resolvedOppositePosition) 162 169 resolvedGridLinePosition = resolvedOppositePosition.next(); 163 return GridSpan (resolvedOppositePosition, resolvedGridLinePosition);170 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedGridLinePosition); 164 171 } 165 172 … … 178 185 if (it == gridLinesNames.end()) { 179 186 if (isStartSide(side) && resolvedOppositePosition.toInt()) 180 return GridSpan (resolvedOppositePosition.prev(), resolvedOppositePosition);181 return GridSpan (resolvedOppositePosition, resolvedOppositePosition.next());187 return GridSpan::definiteGridSpan(resolvedOppositePosition.prev(), resolvedOppositePosition); 188 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.next()); 182 189 } 183 190 … … 192 199 if (position.isAuto()) { 193 200 if (isStartSide(side) && resolvedOppositePosition.toInt()) 194 return GridSpan (resolvedOppositePosition.prev(), resolvedOppositePosition);195 return GridSpan (resolvedOppositePosition, resolvedOppositePosition.next());201 return GridSpan::definiteGridSpan(resolvedOppositePosition.prev(), resolvedOppositePosition); 202 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.next()); 196 203 } 197 204 … … 209 216 if (isStartSide(side)) { 210 217 if (!resolvedOppositePosition.toInt()) 211 return GridSpan (resolvedOppositePosition, resolvedOppositePosition.next());218 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.next()); 212 219 213 220 unsigned initialResolvedPosition = std::max<int>(0, resolvedOppositePosition.toInt() - positionOffset); 214 return GridSpan (initialResolvedPosition, resolvedOppositePosition);215 } 216 217 return GridSpan (resolvedOppositePosition, resolvedOppositePosition.toInt() + positionOffset);221 return GridSpan::definiteGridSpan(initialResolvedPosition, resolvedOppositePosition); 222 } 223 224 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.toInt() + positionOffset); 218 225 } 219 226 220 227 GridSpan GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(const RenderStyle& gridContainerStyle, const RenderBox& gridItem, GridTrackSizingDirection direction, const GridResolvedPosition& resolvedInitialPosition) 221 228 { 222 GridUnresolvedSpan unresolvedSpan = unresolvedSpanFromStyle(gridContainerStyle, gridItem, direction); 223 229 GridPosition initialPosition, finalPosition; 230 adjustGridPositionsFromStyle(gridContainerStyle, gridItem, direction, initialPosition, finalPosition); 231 232 GridPositionSide finalSide = finalPositionSide(direction); 224 233 // This method will only be used when both positions need to be resolved against the opposite one. 225 ASSERT( unresolvedSpan.requiresAutoPlacement());234 ASSERT(initialPosition.shouldBeResolvedAgainstOppositePosition() && finalPosition.shouldBeResolvedAgainstOppositePosition()); 226 235 227 236 GridResolvedPosition resolvedFinalPosition = resolvedInitialPosition.next(); 228 237 229 if ( unresolvedSpan.initialPosition().isSpan())230 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, resolvedInitialPosition, unresolvedSpan.initialPosition(), unresolvedSpan.finalPositionSide());231 if ( unresolvedSpan.finalPosition().isSpan())232 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, resolvedInitialPosition, unresolvedSpan.finalPosition(), unresolvedSpan.finalPositionSide());233 234 return GridSpan (resolvedInitialPosition, resolvedFinalPosition);238 if (initialPosition.isSpan()) 239 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, resolvedInitialPosition, initialPosition, finalSide); 240 if (finalPosition.isSpan()) 241 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, resolvedInitialPosition, finalPosition, finalSide); 242 243 return GridSpan::definiteGridSpan(resolvedInitialPosition, resolvedFinalPosition); 235 244 } 236 245 … … 292 301 } 293 302 294 GridUnresolvedSpan GridResolvedPosition::unresolvedSpanFromStyle(const RenderStyle& gridContainerStyle, const RenderBox& gridItem, GridTrackSizingDirection direction) 295 { 296 GridPosition initialPosition = (direction == ForColumns) ? gridItem.style().gridItemColumnStart() : gridItem.style().gridItemRowStart(); 297 auto initialPositionSide = (direction == ForColumns) ? ColumnStartSide : RowStartSide; 298 GridPosition finalPosition = (direction == ForColumns) ? gridItem.style().gridItemColumnEnd() : gridItem.style().gridItemRowEnd(); 299 auto finalPositionSide = (direction == ForColumns) ? ColumnEndSide : RowEndSide; 300 301 GridUnresolvedSpan unresolvedSpan(initialPosition, initialPositionSide, finalPosition, finalPositionSide); 302 unresolvedSpan.adjustGridPositionsFromStyle(gridContainerStyle); 303 304 return unresolvedSpan; 305 } 306 307 GridSpan GridResolvedPosition::resolveGridPositionsFromStyle(const GridUnresolvedSpan& unresolvedSpan, const RenderStyle& gridContainerStyle) 308 { 309 ASSERT(!unresolvedSpan.requiresAutoPlacement()); 310 311 // We must create the GridSpan using finalPosition.prev() because GridSpan stores cell indexes and 312 // an item finishing on the N-th line belongs to the N-1-th cell. 313 314 if (unresolvedSpan.initialPosition().shouldBeResolvedAgainstOppositePosition()) { 303 GridSpan GridResolvedPosition::resolveGridPositionsFromStyle(const RenderStyle& gridContainerStyle, const RenderBox& gridItem, GridTrackSizingDirection direction) 304 { 305 GridPosition initialPosition, finalPosition; 306 adjustGridPositionsFromStyle(gridContainerStyle, gridItem, direction, initialPosition, finalPosition); 307 308 GridPositionSide initialSide = initialPositionSide(direction); 309 GridPositionSide finalSide = finalPositionSide(direction); 310 311 // We can't get our grid positions without running the auto placement algorithm. 312 if (initialPosition.shouldBeResolvedAgainstOppositePosition() && finalPosition.shouldBeResolvedAgainstOppositePosition()) 313 return GridSpan::indefiniteGridSpan(); 314 315 if (initialPosition.shouldBeResolvedAgainstOppositePosition()) { 315 316 // Infer the position from the final position ('auto / 1' or 'span 2 / 3' case). 316 auto finalResolvedPosition = resolveGridPositionFromStyle(gridContainerStyle, unresolvedSpan.finalPosition(), unresolvedSpan.finalPositionSide());317 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, finalResolvedPosition, unresolvedSpan.initialPosition(), unresolvedSpan.initialPositionSide());318 } 319 320 if ( unresolvedSpan.finalPosition().shouldBeResolvedAgainstOppositePosition()) {317 auto finalResolvedPosition = resolveGridPositionFromStyle(gridContainerStyle, finalPosition, finalSide); 318 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, finalResolvedPosition, initialPosition, initialSide); 319 } 320 321 if (finalPosition.shouldBeResolvedAgainstOppositePosition()) { 321 322 // Infer our position from the initial position ('1 / auto' or '3 / span 2' case). 322 auto initialResolvedPosition = resolveGridPositionFromStyle(gridContainerStyle, unresolvedSpan.initialPosition(), unresolvedSpan.initialPositionSide());323 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, initialResolvedPosition, unresolvedSpan.finalPosition(), unresolvedSpan.finalPositionSide());324 } 325 326 GridResolvedPosition resolvedInitialPosition = resolveGridPositionFromStyle(gridContainerStyle, unresolvedSpan.initialPosition(), unresolvedSpan.initialPositionSide());327 GridResolvedPosition resolvedFinalPosition = resolveGridPositionFromStyle(gridContainerStyle, unresolvedSpan.finalPosition(), unresolvedSpan.finalPositionSide());323 auto initialResolvedPosition = resolveGridPositionFromStyle(gridContainerStyle, initialPosition, initialSide); 324 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, initialResolvedPosition, finalPosition, finalSide); 325 } 326 327 GridResolvedPosition resolvedInitialPosition = resolveGridPositionFromStyle(gridContainerStyle, initialPosition, initialSide); 328 GridResolvedPosition resolvedFinalPosition = resolveGridPositionFromStyle(gridContainerStyle, finalPosition, finalSide); 328 329 329 330 if (resolvedInitialPosition > resolvedFinalPosition) … … 332 333 resolvedFinalPosition = resolvedInitialPosition.next(); 333 334 334 return GridSpan (resolvedInitialPosition, std::max(resolvedInitialPosition, resolvedFinalPosition));335 return GridSpan::definiteGridSpan(resolvedInitialPosition, std::max(resolvedInitialPosition, resolvedFinalPosition)); 335 336 } 336 337 -
trunk/Source/WebCore/rendering/style/GridResolvedPosition.h
r195808 r196691 45 45 ForColumns, 46 46 ForRows 47 };48 49 class GridUnresolvedSpan {50 public:51 GridUnresolvedSpan(GridPosition initialPosition, GridPositionSide initialPositionSide, GridPosition finalPosition, GridPositionSide finalPositionSide)52 : m_initialPosition(initialPosition)53 , m_finalPosition(finalPosition)54 , m_initialPositionSide(initialPositionSide)55 , m_finalPositionSide(finalPositionSide)56 {57 }58 59 const GridPosition& initialPosition() const { return m_initialPosition; }60 const GridPosition& finalPosition() const { return m_finalPosition; }61 GridPositionSide initialPositionSide() const { return m_initialPositionSide; }62 GridPositionSide finalPositionSide() const { return m_finalPositionSide; }63 64 bool requiresAutoPlacement() const;65 void adjustGridPositionsFromStyle(const RenderStyle& gridContainerStyle);66 67 private:68 GridPosition m_initialPosition;69 GridPosition m_finalPosition;70 GridPositionSide m_initialPositionSide;71 GridPositionSide m_finalPositionSide;72 47 }; 73 48 … … 138 113 139 114 static GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderStyle&, const RenderBox&, GridTrackSizingDirection, const GridResolvedPosition&); 140 static GridSpan resolveGridPositionsFromStyle(const GridUnresolvedSpan&, const RenderStyle&); 141 static GridUnresolvedSpan unresolvedSpanFromStyle(const RenderStyle&, const RenderBox&, GridTrackSizingDirection); 115 static GridSpan resolveGridPositionsFromStyle(const RenderStyle&, const RenderBox&, GridTrackSizingDirection); 142 116 static unsigned explicitGridColumnCount(const RenderStyle&); 143 117 static unsigned explicitGridRowCount(const RenderStyle&);
Note: See TracChangeset
for help on using the changeset viewer.