OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 } else { | 544 } else { |
545 for (const auto& trackIndex : flexibleSizedTracksIndex) | 545 for (const auto& trackIndex : flexibleSizedTracksIndex) |
546 flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[
trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex())); | 546 flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[
trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex())); |
547 | 547 |
548 for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) { | 548 for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) { |
549 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i]
); | 549 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i]
); |
550 while (LayoutBox* gridItem = iterator.nextGridItem()) { | 550 while (LayoutBox* gridItem = iterator.nextGridItem()) { |
551 const GridSpan span = cachedGridSpan(*gridItem, direction); | 551 const GridSpan span = cachedGridSpan(*gridItem, direction); |
552 | 552 |
553 // Do not include already processed items. | 553 // Do not include already processed items. |
554 if (i > 0 && span.resolvedInitialPosition() <= flexibleSizedTrac
ksIndex[i - 1]) | 554 if (i > 0 && span.startLine() <= flexibleSizedTracksIndex[i - 1]
) |
555 continue; | 555 continue; |
556 | 556 |
557 flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tra
cks, span, direction, maxContentForChild(*gridItem, direction, sizingData.column
Tracks))); | 557 flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tra
cks, span, direction, maxContentForChild(*gridItem, direction, sizingData.column
Tracks))); |
558 } | 558 } |
559 } | 559 } |
560 } | 560 } |
561 | 561 |
562 for (const auto& trackIndex : flexibleSizedTracksIndex) { | 562 for (const auto& trackIndex : flexibleSizedTracksIndex) { |
563 GridTrackSize trackSize = gridTrackSize(direction, trackIndex); | 563 GridTrackSize trackSize = gridTrackSize(direction, trackIndex); |
564 | 564 |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 | 832 |
833 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 833 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
834 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t
rackIndex] : sizingData.rowTracks[trackIndex]; | 834 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t
rackIndex] : sizingData.rowTracks[trackIndex]; |
835 if (track.growthLimitIsInfinite()) | 835 if (track.growthLimitIsInfinite()) |
836 track.setGrowthLimit(track.baseSize()); | 836 track.setGrowthLimit(track.baseSize()); |
837 } | 837 } |
838 } | 838 } |
839 | 839 |
840 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid
TrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridT
rack& track, Vector<GridTrack>& columnTracks) | 840 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid
TrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridT
rack& track, Vector<GridTrack>& columnTracks) |
841 { | 841 { |
842 const size_t trackPosition = span.resolvedInitialPosition(); | 842 const size_t trackPosition = span.startLine(); |
843 GridTrackSize trackSize = gridTrackSize(direction, trackPosition); | 843 GridTrackSize trackSize = gridTrackSize(direction, trackPosition); |
844 | 844 |
845 if (trackSize.hasMinContentMinTrackBreadth()) | 845 if (trackSize.hasMinContentMinTrackBreadth()) |
846 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem
, direction, columnTracks))); | 846 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem
, direction, columnTracks))); |
847 else if (trackSize.hasMaxContentMinTrackBreadth()) | 847 else if (trackSize.hasMaxContentMinTrackBreadth()) |
848 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem
, direction, columnTracks))); | 848 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem
, direction, columnTracks))); |
849 else if (trackSize.hasAutoMinTrackBreadth()) | 849 else if (trackSize.hasAutoMinTrackBreadth()) |
850 track.setBaseSize(std::max(track.baseSize(), minSizeForChild(gridItem, d
irection, columnTracks))); | 850 track.setBaseSize(std::max(track.baseSize(), minSizeForChild(gridItem, d
irection, columnTracks))); |
851 | 851 |
852 if (trackSize.hasMinContentMaxTrackBreadth()) | 852 if (trackSize.hasMinContentMaxTrackBreadth()) |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 | 1104 |
1105 if (maximumColumnSize > gridColumnCount()) { | 1105 if (maximumColumnSize > gridColumnCount()) { |
1106 for (size_t row = 0; row < gridRowCount(); ++row) | 1106 for (size_t row = 0; row < gridRowCount(); ++row) |
1107 m_grid[row].grow(maximumColumnSize); | 1107 m_grid[row].grow(maximumColumnSize); |
1108 } | 1108 } |
1109 } | 1109 } |
1110 | 1110 |
1111 void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridArea& area) | 1111 void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridArea& area) |
1112 { | 1112 { |
1113 RELEASE_ASSERT(area.rows.isTranslatedDefinite() && area.columns.isTranslated
Definite()); | 1113 RELEASE_ASSERT(area.rows.isTranslatedDefinite() && area.columns.isTranslated
Definite()); |
1114 ensureGridSize(area.rows.resolvedFinalPosition(), area.columns.resolvedFinal
Position()); | 1114 ensureGridSize(area.rows.endLine(), area.columns.endLine()); |
1115 | 1115 |
1116 for (const auto& row : area.rows) { | 1116 for (const auto& row : area.rows) { |
1117 for (const auto& column: area.columns) | 1117 for (const auto& column: area.columns) |
1118 m_grid[row][column].append(&child); | 1118 m_grid[row][column].append(&child); |
1119 } | 1119 } |
1120 } | 1120 } |
1121 | 1121 |
1122 void LayoutGrid::placeItemsOnGrid() | 1122 void LayoutGrid::placeItemsOnGrid() |
1123 { | 1123 { |
1124 if (!m_gridIsDirty) | 1124 if (!m_gridIsDirty) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1192 populator.collectChild(child); | 1192 populator.collectChild(child); |
1193 m_gridItemsIndexesMap.set(child, childIndex++); | 1193 m_gridItemsIndexesMap.set(child, childIndex++); |
1194 | 1194 |
1195 // This function bypasses the cache (cachedGridArea()) as it is used to
build it. | 1195 // This function bypasses the cache (cachedGridArea()) as it is used to
build it. |
1196 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromS
tyle(*style(), *child, ForRows); | 1196 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromS
tyle(*style(), *child, ForRows); |
1197 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFr
omStyle(*style(), *child, ForColumns); | 1197 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFr
omStyle(*style(), *child, ForColumns); |
1198 m_gridItemArea.set(child, GridArea(rowPositions, columnPositions)); | 1198 m_gridItemArea.set(child, GridArea(rowPositions, columnPositions)); |
1199 | 1199 |
1200 // |positions| is 0 if we need to run the auto-placement algorithm. | 1200 // |positions| is 0 if we need to run the auto-placement algorithm. |
1201 if (!rowPositions.isIndefinite()) { | 1201 if (!rowPositions.isIndefinite()) { |
1202 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra
nslatedResolvedInitialPosition()); | 1202 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra
nslatedStartLine()); |
1203 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran
slatedResolvedFinalPosition()); | 1203 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran
slatedEndLine()); |
1204 } else { | 1204 } else { |
1205 // Grow the grid for items with a definite row span, getting the lar
gest such span. | 1205 // Grow the grid for items with a definite row span, getting the lar
gest such span. |
1206 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForRows); | 1206 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForRows); |
1207 maximumRowIndex = std::max(maximumRowIndex, spanSize); | 1207 maximumRowIndex = std::max(maximumRowIndex, spanSize); |
1208 } | 1208 } |
1209 | 1209 |
1210 if (!columnPositions.isIndefinite()) { | 1210 if (!columnPositions.isIndefinite()) { |
1211 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi
ons.untranslatedResolvedInitialPosition()); | 1211 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi
ons.untranslatedStartLine()); |
1212 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio
ns.untranslatedResolvedFinalPosition()); | 1212 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio
ns.untranslatedEndLine()); |
1213 } else { | 1213 } else { |
1214 // Grow the grid for items with a definite column span, getting the
largest such span. | 1214 // Grow the grid for items with a definite column span, getting the
largest such span. |
1215 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForColumns); | 1215 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForColumns); |
1216 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); | 1216 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); |
1217 } | 1217 } |
1218 } | 1218 } |
1219 | 1219 |
1220 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); | 1220 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); |
1221 for (auto& column : m_grid) | 1221 for (auto& column : m_grid) |
1222 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); | 1222 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); |
(...skipping 16 matching lines...) Expand all Loading... |
1239 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on | 1239 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on |
1240 // that track. This is needed to implement "sparse" packing for items locked
to a given track. | 1240 // that track. This is needed to implement "sparse" packing for items locked
to a given track. |
1241 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo | 1241 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo |
1242 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; | 1242 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; |
1243 | 1243 |
1244 for (const auto& autoGridItem : autoGridItems) { | 1244 for (const auto& autoGridItem : autoGridItems) { |
1245 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); | 1245 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); |
1246 ASSERT(majorAxisPositions.isTranslatedDefinite()); | 1246 ASSERT(majorAxisPositions.isTranslatedDefinite()); |
1247 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isTranslatedDefinite()); | 1247 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isTranslatedDefinite()); |
1248 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); | 1248 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); |
1249 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo
sition(); | 1249 unsigned majorAxisInitialPosition = majorAxisPositions.startLine(); |
1250 | 1250 |
1251 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.resolvedInitialPosition(), isGridAutoFlowDense ? 0 : minorAxisCursor
s.get(majorAxisInitialPosition)); | 1251 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxi
sInitialPosition)); |
1252 OwnPtr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPos
itions.integerSpan(), minorAxisSpanSize); | 1252 OwnPtr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPos
itions.integerSpan(), minorAxisSpanSize); |
1253 if (!emptyGridArea) | 1253 if (!emptyGridArea) |
1254 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); | 1254 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); |
1255 | 1255 |
1256 m_gridItemArea.set(autoGridItem, *emptyGridArea); | 1256 m_gridItemArea.set(autoGridItem, *emptyGridArea); |
1257 insertItemIntoGrid(*autoGridItem, *emptyGridArea); | 1257 insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
1258 | 1258 |
1259 if (!isGridAutoFlowDense) | 1259 if (!isGridAutoFlowDense) |
1260 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG
ridArea->rows.resolvedInitialPosition() : emptyGridArea->columns.resolvedInitial
Position()); | 1260 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG
ridArea->rows.startLine() : emptyGridArea->columns.startLine()); |
1261 } | 1261 } |
1262 } | 1262 } |
1263 | 1263 |
1264 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri
dItems) | 1264 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri
dItems) |
1265 { | 1265 { |
1266 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); | 1266 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); |
1267 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1267 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
1268 | 1268 |
1269 for (const auto& autoGridItem : autoGridItems) { | 1269 for (const auto& autoGridItem : autoGridItems) { |
1270 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); | 1270 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); |
(...skipping 12 matching lines...) Expand all Loading... |
1283 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl
atedDefinite()); | 1283 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl
atedDefinite()); |
1284 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
*style(), gridItem, autoPlacementMajorAxisDirection()); | 1284 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
*style(), gridItem, autoPlacementMajorAxisDirection()); |
1285 | 1285 |
1286 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); | 1286 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); |
1287 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; | 1287 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; |
1288 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; | 1288 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
1289 | 1289 |
1290 OwnPtr<GridArea> emptyGridArea; | 1290 OwnPtr<GridArea> emptyGridArea; |
1291 if (minorAxisPositions.isTranslatedDefinite()) { | 1291 if (minorAxisPositions.isTranslatedDefinite()) { |
1292 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. | 1292 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. |
1293 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen
tCursor) | 1293 if (minorAxisPositions.startLine() < minorAxisAutoPlacementCursor) |
1294 majorAxisAutoPlacementCursor++; | 1294 majorAxisAutoPlacementCursor++; |
1295 | 1295 |
1296 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { | 1296 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
1297 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor); | 1297 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.startLine(), majorAxisAutoPlacementCursor); |
1298 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); | 1298 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); |
1299 } | 1299 } |
1300 | 1300 |
1301 if (!emptyGridArea) | 1301 if (!emptyGridArea) |
1302 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); | 1302 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); |
1303 } else { | 1303 } else { |
1304 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), gridItem, autoPlacementMinorAxisDirection()); | 1304 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), gridItem, autoPlacementMinorAxisDirection()); |
1305 | 1305 |
1306 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde
x < endOfMajorAxis; ++majorAxisIndex) { | 1306 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde
x < endOfMajorAxis; ++majorAxisIndex) { |
1307 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex, minorAxisAutoPlacementCursor); | 1307 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex, minorAxisAutoPlacementCursor); |
1308 emptyGridArea = iterator.nextEmptyGridArea(majorAxisSpanSize, minorA
xisSpanSize); | 1308 emptyGridArea = iterator.nextEmptyGridArea(majorAxisSpanSize, minorA
xisSpanSize); |
1309 | 1309 |
1310 if (emptyGridArea) { | 1310 if (emptyGridArea) { |
1311 // Check that it fits in the minor axis direction, as we shouldn
't grow in that direction here (it was already managed in populateExplicitGridAn
dOrderIterator()). | 1311 // Check that it fits in the minor axis direction, as we shouldn
't grow in that direction here (it was already managed in populateExplicitGridAn
dOrderIterator()). |
1312 size_t minorAxisFinalPositionIndex = autoPlacementMinorAxisDirec
tion() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGri
dArea->rows.resolvedFinalPosition(); | 1312 size_t minorAxisFinalPositionIndex = autoPlacementMinorAxisDirec
tion() == ForColumns ? emptyGridArea->columns.endLine() : emptyGridArea->rows.en
dLine(); |
1313 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection()
== ForColumns ? gridColumnCount() : gridRowCount(); | 1313 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection()
== ForColumns ? gridColumnCount() : gridRowCount(); |
1314 if (minorAxisFinalPositionIndex <= endOfMinorAxis) | 1314 if (minorAxisFinalPositionIndex <= endOfMinorAxis) |
1315 break; | 1315 break; |
1316 | 1316 |
1317 // Discard empty grid area as it does not fit in the minor axis
direction. | 1317 // Discard empty grid area as it does not fit in the minor axis
direction. |
1318 // We don't need to create a new empty grid area yet as we might
find a valid one in the next iteration. | 1318 // We don't need to create a new empty grid area yet as we might
find a valid one in the next iteration. |
1319 emptyGridArea = nullptr; | 1319 emptyGridArea = nullptr; |
1320 } | 1320 } |
1321 | 1321 |
1322 // As we're moving to the next track in the major axis we should res
et the auto-placement cursor in the minor axis. | 1322 // As we're moving to the next track in the major axis we should res
et the auto-placement cursor in the minor axis. |
1323 minorAxisAutoPlacementCursor = 0; | 1323 minorAxisAutoPlacementCursor = 0; |
1324 } | 1324 } |
1325 | 1325 |
1326 if (!emptyGridArea) | 1326 if (!emptyGridArea) |
1327 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan
(0, minorAxisSpanSize)); | 1327 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan
(0, minorAxisSpanSize)); |
1328 } | 1328 } |
1329 | 1329 |
1330 m_gridItemArea.set(&gridItem, *emptyGridArea); | 1330 m_gridItemArea.set(&gridItem, *emptyGridArea); |
1331 insertItemIntoGrid(gridItem, *emptyGridArea); | 1331 insertItemIntoGrid(gridItem, *emptyGridArea); |
1332 // Move auto-placement cursor to the new position. | 1332 // Move auto-placement cursor to the new position. |
1333 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition(); | 1333 autoPlacementCursor.first = emptyGridArea->rows.startLine(); |
1334 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition(
); | 1334 autoPlacementCursor.second = emptyGridArea->columns.startLine(); |
1335 } | 1335 } |
1336 | 1336 |
1337 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const | 1337 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const |
1338 { | 1338 { |
1339 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; | 1339 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; |
1340 } | 1340 } |
1341 | 1341 |
1342 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const | 1342 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const |
1343 { | 1343 { |
1344 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; | 1344 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1431 applyStretchAlignmentToChildIfNeeded(*child); | 1431 applyStretchAlignmentToChildIfNeeded(*child); |
1432 | 1432 |
1433 child->layoutIfNeeded(); | 1433 child->layoutIfNeeded(); |
1434 | 1434 |
1435 // We need pending layouts to be done in order to compute auto-margins p
roperly. | 1435 // We need pending layouts to be done in order to compute auto-margins p
roperly. |
1436 updateAutoMarginsInColumnAxisIfNeeded(*child); | 1436 updateAutoMarginsInColumnAxisIfNeeded(*child); |
1437 updateAutoMarginsInRowAxisIfNeeded(*child); | 1437 updateAutoMarginsInRowAxisIfNeeded(*child); |
1438 | 1438 |
1439 #if ENABLE(ASSERT) | 1439 #if ENABLE(ASSERT) |
1440 const GridArea& area = cachedGridArea(*child); | 1440 const GridArea& area = cachedGridArea(*child); |
1441 ASSERT(area.columns.resolvedInitialPosition() < sizingData.columnTracks.
size()); | 1441 ASSERT(area.columns.startLine() < sizingData.columnTracks.size()); |
1442 ASSERT(area.rows.resolvedInitialPosition() < sizingData.rowTracks.size()
); | 1442 ASSERT(area.rows.startLine() < sizingData.rowTracks.size()); |
1443 #endif | 1443 #endif |
1444 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); | 1444 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); |
1445 | 1445 |
1446 // Keep track of children overflowing their grid area as we might need t
o paint them even if the grid-area is | 1446 // Keep track of children overflowing their grid area as we might need t
o paint them even if the grid-area is |
1447 // not visible | 1447 // not visible |
1448 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight | 1448 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight |
1449 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt
h) | 1449 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt
h) |
1450 m_gridItemsOverflowingGridArea.append(child); | 1450 m_gridItemsOverflowingGridArea.append(child); |
1451 } | 1451 } |
1452 } | 1452 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1498 | 1498 |
1499 GridSpan positions = GridPositionsResolver::resolveGridPositionsFromStyle(*s
tyle(), child, direction); | 1499 GridSpan positions = GridPositionsResolver::resolveGridPositionsFromStyle(*s
tyle(), child, direction); |
1500 if (positions.isIndefinite()) { | 1500 if (positions.isIndefinite()) { |
1501 offset = LayoutUnit(); | 1501 offset = LayoutUnit(); |
1502 breadth = isForColumns ? clientLogicalWidth() : clientLogicalHeight(); | 1502 breadth = isForColumns ? clientLogicalWidth() : clientLogicalHeight(); |
1503 return; | 1503 return; |
1504 } | 1504 } |
1505 | 1505 |
1506 // For positioned items we cannot use GridSpan::translate(). Because we coul
d end up with negative values, as the positioned items do not create implicit tr
acks per spec. | 1506 // For positioned items we cannot use GridSpan::translate(). Because we coul
d end up with negative values, as the positioned items do not create implicit tr
acks per spec. |
1507 int smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRow
Start); | 1507 int smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRow
Start); |
1508 int resolvedInitialPosition = positions.untranslatedResolvedInitialPosition(
) + smallestStart; | 1508 int startLine = positions.untranslatedStartLine() + smallestStart; |
1509 int resolvedFinalPosition = positions.untranslatedResolvedFinalPosition() +
smallestStart; | 1509 int endLine = positions.untranslatedEndLine() + smallestStart; |
1510 | 1510 |
1511 GridPosition startPosition = isForColumns ? child.style()->gridColumnStart()
: child.style()->gridRowStart(); | 1511 GridPosition startPosition = isForColumns ? child.style()->gridColumnStart()
: child.style()->gridRowStart(); |
1512 GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : c
hild.style()->gridRowEnd(); | 1512 GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : c
hild.style()->gridRowEnd(); |
1513 int firstExplicitLine = smallestStart; | 1513 int firstExplicitLine = smallestStart; |
1514 int lastExplicitLine = (isForColumns ? GridPositionsResolver::explicitGridCo
lumnCount(styleRef()) : GridPositionsResolver::explicitGridRowCount(styleRef()))
+ smallestStart; | 1514 int lastExplicitLine = (isForColumns ? GridPositionsResolver::explicitGridCo
lumnCount(styleRef()) : GridPositionsResolver::explicitGridRowCount(styleRef()))
+ smallestStart; |
1515 | 1515 |
1516 bool startIsAuto = startPosition.isAuto() | 1516 bool startIsAuto = startPosition.isAuto() |
1517 || (startPosition.isNamedGridArea() && !GridPositionsResolver::isValidNa
medLineOrArea(startPosition.namedGridLine(), styleRef(), GridPositionsResolver::
initialPositionSide(direction))) | 1517 || (startPosition.isNamedGridArea() && !GridPositionsResolver::isValidNa
medLineOrArea(startPosition.namedGridLine(), styleRef(), GridPositionsResolver::
initialPositionSide(direction))) |
1518 || (resolvedInitialPosition < firstExplicitLine) | 1518 || (startLine < firstExplicitLine) |
1519 || (resolvedInitialPosition > lastExplicitLine); | 1519 || (startLine > lastExplicitLine); |
1520 bool endIsAuto = endPosition.isAuto() | 1520 bool endIsAuto = endPosition.isAuto() |
1521 || (endPosition.isNamedGridArea() && !GridPositionsResolver::isValidName
dLineOrArea(endPosition.namedGridLine(), styleRef(), GridPositionsResolver::fina
lPositionSide(direction))) | 1521 || (endPosition.isNamedGridArea() && !GridPositionsResolver::isValidName
dLineOrArea(endPosition.namedGridLine(), styleRef(), GridPositionsResolver::fina
lPositionSide(direction))) |
1522 || (resolvedFinalPosition < firstExplicitLine) | 1522 || (endLine < firstExplicitLine) |
1523 || (resolvedFinalPosition > lastExplicitLine); | 1523 || (endLine > lastExplicitLine); |
1524 | 1524 |
1525 size_t initialPosition = startIsAuto ? 0 : resolvedInitialPosition; | 1525 size_t initialPosition = startIsAuto ? 0 : startLine; |
1526 size_t finalPosition = endIsAuto ? lastExplicitLine : resolvedFinalPosition; | 1526 size_t finalPosition = endIsAuto ? lastExplicitLine : endLine; |
1527 | 1527 |
1528 LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPosi
tions[initialPosition] : m_rowPositions[initialPosition]; | 1528 LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPosi
tions[initialPosition] : m_rowPositions[initialPosition]; |
1529 LayoutUnit end = endIsAuto ? isForColumns ? logicalWidth() : logicalHeight()
: isForColumns ? m_columnPositions[finalPosition] : m_rowPositions[finalPositi
on]; | 1529 LayoutUnit end = endIsAuto ? isForColumns ? logicalWidth() : logicalHeight()
: isForColumns ? m_columnPositions[finalPosition] : m_rowPositions[finalPositi
on]; |
1530 | 1530 |
1531 breadth = end - start; | 1531 breadth = end - start; |
1532 | 1532 |
1533 if (startIsAuto) | 1533 if (startIsAuto) |
1534 breadth -= isForColumns ? borderStart() : borderBefore(); | 1534 breadth -= isForColumns ? borderStart() : borderBefore(); |
1535 else | 1535 else |
1536 start -= isForColumns ? borderStart() : borderBefore(); | 1536 start -= isForColumns ? borderStart() : borderBefore(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1576 return gridAreaBreadth; | 1576 return gridAreaBreadth; |
1577 } | 1577 } |
1578 | 1578 |
1579 LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La
youtBox& child, GridTrackSizingDirection direction, const GridSizingData& sizing
Data) const | 1579 LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La
youtBox& child, GridTrackSizingDirection direction, const GridSizingData& sizing
Data) const |
1580 { | 1580 { |
1581 // We need the cached value when available because Content Distribution alig
nment properties | 1581 // We need the cached value when available because Content Distribution alig
nment properties |
1582 // may have some influence in the final grid area breadth. | 1582 // may have some influence in the final grid area breadth. |
1583 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col
umnTracks : sizingData.rowTracks; | 1583 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col
umnTracks : sizingData.rowTracks; |
1584 const GridSpan& span = cachedGridSpan(child, direction); | 1584 const GridSpan& span = cachedGridSpan(child, direction); |
1585 const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_colu
mnPositions : m_rowPositions; | 1585 const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_colu
mnPositions : m_rowPositions; |
1586 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition
()]; | 1586 LayoutUnit initialTrackPosition = linePositions[span.startLine()]; |
1587 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition() -
1]; | 1587 LayoutUnit finalTrackPosition = linePositions[span.endLine() - 1]; |
1588 // Track Positions vector stores the 'start' grid line of each track, so w h
ave to add last track's baseSize. | 1588 // Track Positions vector stores the 'start' grid line of each track, so w h
ave to add last track's baseSize. |
1589 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinal
Position() - 1].baseSize(); | 1589 return finalTrackPosition - initialTrackPosition + tracks[span.endLine() - 1
].baseSize(); |
1590 } | 1590 } |
1591 | 1591 |
1592 void LayoutGrid::populateGridPositions(GridSizingData& sizingData) | 1592 void LayoutGrid::populateGridPositions(GridSizingData& sizingData) |
1593 { | 1593 { |
1594 // Since we add alignment offsets and track gutters, grid lines are not alwa
ys adjacent. Hence we will have to | 1594 // Since we add alignment offsets and track gutters, grid lines are not alwa
ys adjacent. Hence we will have to |
1595 // assume from now on that we just store positions of the initial grid lines
of each track, | 1595 // assume from now on that we just store positions of the initial grid lines
of each track, |
1596 // except the last one, which is the only one considered as a final grid lin
e of a track. | 1596 // except the last one, which is the only one considered as a final grid lin
e of a track. |
1597 // FIXME: This will affect the computed style value of grid tracks size, sin
ce we are | 1597 // FIXME: This will affect the computed style value of grid tracks size, sin
ce we are |
1598 // using these positions to compute them. | 1598 // using these positions to compute them. |
1599 | 1599 |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1886 | 1886 |
1887 static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distributio
n, const Vector<LayoutUnit>& trackPositions, const LayoutUnit& childBreadth) | 1887 static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distributio
n, const Vector<LayoutUnit>& trackPositions, const LayoutUnit& childBreadth) |
1888 { | 1888 { |
1889 return (distribution == ContentDistributionStretch || ContentDistributionStr
etch == ContentDistributionDefault) ? LayoutUnit() : trackPositions[1] - trackPo
sitions[0] - childBreadth; | 1889 return (distribution == ContentDistributionStretch || ContentDistributionStr
etch == ContentDistributionDefault) ? LayoutUnit() : trackPositions[1] - trackPo
sitions[0] - childBreadth; |
1890 | 1890 |
1891 } | 1891 } |
1892 | 1892 |
1893 LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const | 1893 LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const |
1894 { | 1894 { |
1895 const GridSpan& rowsSpan = cachedGridSpan(child, ForRows); | 1895 const GridSpan& rowsSpan = cachedGridSpan(child, ForRows); |
1896 size_t childStartLine = rowsSpan.resolvedInitialPosition(); | 1896 size_t childStartLine = rowsSpan.startLine(); |
1897 LayoutUnit startOfRow = m_rowPositions[childStartLine]; | 1897 LayoutUnit startOfRow = m_rowPositions[childStartLine]; |
1898 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); | 1898 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); |
1899 if (hasAutoMarginsInColumnAxis(child)) | 1899 if (hasAutoMarginsInColumnAxis(child)) |
1900 return startPosition; | 1900 return startPosition; |
1901 GridAxisPosition axisPosition = columnAxisPositionForChild(child); | 1901 GridAxisPosition axisPosition = columnAxisPositionForChild(child); |
1902 switch (axisPosition) { | 1902 switch (axisPosition) { |
1903 case GridAxisStart: | 1903 case GridAxisStart: |
1904 return startPosition; | 1904 return startPosition; |
1905 case GridAxisEnd: | 1905 case GridAxisEnd: |
1906 case GridAxisCenter: { | 1906 case GridAxisCenter: { |
1907 size_t childEndLine = rowsSpan.resolvedFinalPosition(); | 1907 size_t childEndLine = rowsSpan.endLine(); |
1908 LayoutUnit endOfRow = m_rowPositions[childEndLine]; | 1908 LayoutUnit endOfRow = m_rowPositions[childEndLine]; |
1909 // m_rowPositions include gutters so we need to subtract them to get the
actual end position for a given | 1909 // m_rowPositions include gutters so we need to subtract them to get the
actual end position for a given |
1910 // row (this does not have to be done for the last track as there are no
more m_rowPositions after it) | 1910 // row (this does not have to be done for the last track as there are no
more m_rowPositions after it) |
1911 if (childEndLine < m_rowPositions.size() - 1) | 1911 if (childEndLine < m_rowPositions.size() - 1) |
1912 endOfRow -= guttersSize(ForRows, 2); | 1912 endOfRow -= guttersSize(ForRows, 2); |
1913 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHei
ght(); | 1913 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHei
ght(); |
1914 if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.s
ize() - 1) | 1914 if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.s
ize() - 1) |
1915 endOfRow -= offsetBetweenTracks(styleRef().resolvedAlignContentDistr
ibution(normalValueBehavior()), m_rowPositions, childBreadth); | 1915 endOfRow -= offsetBetweenTracks(styleRef().resolvedAlignContentDistr
ibution(normalValueBehavior()), m_rowPositions, childBreadth); |
1916 OverflowAlignment overflow = child.styleRef().resolvedAlignment(styleRef
(), ItemPositionStretch).overflow(); | 1916 OverflowAlignment overflow = child.styleRef().resolvedAlignment(styleRef
(), ItemPositionStretch).overflow(); |
1917 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(over
flow, endOfRow - startOfRow, childBreadth); | 1917 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(over
flow, endOfRow - startOfRow, childBreadth); |
1918 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos
ition : offsetFromStartPosition / 2); | 1918 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos
ition : offsetFromStartPosition / 2); |
1919 } | 1919 } |
1920 } | 1920 } |
1921 | 1921 |
1922 ASSERT_NOT_REACHED(); | 1922 ASSERT_NOT_REACHED(); |
1923 return LayoutUnit(); | 1923 return LayoutUnit(); |
1924 } | 1924 } |
1925 | 1925 |
1926 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const | 1926 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const |
1927 { | 1927 { |
1928 const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns); | 1928 const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns); |
1929 size_t childStartLine = columnsSpan.resolvedInitialPosition(); | 1929 size_t childStartLine = columnsSpan.startLine(); |
1930 LayoutUnit startOfColumn = m_columnPositions[childStartLine]; | 1930 LayoutUnit startOfColumn = m_columnPositions[childStartLine]; |
1931 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); | 1931 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); |
1932 if (hasAutoMarginsInRowAxis(child)) | 1932 if (hasAutoMarginsInRowAxis(child)) |
1933 return startPosition; | 1933 return startPosition; |
1934 GridAxisPosition axisPosition = rowAxisPositionForChild(child); | 1934 GridAxisPosition axisPosition = rowAxisPositionForChild(child); |
1935 switch (axisPosition) { | 1935 switch (axisPosition) { |
1936 case GridAxisStart: | 1936 case GridAxisStart: |
1937 return startPosition; | 1937 return startPosition; |
1938 case GridAxisEnd: | 1938 case GridAxisEnd: |
1939 case GridAxisCenter: { | 1939 case GridAxisCenter: { |
1940 size_t childEndLine = columnsSpan.resolvedFinalPosition(); | 1940 size_t childEndLine = columnsSpan.endLine(); |
1941 LayoutUnit endOfColumn = m_columnPositions[childEndLine]; | 1941 LayoutUnit endOfColumn = m_columnPositions[childEndLine]; |
1942 // m_columnPositions include gutters so we need to subtract them to get
the actual end position for a given | 1942 // m_columnPositions include gutters so we need to subtract them to get
the actual end position for a given |
1943 // column (this does not have to be done for the last track as there are
no more m_columnPositions after it) | 1943 // column (this does not have to be done for the last track as there are
no more m_columnPositions after it) |
1944 if (childEndLine < m_columnPositions.size() - 1) | 1944 if (childEndLine < m_columnPositions.size() - 1) |
1945 endOfColumn -= guttersSize(ForRows, 2); | 1945 endOfColumn -= guttersSize(ForRows, 2); |
1946 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidt
h(); | 1946 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidt
h(); |
1947 if (childEndLine - childStartLine > 1 && childEndLine < m_columnPosition
s.size() - 1) | 1947 if (childEndLine - childStartLine > 1 && childEndLine < m_columnPosition
s.size() - 1) |
1948 endOfColumn -= offsetBetweenTracks(styleRef().resolvedJustifyContent
Distribution(normalValueBehavior()), m_columnPositions, childBreadth); | 1948 endOfColumn -= offsetBetweenTracks(styleRef().resolvedJustifyContent
Distribution(normalValueBehavior()), m_columnPositions, childBreadth); |
1949 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil
d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childB
readth); | 1949 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil
d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childB
readth); |
1950 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos
ition : offsetFromStartPosition / 2); | 1950 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos
ition : offsetFromStartPosition / 2); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2069 | 2069 |
2070 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); | 2070 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); |
2071 } | 2071 } |
2072 | 2072 |
2073 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const | 2073 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const |
2074 { | 2074 { |
2075 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2075 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2076 } | 2076 } |
2077 | 2077 |
2078 } // namespace blink | 2078 } // namespace blink |
OLD | NEW |