Changeset 197400 in webkit
- Timestamp:
- Mar 1, 2016 8:54:19 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r197399 r197400 1 2016-03-01 Manuel Rego Casasnovas <rego@igalia.com> 2 3 [css-grid] Get rid of GridResolvedPosition 4 https://bugs.webkit.org/show_bug.cgi?id=154818 5 6 Reviewed by Darin Adler. 7 8 GridResolvedPosition was a small class just wrapping a unsigned. 9 In the future it should actually wrap an integer, 10 as we want to support implicit tracks before the explicit grid. 11 12 The class itself is not providing any benefit, 13 so we can get rid of it and store directly 2 unsigned in GridSpan. 14 15 This will make simpler future changes related to this task. 16 17 We keep the class just as a utility for the methods 18 that deal with the positions resolution. 19 But it should be renamed in a follow-up patch. 20 21 No new tests, no change of behavior. 22 23 * css/CSSGridTemplateAreasValue.cpp: 24 (WebCore::stringForPosition): 25 * css/CSSParser.cpp: 26 (WebCore::CSSParser::parseGridTemplateAreasRow): 27 * css/StyleBuilderConverter.h: 28 (WebCore::StyleBuilderConverter::createImplicitNamedGridLinesFromGridArea): 29 * rendering/RenderGrid.cpp: 30 (WebCore::RenderGrid::computeUsedBreadthOfGridTracks): 31 (WebCore::RenderGrid::findFlexFactorUnitSize): 32 (WebCore::RenderGrid::spanningItemCrossesFlexibleSizedTracks): 33 (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems): 34 (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForItems): 35 (WebCore::RenderGrid::insertItemIntoGrid): 36 (WebCore::RenderGrid::populateExplicitGridAndOrderIterator): 37 (WebCore::RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid): 38 (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid): 39 (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid): 40 (WebCore::RenderGrid::offsetAndBreadthForPositionedChild): 41 (WebCore::RenderGrid::gridAreaBreadthForChild): 42 (WebCore::RenderGrid::gridAreaBreadthForChildIncludingAlignmentOffsets): 43 (WebCore::RenderGrid::columnAxisOffsetForChild): 44 (WebCore::RenderGrid::rowAxisOffsetForChild): 45 * rendering/style/GridCoordinate.h: 46 (WebCore::GridSpan::definiteGridSpan): 47 (WebCore::GridSpan::integerSpan): 48 (WebCore::GridSpan::resolvedInitialPosition): 49 (WebCore::GridSpan::resolvedFinalPosition): 50 (WebCore::GridSpan::GridSpanIterator::GridSpanIterator): 51 (WebCore::GridSpan::GridSpanIterator::operator*): 52 (WebCore::GridSpan::GridSpanIterator::operator++): 53 (WebCore::GridSpan::GridSpanIterator::operator!=): 54 (WebCore::GridSpan::begin): 55 (WebCore::GridSpan::end): 56 (WebCore::GridSpan::GridSpan): 57 * rendering/style/GridResolvedPosition.cpp: 58 (WebCore::resolveNamedGridLinePositionFromStyle): 59 (WebCore::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition): 60 (WebCore::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition): 61 (WebCore::resolveNamedGridLinePositionAgainstOppositePosition): 62 (WebCore::resolveGridPositionAgainstOppositePosition): 63 (WebCore::GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition): 64 (WebCore::resolveGridPositionFromStyle): 65 (WebCore::GridResolvedPosition::resolveGridPositionsFromStyle): 66 * rendering/style/GridResolvedPosition.h: 67 (WebCore::GridResolvedPosition::GridResolvedPosition): Deleted. 68 (WebCore::GridResolvedPosition::operator*): Deleted. 69 (WebCore::GridResolvedPosition::operator++): Deleted. 70 (WebCore::GridResolvedPosition::operator==): Deleted. 71 (WebCore::GridResolvedPosition::operator!=): Deleted. 72 (WebCore::GridResolvedPosition::operator<): Deleted. 73 (WebCore::GridResolvedPosition::operator>): Deleted. 74 (WebCore::GridResolvedPosition::operator<=): Deleted. 75 (WebCore::GridResolvedPosition::operator>=): Deleted. 76 (WebCore::GridResolvedPosition::toInt): Deleted. 77 (WebCore::GridResolvedPosition::next): Deleted. 78 (WebCore::GridResolvedPosition::prev): Deleted. 79 1 80 2016-03-01 Andreas Kling <akling@apple.com> 2 81 -
trunk/Source/WebCore/css/CSSGridTemplateAreasValue.cpp
r196691 r197400 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() && row < coordinate.rows.resolvedFinalPosition()) 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() && column < coordinate.columns.resolvedFinalPosition() && candidates.contains(it.key)) 65 65 return it.key; 66 66 } -
trunk/Source/WebCore/css/CSSParser.cpp
r197165 r197400 6246 6246 // The following checks test that the grid area is a single filled-in rectangle. 6247 6247 // 1. The new row is adjacent to the previously parsed row. 6248 if (rowCount != gridCoordinate.rows.resolvedFinalPosition() .toInt())6248 if (rowCount != gridCoordinate.rows.resolvedFinalPosition()) 6249 6249 return false; 6250 6250 6251 6251 // 2. The new area starts at the same position as the previously parsed area. 6252 if (currentColumn != gridCoordinate.columns.resolvedInitialPosition() .toInt())6252 if (currentColumn != gridCoordinate.columns.resolvedInitialPosition()) 6253 6253 return false; 6254 6254 6255 6255 // 3. The new area ends at the same position as the previously parsed area. 6256 if (lookAheadColumn != gridCoordinate.columns.resolvedFinalPosition() .toInt())6256 if (lookAheadColumn != gridCoordinate.columns.resolvedFinalPosition()) 6257 6257 return false; 6258 6258 6259 gridCoordinate.rows = GridSpan::definiteGridSpan(gridCoordinate.rows.resolvedInitialPosition(), gridCoordinate.rows.resolvedFinalPosition() .next());6259 gridCoordinate.rows = GridSpan::definiteGridSpan(gridCoordinate.rows.resolvedInitialPosition(), gridCoordinate.rows.resolvedFinalPosition() + 1); 6260 6260 } 6261 6261 currentColumn = lookAheadColumn - 1; -
trunk/Source/WebCore/css/StyleBuilderConverter.h
r196991 r197400 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()); 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()); 895 895 std::sort(endVector.begin(), endVector.end()); 896 896 } -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r196983 r197400 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() <= flexibleSizedTracksIndex[i - 1]) 581 581 continue; 582 582 … … 662 662 double flexFactorSum = 0; 663 663 Vector<unsigned, 8> flexibleTracksIndexes; 664 for (const auto& resolvedPosition : tracksSpan) { 665 unsigned trackIndex = resolvedPosition.toInt(); 664 for (auto trackIndex : tracksSpan) { 666 665 GridTrackSize trackSize = gridTrackSize(direction, trackIndex); 667 666 if (!trackSize.maxTrackBreadth().isFlex()) … … 812 811 { 813 812 for (auto trackPosition : itemSpan) { 814 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition .toInt());813 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition); 815 814 if (trackSize.minTrackBreadth().isFlex() || trackSize.maxTrackBreadth().isFlex()) 816 815 return true; … … 866 865 void RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection direction, const GridSpan& span, RenderBox& gridItem, GridTrack& track, Vector<GridTrack>& columnTracks) 867 866 { 868 const GridResolvedPositiontrackPosition = span.resolvedInitialPosition();869 GridTrackSize trackSize = gridTrackSize(direction, trackPosition .toInt());867 unsigned trackPosition = span.resolvedInitialPosition(); 868 GridTrackSize trackSize = gridTrackSize(direction, trackPosition); 870 869 871 870 if (trackSize.hasMinContentMinTrackBreadth()) … … 1021 1020 sizingData.growBeyondGrowthLimitsTracks.shrink(0); 1022 1021 LayoutUnit spanningTracksSize; 1023 for (auto &trackPosition : itemSpan) {1024 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition .toInt());1025 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackPosition .toInt()] : sizingData.rowTracks[trackPosition.toInt()];1022 for (auto trackPosition : itemSpan) { 1023 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition); 1024 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackPosition] : sizingData.rowTracks[trackPosition]; 1026 1025 spanningTracksSize += trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity); 1027 1026 if (!shouldProcessTrackForTrackSizeComputationPhase(phase, trackSize)) … … 1140 1139 { 1141 1140 ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite()); 1142 ensureGridSize(coordinate.rows.resolvedFinalPosition() .toInt(), coordinate.columns.resolvedFinalPosition().toInt());1143 1144 for (auto &row : coordinate.rows) {1145 for (auto &column : coordinate.columns)1146 m_grid[row .toInt()][column.toInt()].append(&child);1141 ensureGridSize(coordinate.rows.resolvedFinalPosition(), coordinate.columns.resolvedFinalPosition()); 1142 1143 for (auto row : coordinate.rows) { 1144 for (auto column : coordinate.columns) 1145 m_grid[row][column].append(&child); 1147 1146 } 1148 1147 } … … 1206 1205 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForRows); 1207 1206 if (rowPositions.isDefinite()) { 1208 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFinalPosition() .toInt());1207 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFinalPosition()); 1209 1208 } else { 1210 1209 // Grow the grid for items with a definite row span, getting the largest such span. 1211 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *child, ForRows, GridResolvedPosition(0));1212 maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalPosition() .toInt());1210 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *child, ForRows, 0); 1211 maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalPosition()); 1213 1212 } 1214 1213 1215 1214 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForColumns); 1216 1215 if (columnPositions.isDefinite()) { 1217 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.resolvedFinalPosition() .toInt());1216 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.resolvedFinalPosition()); 1218 1217 } else { 1219 1218 // Grow the grid for items with a definite column span, getting the largest such span. 1220 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *child, ForColumns, GridResolvedPosition(0));1221 maximumColumnIndex = std::max(maximumColumnIndex, positions.resolvedFinalPosition() .toInt());1219 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *child, ForColumns, 0); 1220 maximumColumnIndex = std::max(maximumColumnIndex, positions.resolvedFinalPosition()); 1222 1221 } 1223 1222 … … 1234 1233 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; 1235 1234 const unsigned endOfCrossDirection = crossDirection == ForColumns ? gridColumnCount() : gridRowCount(); 1236 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), gridItem, crossDirection, GridResolvedPosition(endOfCrossDirection));1235 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), gridItem, crossDirection, endOfCrossDirection); 1237 1236 return std::make_unique<GridCoordinate>(specifiedDirection == ForColumns ? crossDirectionPositions : specifiedPositions, specifiedDirection == ForColumns ? specifiedPositions : crossDirectionPositions); 1238 1237 } … … 1252 1251 ASSERT(majorAxisPositions.isDefinite()); 1253 1252 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isDefinite()); 1254 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *autoGridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0));1255 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition() .toInt();1256 1257 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions.resolvedInitialPosition() .toInt(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition));1253 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *autoGridItem, autoPlacementMinorAxisDirection(), 0); 1254 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition(); 1255 1256 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions.resolvedInitialPosition(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition)); 1258 1257 std::unique_ptr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.integerSpan(), minorAxisPositions.integerSpan()); 1259 1258 if (!emptyGridArea) … … 1264 1263 1265 1264 if (!isGridAutoFlowDense) 1266 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyGridArea->rows.resolvedInitialPosition() .toInt() : emptyGridArea->columns.resolvedInitialPosition().toInt());1265 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyGridArea->rows.resolvedInitialPosition() : emptyGridArea->columns.resolvedInitialPosition()); 1267 1266 } 1268 1267 } … … 1286 1285 { 1287 1286 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isDefinite()); 1288 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), gridItem, autoPlacementMajorAxisDirection(), GridResolvedPosition(0));1287 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), gridItem, autoPlacementMajorAxisDirection(), 0); 1289 1288 1290 1289 const unsigned endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColumns) ? gridColumnCount() : gridRowCount(); … … 1296 1295 if (minorAxisPositions.isDefinite()) { 1297 1296 // Move to the next track in major axis if initial position in minor axis is before auto-placement cursor. 1298 if (minorAxisPositions.resolvedInitialPosition() .toInt()< minorAxisAutoPlacementCursor)1297 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacementCursor) 1299 1298 majorAxisAutoPlacementCursor++; 1300 1299 1301 1300 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { 1302 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions.resolvedInitialPosition() .toInt(), majorAxisAutoPlacementCursor);1301 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor); 1303 1302 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.integerSpan(), majorAxisPositions.integerSpan()); 1304 1303 } … … 1307 1306 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); 1308 1307 } else { 1309 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), gridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0));1308 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), gridItem, autoPlacementMinorAxisDirection(), 0); 1310 1309 1311 1310 for (unsigned majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisIndex < endOfMajorAxis; ++majorAxisIndex) { … … 1315 1314 if (emptyGridArea) { 1316 1315 // Check that it fits in the minor axis direction, as we shouldn't grow in that direction here (it was already managed in populateExplicitGridAndOrderIterator()). 1317 GridResolvedPositionminorAxisFinalPositionIndex = autoPlacementMinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGridArea->rows.resolvedFinalPosition();1316 unsigned minorAxisFinalPositionIndex = autoPlacementMinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGridArea->rows.resolvedFinalPosition(); 1318 1317 const unsigned endOfMinorAxis = autoPlacementMinorAxisDirection() == ForColumns ? gridColumnCount() : gridRowCount(); 1319 if (minorAxisFinalPositionIndex .toInt()<= endOfMinorAxis)1318 if (minorAxisFinalPositionIndex <= endOfMinorAxis) 1320 1319 break; 1321 1320 … … 1335 1334 m_gridItemCoordinate.set(&gridItem, *emptyGridArea); 1336 1335 insertItemIntoGrid(gridItem, *emptyGridArea); 1337 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition() .toInt();1338 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition() .toInt();1336 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition(); 1337 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition(); 1339 1338 } 1340 1339 … … 1481 1480 bool startIsAuto = startPosition.isAuto() 1482 1481 || (startPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(startPosition.namedGridLine(), style(), (direction == ForColumns) ? ColumnStartSide : RowStartSide)) 1483 || (positions.resolvedInitialPosition() .toInt()> lastTrackIndex);1482 || (positions.resolvedInitialPosition() > lastTrackIndex); 1484 1483 bool endIsAuto = endPosition.isAuto() 1485 1484 || (endPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(endPosition.namedGridLine(), style(), (direction == ForColumns) ? ColumnEndSide : RowEndSide)) 1486 || (positions.resolvedFinalPosition() .prev().toInt()> lastTrackIndex);1487 1488 GridResolvedPosition firstPosition = GridResolvedPosition(0);1489 GridResolvedPositioninitialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition();1490 GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex);1491 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition().prev();1485 || (positions.resolvedFinalPosition() - 1 > lastTrackIndex); 1486 1487 unsigned firstPosition = 0; 1488 unsigned initialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition(); 1489 unsigned lastPosition = lastTrackIndex; 1490 unsigned finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition() - 1; 1492 1491 1493 1492 // Positioned children do not grow the grid, so we need to clamp the positions to avoid ending up outside of it. 1494 initialPosition = std::min <GridResolvedPosition>(initialPosition, lastPosition);1495 finalPosition = std::min <GridResolvedPosition>(finalPosition, lastPosition);1496 1497 LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ? m_columnPositions[initialPosition .toInt()] : m_rowPositions[initialPosition.toInt()];1498 LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : logicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition .next().toInt()] : m_rowPositions[finalPosition.next().toInt()];1493 initialPosition = std::min(initialPosition, lastPosition); 1494 finalPosition = std::min(finalPosition, lastPosition); 1495 1496 LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ? m_columnPositions[initialPosition] : m_rowPositions[initialPosition]; 1497 LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : logicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition + 1] : m_rowPositions[finalPosition + 1]; 1499 1498 1500 1499 breadth = end - start; … … 1538 1537 const GridSpan& span = cachedGridSpan(child, direction); 1539 1538 LayoutUnit gridAreaBreadth = 0; 1540 for (auto &trackPosition : span)1541 gridAreaBreadth += tracks[trackPosition .toInt()].baseSize();1539 for (auto trackPosition : span) 1540 gridAreaBreadth += tracks[trackPosition].baseSize(); 1542 1541 1543 1542 gridAreaBreadth += guttersSize(direction, span.integerSpan()); … … 1554 1553 const auto& linePositions = (direction == ForColumns) ? m_columnPositions : m_rowPositions; 1555 1554 1556 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition() .toInt()];1557 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition() .prev().toInt()];1555 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition()]; 1556 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition() - 1]; 1558 1557 1559 1558 // Track Positions vector stores the 'start' grid line of each track, so we have to add last track's baseSize. 1560 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinalPosition() .prev().toInt()].baseSize();1559 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinalPosition() - 1].baseSize(); 1561 1560 } 1562 1561 … … 1837 1836 { 1838 1837 const GridSpan& rowsSpan = cachedGridSpan(child, ForRows); 1839 unsigned childStartLine = rowsSpan.resolvedInitialPosition() .toInt();1838 unsigned childStartLine = rowsSpan.resolvedInitialPosition(); 1840 1839 LayoutUnit startOfRow = m_rowPositions[childStartLine]; 1841 1840 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); … … 1848 1847 case GridAxisEnd: 1849 1848 case GridAxisCenter: { 1850 unsigned childEndLine = rowsSpan.resolvedFinalPosition() .toInt();1849 unsigned childEndLine = rowsSpan.resolvedFinalPosition(); 1851 1850 LayoutUnit endOfRow = m_rowPositions[childEndLine]; 1852 1851 // m_rowPositions include gutters so we need to substract them to get the actual end position for a given … … 1871 1870 { 1872 1871 const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns); 1873 unsigned childStartLine = columnsSpan.resolvedInitialPosition() .toInt();1872 unsigned childStartLine = columnsSpan.resolvedInitialPosition(); 1874 1873 LayoutUnit startOfColumn = m_columnPositions[childStartLine]; 1875 1874 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); … … 1882 1881 case GridAxisEnd: 1883 1882 case GridAxisCenter: { 1884 unsigned childEndLine = columnsSpan.resolvedFinalPosition() .toInt();1883 unsigned childEndLine = columnsSpan.resolvedFinalPosition(); 1885 1884 LayoutUnit endOfColumn = m_columnPositions[childEndLine]; 1886 1885 // 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
r196691 r197400 50 50 public: 51 51 52 static GridSpan definiteGridSpan( const GridResolvedPosition& resolvedInitialPosition, const GridResolvedPosition&resolvedFinalPosition)52 static GridSpan definiteGridSpan(unsigned resolvedInitialPosition, unsigned resolvedFinalPosition) 53 53 { 54 54 return GridSpan(resolvedInitialPosition, resolvedFinalPosition, Definite); … … 68 68 { 69 69 ASSERT(isDefinite()); 70 return m_resolvedFinalPosition .toInt() - m_resolvedInitialPosition.toInt();70 return m_resolvedFinalPosition - m_resolvedInitialPosition; 71 71 } 72 72 73 const GridResolvedPosition&resolvedInitialPosition() const73 unsigned resolvedInitialPosition() const 74 74 { 75 75 ASSERT(isDefinite()); … … 77 77 } 78 78 79 const GridResolvedPosition&resolvedFinalPosition() const79 unsigned resolvedFinalPosition() const 80 80 { 81 81 ASSERT(isDefinite()); 82 ASSERT(m_resolvedFinalPosition); 82 83 return m_resolvedFinalPosition; 83 84 } 84 85 85 typedef GridResolvedPosition iterator; 86 struct GridSpanIterator { 87 GridSpanIterator(unsigned value) 88 : value(value) 89 { 90 } 86 91 87 iterator begin() const 92 operator unsigned&() { return value; } 93 unsigned operator*() const { return value; } 94 95 unsigned value; 96 }; 97 98 GridSpanIterator begin() const 88 99 { 89 100 ASSERT(isDefinite()); … … 91 102 } 92 103 93 iterator end() const104 GridSpanIterator end() const 94 105 { 95 106 ASSERT(isDefinite()); … … 106 117 enum GridSpanType {Definite, Indefinite}; 107 118 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))119 GridSpan(unsigned resolvedInitialPosition, unsigned resolvedFinalPosition, GridSpanType type) 120 : m_resolvedInitialPosition(std::min(resolvedInitialPosition, kGridMaxTracks - 1)) 121 , m_resolvedFinalPosition(std::min(resolvedFinalPosition, kGridMaxTracks)) 111 122 , m_type(type) 112 123 { … … 114 125 } 115 126 116 GridResolvedPositionm_resolvedInitialPosition;117 GridResolvedPositionm_resolvedFinalPosition;127 unsigned m_resolvedInitialPosition; 128 unsigned m_resolvedFinalPosition; 118 129 GridSpanType m_type; 119 130 -
trunk/Source/WebCore/rendering/style/GridResolvedPosition.cpp
r196691 r197400 117 117 } 118 118 119 static GridResolvedPositionresolveNamedGridLinePositionFromStyle(const RenderStyle& gridContainerStyle, const GridPosition& position, GridPositionSide side)119 static unsigned resolveNamedGridLinePositionFromStyle(const RenderStyle& gridContainerStyle, const GridPosition& position, GridPositionSide side) 120 120 { 121 121 ASSERT(!position.namedGridLine().isNull()); … … 138 138 } 139 139 140 static GridSpan resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition( const GridResolvedPosition&resolvedOppositePosition, const GridPosition& position, const Vector<unsigned>& gridLines)141 { 142 if (!resolvedOppositePosition .toInt())143 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition .next());140 static GridSpan resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(unsigned resolvedOppositePosition, const GridPosition& position, const Vector<unsigned>& gridLines) 141 { 142 if (!resolvedOppositePosition) 143 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1); 144 144 145 145 unsigned firstLineBeforePositionIndex = 0; 146 auto firstLineBeforePosition = std::lower_bound(gridLines.begin(), gridLines.end(), resolvedOppositePosition .toInt());146 auto firstLineBeforePosition = std::lower_bound(gridLines.begin(), gridLines.end(), resolvedOppositePosition); 147 147 if (firstLineBeforePosition != gridLines.end()) 148 148 firstLineBeforePositionIndex = firstLineBeforePosition - gridLines.begin(); … … 150 150 unsigned gridLineIndex = std::max<int>(0, firstLineBeforePositionIndex - position.spanPosition()); 151 151 152 GridResolvedPosition resolvedGridLinePosition = GridResolvedPosition(gridLines[gridLineIndex]);152 unsigned resolvedGridLinePosition = gridLines[gridLineIndex]; 153 153 if (resolvedGridLinePosition >= resolvedOppositePosition) 154 resolvedGridLinePosition = resolvedOppositePosition .prev();155 return GridSpan::definiteGridSpan(std::min <GridResolvedPosition>(resolvedGridLinePosition, resolvedOppositePosition), resolvedOppositePosition);156 } 157 158 static GridSpan resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition( const GridResolvedPosition&resolvedOppositePosition, const GridPosition& position, const Vector<unsigned>& gridLines)154 resolvedGridLinePosition = resolvedOppositePosition - 1; 155 return GridSpan::definiteGridSpan(std::min(resolvedGridLinePosition, resolvedOppositePosition), resolvedOppositePosition); 156 } 157 158 static GridSpan resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(unsigned resolvedOppositePosition, const GridPosition& position, const Vector<unsigned>& gridLines) 159 159 { 160 160 ASSERT(gridLines.size()); … … 165 165 166 166 unsigned gridLineIndex = std::min<unsigned>(gridLines.size() - 1, firstLineAfterOppositePositionIndex + position.spanPosition() - 1); 167 GridResolvedPositionresolvedGridLinePosition = gridLines[gridLineIndex];167 unsigned resolvedGridLinePosition = gridLines[gridLineIndex]; 168 168 if (resolvedGridLinePosition <= resolvedOppositePosition) 169 resolvedGridLinePosition = resolvedOppositePosition .next();169 resolvedGridLinePosition = resolvedOppositePosition + 1; 170 170 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedGridLinePosition); 171 171 } 172 172 173 static GridSpan resolveNamedGridLinePositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, const GridResolvedPosition&resolvedOppositePosition, const GridPosition& position, GridPositionSide side)173 static GridSpan resolveNamedGridLinePositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, unsigned resolvedOppositePosition, const GridPosition& position, GridPositionSide side) 174 174 { 175 175 ASSERT(position.isSpan()); … … 184 184 // See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html. 185 185 if (it == gridLinesNames.end()) { 186 if (isStartSide(side) && resolvedOppositePosition .toInt())187 return GridSpan::definiteGridSpan(resolvedOppositePosition .prev(), resolvedOppositePosition);188 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition .next());186 if (isStartSide(side) && resolvedOppositePosition) 187 return GridSpan::definiteGridSpan(resolvedOppositePosition - 1, resolvedOppositePosition); 188 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1); 189 189 } 190 190 … … 195 195 } 196 196 197 static GridSpan resolveGridPositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, const GridResolvedPosition&resolvedOppositePosition, const GridPosition& position, GridPositionSide side)197 static GridSpan resolveGridPositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, unsigned resolvedOppositePosition, const GridPosition& position, GridPositionSide side) 198 198 { 199 199 if (position.isAuto()) { 200 if (isStartSide(side) && resolvedOppositePosition .toInt())201 return GridSpan::definiteGridSpan(resolvedOppositePosition .prev(), resolvedOppositePosition);202 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition .next());200 if (isStartSide(side) && resolvedOppositePosition) 201 return GridSpan::definiteGridSpan(resolvedOppositePosition - 1, resolvedOppositePosition); 202 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1); 203 203 } 204 204 … … 215 215 unsigned positionOffset = position.spanPosition(); 216 216 if (isStartSide(side)) { 217 if (!resolvedOppositePosition .toInt())218 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition .next());219 220 unsigned initialResolvedPosition = std::max<int>(0, resolvedOppositePosition .toInt()- positionOffset);217 if (!resolvedOppositePosition) 218 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1); 219 220 unsigned initialResolvedPosition = std::max<int>(0, resolvedOppositePosition - positionOffset); 221 221 return GridSpan::definiteGridSpan(initialResolvedPosition, resolvedOppositePosition); 222 222 } 223 223 224 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition .toInt()+ positionOffset);225 } 226 227 GridSpan GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(const RenderStyle& gridContainerStyle, const RenderBox& gridItem, GridTrackSizingDirection direction, const GridResolvedPosition&resolvedInitialPosition)224 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + positionOffset); 225 } 226 227 GridSpan GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(const RenderStyle& gridContainerStyle, const RenderBox& gridItem, GridTrackSizingDirection direction, unsigned resolvedInitialPosition) 228 228 { 229 229 GridPosition initialPosition, finalPosition; … … 234 234 ASSERT(initialPosition.shouldBeResolvedAgainstOppositePosition() && finalPosition.shouldBeResolvedAgainstOppositePosition()); 235 235 236 GridResolvedPosition resolvedFinalPosition = resolvedInitialPosition.next();236 unsigned resolvedFinalPosition = resolvedInitialPosition + 1; 237 237 238 238 if (initialPosition.isSpan()) … … 244 244 } 245 245 246 static GridResolvedPositionresolveGridPositionFromStyle(const RenderStyle& gridContainerStyle, const GridPosition& position, GridPositionSide side)246 static unsigned resolveGridPositionFromStyle(const RenderStyle& gridContainerStyle, const GridPosition& position, GridPositionSide side) 247 247 { 248 248 switch (position.type()) { … … 295 295 // 'auto' and span depend on the opposite position for resolution (e.g. grid-row: auto / 1 or grid-column: span 3 / "myHeader"). 296 296 ASSERT_NOT_REACHED(); 297 return GridResolvedPosition(0);297 return 0; 298 298 } 299 299 ASSERT_NOT_REACHED(); 300 return GridResolvedPosition(0);300 return 0; 301 301 } 302 302 … … 325 325 } 326 326 327 GridResolvedPositionresolvedInitialPosition = resolveGridPositionFromStyle(gridContainerStyle, initialPosition, initialSide);328 GridResolvedPositionresolvedFinalPosition = resolveGridPositionFromStyle(gridContainerStyle, finalPosition, finalSide);327 unsigned resolvedInitialPosition = resolveGridPositionFromStyle(gridContainerStyle, initialPosition, initialSide); 328 unsigned resolvedFinalPosition = resolveGridPositionFromStyle(gridContainerStyle, finalPosition, finalSide); 329 329 330 330 if (resolvedInitialPosition > resolvedFinalPosition) 331 331 std::swap(resolvedInitialPosition, resolvedFinalPosition); 332 332 else if (resolvedInitialPosition == resolvedFinalPosition) 333 resolvedFinalPosition = resolvedInitialPosition .next();333 resolvedFinalPosition = resolvedInitialPosition + 1; 334 334 335 335 return GridSpan::definiteGridSpan(resolvedInitialPosition, std::max(resolvedInitialPosition, resolvedFinalPosition)); -
trunk/Source/WebCore/rendering/style/GridResolvedPosition.h
r196691 r197400 47 47 }; 48 48 49 // This class represents a line index into one of the dimensions of the grid array.50 // Wraps an unsigned integer just for the purpose of knowing what we manipulate in the grid code.49 // Class with all the code related to grid items positions resolution. 50 // TODO(rego): Rename class to GridPositionsResolver. 51 51 class GridResolvedPosition { 52 52 public: 53 GridResolvedPosition(unsigned position) 54 : m_integerPosition(position) 55 { 56 } 57 58 GridResolvedPosition& operator*() 59 { 60 return *this; 61 } 62 63 GridResolvedPosition& operator++() 64 { 65 m_integerPosition++; 66 return *this; 67 } 68 69 bool operator==(const GridResolvedPosition& other) const 70 { 71 return m_integerPosition == other.m_integerPosition; 72 } 73 74 bool operator!=(const GridResolvedPosition& other) const 75 { 76 return m_integerPosition != other.m_integerPosition; 77 } 78 79 bool operator<(const GridResolvedPosition& other) const 80 { 81 return m_integerPosition < other.m_integerPosition; 82 } 83 84 bool operator>(const GridResolvedPosition& other) const 85 { 86 return m_integerPosition > other.m_integerPosition; 87 } 88 89 bool operator<=(const GridResolvedPosition& other) const 90 { 91 return m_integerPosition <= other.m_integerPosition; 92 } 93 94 bool operator>=(const GridResolvedPosition& other) const 95 { 96 return m_integerPosition >= other.m_integerPosition; 97 } 98 99 unsigned toInt() const 100 { 101 return m_integerPosition; 102 } 103 104 GridResolvedPosition next() const 105 { 106 return GridResolvedPosition(m_integerPosition + 1); 107 } 108 109 GridResolvedPosition prev() const 110 { 111 return m_integerPosition ? m_integerPosition - 1 : 0; 112 } 113 114 static GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderStyle&, const RenderBox&, GridTrackSizingDirection, const GridResolvedPosition&); 53 static GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderStyle&, const RenderBox&, GridTrackSizingDirection, unsigned); 115 54 static GridSpan resolveGridPositionsFromStyle(const RenderStyle&, const RenderBox&, GridTrackSizingDirection); 116 55 static unsigned explicitGridColumnCount(const RenderStyle&); 117 56 static unsigned explicitGridRowCount(const RenderStyle&); 118 57 static bool isNonExistentNamedLineOrArea(const String& lineName, const RenderStyle&, GridPositionSide); 119 120 private:121 unsigned m_integerPosition;122 58 }; 123 59
Note: See TracChangeset
for help on using the changeset viewer.