Changeset 195808 in webkit
- Timestamp:
- Jan 29, 2016 1:22:28 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r195801 r195808 1 2016-01-29 Manuel Rego Casasnovas <rego@igalia.com> 2 3 [css-grid] Store lines instead of tracks in GridResolvedPosition 4 https://bugs.webkit.org/show_bug.cgi?id=153592 5 6 Reviewed by Sergio Villar Senin. 7 8 Due to the new feature that allows to create implicit tracks before the 9 explicit ones, we will need to use lines instead of tracks in the 10 code to be able to implement it properly. 11 12 This is just a first simple patch using lines instead of tracks in 13 GridResolvedPosition. It modifies the code that was using it, as it was 14 considering that the resolvedFinalPosition was a track index and 15 not a line index. 16 17 So if we've an item positioned like: 18 grid-column: 2 / 5; 19 grid-row: 1 / span 2; 20 21 Before we were storing this information on the GridSpan: 22 * columns: 23 * resolvedInitialPosition: 1 24 * resolvedFinalPosition: 3 25 * rows: 26 * resolvedInitialPosition: 0 27 * resolvedFinalPosition: 1 28 29 And now we're storing: 30 * columns: 31 * resolvedInitialPosition: 1 32 * resolvedFinalPosition: 4 33 * rows: 34 * resolvedInitialPosition: 0 35 * resolvedFinalPosition: 2 36 37 No new tests, no change of behavior. 38 39 * css/CSSGridTemplateAreasValue.cpp: 40 (WebCore::stringForPosition): 41 * css/CSSParser.cpp: 42 (WebCore::CSSParser::parseGridTemplateAreasRow): 43 * css/StyleBuilderConverter.h: 44 (WebCore::StyleBuilderConverter::createImplicitNamedGridLinesFromGridArea): 45 * rendering/RenderGrid.cpp: 46 (WebCore::RenderGrid::GridIterator::nextEmptyGridArea): 47 (WebCore::RenderGrid::computeUsedBreadthOfGridTracks): 48 (WebCore::RenderGrid::ensureGridSize): 49 (WebCore::RenderGrid::populateExplicitGridAndOrderIterator): 50 (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid): 51 (WebCore::RenderGrid::offsetAndBreadthForPositionedChild): 52 (WebCore::RenderGrid::gridAreaBreadthForChildIncludingAlignmentOffsets): 53 (WebCore::RenderGrid::columnAxisOffsetForChild): 54 (WebCore::RenderGrid::rowAxisOffsetForChild): 55 * rendering/RenderGrid.h: 56 * rendering/style/GridCoordinate.h: 57 (WebCore::GridSpan::GridSpan): 58 (WebCore::GridSpan::integerSpan): 59 (WebCore::GridSpan::end): 60 (WebCore::GridCoordinate::GridCoordinate): 61 * rendering/style/GridResolvedPosition.cpp: 62 (WebCore::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition): 63 (WebCore::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition): 64 (WebCore::resolveNamedGridLinePositionAgainstOppositePosition): 65 (WebCore::resolveGridPositionAgainstOppositePosition): 66 (WebCore::GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition): 67 (WebCore::GridResolvedPosition::resolveGridPositionsFromStyle): 68 (WebCore::resolveNamedGridLinePositionFromStyle): Deleted. 69 * rendering/style/GridResolvedPosition.h: 70 1 71 2016-01-28 Brady Eidson <beidson@apple.com> 2 72 -
trunk/Source/WebCore/css/CSSGridTemplateAreasValue.cpp
r169934 r195808 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
r195743 r195808 6196 6196 // We handle several grid areas with the same name at once to simplify the validation code. 6197 6197 unsigned lookAheadColumn; 6198 for (lookAheadColumn = currentColumn ; lookAheadColumn < columnCount - 1; ++lookAheadColumn) {6199 if (columnNames[lookAheadColumn + 1] != gridAreaName)6198 for (lookAheadColumn = currentColumn + 1; lookAheadColumn < columnCount; ++lookAheadColumn) { 6199 if (columnNames[lookAheadColumn] != gridAreaName) 6200 6200 break; 6201 6201 } … … 6203 6203 auto gridAreaIterator = gridAreaMap.find(gridAreaName); 6204 6204 if (gridAreaIterator == gridAreaMap.end()) 6205 gridAreaMap.add(gridAreaName, GridCoordinate(GridSpan(rowCount, rowCount ), GridSpan(currentColumn, lookAheadColumn)));6205 gridAreaMap.add(gridAreaName, GridCoordinate(GridSpan(rowCount, rowCount + 1), GridSpan(currentColumn, lookAheadColumn))); 6206 6206 else { 6207 6207 GridCoordinate& gridCoordinate = gridAreaIterator->value; … … 6209 6209 // The following checks test that the grid area is a single filled-in rectangle. 6210 6210 // 1. The new row is adjacent to the previously parsed row. 6211 if (rowCount != gridCoordinate.rows.resolvedFinalPosition. next().toInt())6211 if (rowCount != gridCoordinate.rows.resolvedFinalPosition.toInt()) 6212 6212 return false; 6213 6213 … … 6222 6222 ++gridCoordinate.rows.resolvedFinalPosition; 6223 6223 } 6224 currentColumn = lookAheadColumn ;6224 currentColumn = lookAheadColumn - 1; 6225 6225 } 6226 6226 -
trunk/Source/WebCore/css/StyleBuilderConverter.h
r195452 r195808 881 881 { 882 882 auto& endVector = namedGridLines.add(area.key + "-end", Vector<unsigned>()).iterator->value; 883 endVector.append(areaSpan.resolvedFinalPosition. next().toInt());883 endVector.append(areaSpan.resolvedFinalPosition.toInt()); 884 884 std::sort(endVector.begin(), endVector.end()); 885 885 } -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r194496 r195808 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 - 1), GridSpan(m_columnIndex, m_columnIndex + columnSpan - 1));193 std::unique_ptr<GridCoordinate> result = std::make_unique<GridCoordinate>(GridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan(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() - 1), direction, initialFreeSpace.value());569 flexFraction = findFlexFactorUnitSize(tracks, GridSpan(0, tracks.size()), direction, initialFreeSpace.value()); 570 570 else { 571 571 for (const auto& trackIndex : flexibleSizedTracksIndex) … … 1122 1122 #endif 1123 1123 1124 void RenderGrid::ensureGridSize(unsigned maximumRow Index, unsigned maximumColumnIndex)1124 void RenderGrid::ensureGridSize(unsigned maximumRowSize, unsigned maximumColumnSize) 1125 1125 { 1126 1126 const unsigned oldRowCount = gridRowCount(); 1127 if (maximumRow Index >=oldRowCount) {1128 m_grid.grow(maximumRow Index + 1);1127 if (maximumRowSize > oldRowCount) { 1128 m_grid.grow(maximumRowSize); 1129 1129 for (unsigned row = oldRowCount; row < gridRowCount(); ++row) 1130 1130 m_grid[row].grow(gridColumnCount()); 1131 1131 } 1132 1132 1133 if (maximumColumn Index >=gridColumnCount()) {1133 if (maximumColumnSize > gridColumnCount()) { 1134 1134 for (unsigned row = 0; row < gridRowCount(); ++row) 1135 m_grid[row].grow(maximumColumn Index + 1);1135 m_grid[row].grow(maximumColumnSize); 1136 1136 } 1137 1137 } … … 1201 1201 if (!unresolvedRowPositions.requiresAutoPlacement()) { 1202 1202 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedRowPositions, style()); 1203 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFinalPosition. next().toInt());1203 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFinalPosition.toInt()); 1204 1204 } else { 1205 1205 // Grow the grid for items with a definite row span, getting the largest such span. 1206 1206 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *child, ForRows, GridResolvedPosition(0)); 1207 maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalPosition. next().toInt());1207 maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalPosition.toInt()); 1208 1208 } 1209 1209 … … 1211 1211 if (!unresolvedColumnPositions.requiresAutoPlacement()) { 1212 1212 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedColumnPositions, style()); 1213 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.resolvedFinalPosition. next().toInt());1213 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.resolvedFinalPosition.toInt()); 1214 1214 } else { 1215 1215 // Grow the grid for items with a definite column span, getting the largest such span. 1216 1216 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *child, ForColumns, GridResolvedPosition(0)); 1217 maximumColumnIndex = std::max(maximumColumnIndex, positions.resolvedFinalPosition. next().toInt());1217 maximumColumnIndex = std::max(maximumColumnIndex, positions.resolvedFinalPosition.toInt()); 1218 1218 } 1219 1219 } … … 1311 1311 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacementMinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition : emptyGridArea->rows.resolvedFinalPosition; 1312 1312 const unsigned endOfMinorAxis = autoPlacementMinorAxisDirection() == ForColumns ? gridColumnCount() : gridRowCount(); 1313 if (minorAxisFinalPositionIndex.toInt() < endOfMinorAxis)1313 if (minorAxisFinalPositionIndex.toInt() <= endOfMinorAxis) 1314 1314 break; 1315 1315 … … 1478 1478 bool endIsAuto = endPosition.isAuto() 1479 1479 || (endPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(endPosition.namedGridLine(), style(), (direction == ForColumns) ? ColumnEndSide : RowEndSide)) 1480 || (positions.resolvedFinalPosition. toInt() > lastTrackIndex);1480 || (positions.resolvedFinalPosition.prev().toInt() > lastTrackIndex); 1481 1481 1482 1482 GridResolvedPosition firstPosition = GridResolvedPosition(0); 1483 1483 GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition; 1484 1484 GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex); 1485 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition ;1485 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition.prev(); 1486 1486 1487 1487 // Positioned children do not grow the grid, so we need to clamp the positions to avoid ending up outside of it. … … 1544 1544 1545 1545 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition.toInt()]; 1546 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition. toInt()];1546 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition.prev().toInt()]; 1547 1547 1548 1548 // 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. toInt()].baseSize();1549 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinalPosition.prev().toInt()].baseSize(); 1550 1550 } 1551 1551 … … 1837 1837 case GridAxisEnd: 1838 1838 case GridAxisCenter: { 1839 unsigned childEndLine = rowsSpan.resolvedFinalPosition. next().toInt();1839 unsigned childEndLine = rowsSpan.resolvedFinalPosition.toInt(); 1840 1840 LayoutUnit endOfRow = m_rowPositions[childEndLine]; 1841 1841 // m_rowPositions include gutters so we need to substract them to get the actual end position for a given … … 1871 1871 case GridAxisEnd: 1872 1872 case GridAxisCenter: { 1873 unsigned childEndLine = columnsSpan.resolvedFinalPosition. next().toInt();1873 unsigned childEndLine = columnsSpan.resolvedFinalPosition.toInt(); 1874 1874 LayoutUnit endOfColumn = m_columnPositions[childEndLine]; 1875 1875 // m_columnPositions include gutters so we need to substract them to get the actual end position for a given -
trunk/Source/WebCore/rendering/RenderGrid.h
r192156 r195808 77 77 void resolveContentBasedTrackSizingFunctions(GridTrackSizingDirection, GridSizingData&); 78 78 79 void ensureGridSize(unsigned maximumRow Index, unsigned maximumColumnIndex);79 void ensureGridSize(unsigned maximumRowSize, unsigned maximumColumnSize); 80 80 void insertItemIntoGrid(RenderBox&, const GridCoordinate&); 81 81 void placeItemsOnGrid(); -
trunk/Source/WebCore/rendering/style/GridCoordinate.h
r176390 r195808 45 45 46 46 // A span in a single direction (either rows or columns). Note that |resolvedInitialPosition| 47 // and |resolvedFinalPosition| are grid areas' indexes, NOT grid lines'. Iterating over the48 // span should include both |resolvedInitialPosition| and|resolvedFinalPosition| to be correct.47 // and |resolvedFinalPosition| are grid lines' indexes. 48 // Iterating over the span shouldn't include |resolvedFinalPosition| to be correct. 49 49 class GridSpan { 50 50 public: … … 53 53 , resolvedFinalPosition(std::min(resolvedFinalPosition.toInt(), kGridMaxTracks)) 54 54 { 55 ASSERT(resolvedInitialPosition < =resolvedFinalPosition);55 ASSERT(resolvedInitialPosition < resolvedFinalPosition); 56 56 } 57 57 … … 63 63 unsigned integerSpan() const 64 64 { 65 return resolvedFinalPosition.toInt() - resolvedInitialPosition.toInt() + 1;65 return resolvedFinalPosition.toInt() - resolvedInitialPosition.toInt(); 66 66 } 67 67 … … 78 78 iterator end() const 79 79 { 80 return resolvedFinalPosition .next();80 return resolvedFinalPosition; 81 81 } 82 82 }; … … 87 87 // HashMap requires a default constuctor. 88 88 GridCoordinate() 89 : columns(0, 0)90 , rows(0, 0)89 : columns(0, 1) 90 , rows(0, 1) 91 91 { 92 92 } -
trunk/Source/WebCore/rendering/style/GridResolvedPosition.cpp
r192414 r195808 110 110 } 111 111 112 static GridResolvedPosition adjustGridPositionForRowEndColumnEndSide(unsigned resolvedPosition)113 {114 return resolvedPosition ? GridResolvedPosition(resolvedPosition - 1) : GridResolvedPosition(0);115 }116 117 112 static GridResolvedPosition resolveNamedGridLinePositionFromStyle(const RenderStyle& gridContainerStyle, const GridPosition& position, GridPositionSide side) 118 113 { … … 136 131 } 137 132 138 static inline unsigned firstNamedGridLineBeforePosition(unsignedposition, const Vector<unsigned>& gridLines)139 { 140 // The grid line inequality needs to be strict (which doesn't match the after / end case) because |position| is141 // already converted to an index in our grid representation (ie one was removed from the grid line to account for142 // the side). 133 static GridSpan resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, const Vector<unsigned>& gridLines) 134 { 135 if (!resolvedOppositePosition.toInt()) 136 return GridSpan(resolvedOppositePosition, resolvedOppositePosition.next()); 137 143 138 unsigned firstLineBeforePositionIndex = 0; 144 auto firstLineBeforePosition = std::lower_bound(gridLines.begin(), gridLines.end(), position); 145 if (firstLineBeforePosition != gridLines.end()) { 146 if (*firstLineBeforePosition > position && firstLineBeforePosition != gridLines.begin()) 147 --firstLineBeforePosition; 148 139 auto firstLineBeforePosition = std::lower_bound(gridLines.begin(), gridLines.end(), resolvedOppositePosition.toInt()); 140 if (firstLineBeforePosition != gridLines.end()) 149 141 firstLineBeforePositionIndex = firstLineBeforePosition - gridLines.begin(); 150 } 151 return firstLineBeforePositionIndex; 152 } 153 154 static GridSpan resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, const Vector<unsigned>& gridLines) 155 { 156 unsigned gridLineIndex = std::max<int>(0, firstNamedGridLineBeforePosition(resolvedOppositePosition.toInt(), gridLines) - position.spanPosition() + 1); 142 143 unsigned gridLineIndex = std::max<int>(0, firstLineBeforePositionIndex - position.spanPosition()); 144 157 145 GridResolvedPosition resolvedGridLinePosition = GridResolvedPosition(gridLines[gridLineIndex]); 146 if (resolvedGridLinePosition >= resolvedOppositePosition) 147 resolvedGridLinePosition = resolvedOppositePosition.prev(); 158 148 return GridSpan(std::min<GridResolvedPosition>(resolvedGridLinePosition, resolvedOppositePosition), resolvedOppositePosition); 159 149 } … … 168 158 169 159 unsigned gridLineIndex = std::min<unsigned>(gridLines.size() - 1, firstLineAfterOppositePositionIndex + position.spanPosition() - 1); 170 GridResolvedPosition resolvedGridLinePosition = adjustGridPositionForRowEndColumnEndSide(gridLines[gridLineIndex]);171 if (resolvedGridLinePosition < resolvedOppositePosition)172 resolvedGridLinePosition = resolvedOppositePosition ;160 GridResolvedPosition resolvedGridLinePosition = gridLines[gridLineIndex]; 161 if (resolvedGridLinePosition <= resolvedOppositePosition) 162 resolvedGridLinePosition = resolvedOppositePosition.next(); 173 163 return GridSpan(resolvedOppositePosition, resolvedGridLinePosition); 174 164 } … … 186 176 // If there is no named grid line of that name, we resolve the position to 'auto' (which is equivalent to 'span 1' in this case). 187 177 // See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html. 188 if (it == gridLinesNames.end()) 189 return GridSpan(resolvedOppositePosition, resolvedOppositePosition); 178 if (it == gridLinesNames.end()) { 179 if (isStartSide(side) && resolvedOppositePosition.toInt()) 180 return GridSpan(resolvedOppositePosition.prev(), resolvedOppositePosition); 181 return GridSpan(resolvedOppositePosition, resolvedOppositePosition.next()); 182 } 190 183 191 184 if (side == RowStartSide || side == ColumnStartSide) … … 197 190 static GridSpan resolveGridPositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side) 198 191 { 199 if (position.isAuto()) 200 return GridSpan(resolvedOppositePosition, resolvedOppositePosition); 192 if (position.isAuto()) { 193 if (isStartSide(side) && resolvedOppositePosition.toInt()) 194 return GridSpan(resolvedOppositePosition.prev(), resolvedOppositePosition); 195 return GridSpan(resolvedOppositePosition, resolvedOppositePosition.next()); 196 } 201 197 202 198 ASSERT(position.isSpan()); … … 210 206 // 'span 1' is contained inside a single grid track regardless of the direction. 211 207 // That's why the CSS span value is one more than the offset we apply. 212 unsigned positionOffset = position.spanPosition() - 1;208 unsigned positionOffset = position.spanPosition(); 213 209 if (isStartSide(side)) { 210 if (!resolvedOppositePosition.toInt()) 211 return GridSpan(resolvedOppositePosition, resolvedOppositePosition.next()); 212 214 213 unsigned initialResolvedPosition = std::max<int>(0, resolvedOppositePosition.toInt() - positionOffset); 215 214 return GridSpan(initialResolvedPosition, resolvedOppositePosition); … … 226 225 ASSERT(unresolvedSpan.requiresAutoPlacement()); 227 226 228 GridResolvedPosition resolvedFinalPosition = resolvedInitialPosition ;227 GridResolvedPosition resolvedFinalPosition = resolvedInitialPosition.next(); 229 228 230 229 if (unresolvedSpan.initialPosition().isSpan()) … … 316 315 // Infer the position from the final position ('auto / 1' or 'span 2 / 3' case). 317 316 auto finalResolvedPosition = resolveGridPositionFromStyle(gridContainerStyle, unresolvedSpan.finalPosition(), unresolvedSpan.finalPositionSide()); 318 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, finalResolvedPosition .prev(), unresolvedSpan.initialPosition(), unresolvedSpan.initialPositionSide());317 return resolveGridPositionAgainstOppositePosition(gridContainerStyle, finalResolvedPosition, unresolvedSpan.initialPosition(), unresolvedSpan.initialPositionSide()); 319 318 } 320 319 … … 330 329 if (resolvedInitialPosition > resolvedFinalPosition) 331 330 std::swap(resolvedInitialPosition, resolvedFinalPosition); 332 333 return GridSpan(resolvedInitialPosition, std::max(resolvedInitialPosition, resolvedFinalPosition.prev())); 331 else if (resolvedInitialPosition == resolvedFinalPosition) 332 resolvedFinalPosition = resolvedInitialPosition.next(); 333 334 return GridSpan(resolvedInitialPosition, std::max(resolvedInitialPosition, resolvedFinalPosition)); 334 335 } 335 336 -
trunk/Source/WebCore/rendering/style/GridResolvedPosition.h
r192414 r195808 72 72 }; 73 73 74 // This class represents a nindex into one of the dimensions of the grid array.74 // This class represents a line index into one of the dimensions of the grid array. 75 75 // Wraps an unsigned integer just for the purpose of knowing what we manipulate in the grid code. 76 76 class GridResolvedPosition {
Note: See TracChangeset
for help on using the changeset viewer.