| 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 14 matching lines...) Expand all Loading... |
| 25 | 25 |
| 26 #include "core/layout/LayoutGrid.h" | 26 #include "core/layout/LayoutGrid.h" |
| 27 | 27 |
| 28 #include "core/layout/LayoutState.h" | 28 #include "core/layout/LayoutState.h" |
| 29 #include "core/layout/TextAutosizer.h" | 29 #include "core/layout/TextAutosizer.h" |
| 30 #include "core/paint/GridPainter.h" | 30 #include "core/paint/GridPainter.h" |
| 31 #include "core/paint/PaintLayer.h" | 31 #include "core/paint/PaintLayer.h" |
| 32 #include "core/style/ComputedStyle.h" | 32 #include "core/style/ComputedStyle.h" |
| 33 #include "core/style/GridArea.h" | 33 #include "core/style/GridArea.h" |
| 34 #include "platform/LengthFunctions.h" | 34 #include "platform/LengthFunctions.h" |
| 35 #include "wtf/PtrUtil.h" |
| 35 #include <algorithm> | 36 #include <algorithm> |
| 37 #include <memory> |
| 36 | 38 |
| 37 namespace blink { | 39 namespace blink { |
| 38 | 40 |
| 39 static const int infinity = -1; | 41 static const int infinity = -1; |
| 40 | 42 |
| 41 class GridItemWithSpan; | 43 class GridItemWithSpan; |
| 42 | 44 |
| 43 class GridTrack { | 45 class GridTrack { |
| 44 public: | 46 public: |
| 45 GridTrack() | 47 GridTrack() |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 for (size_t column = m_columnIndex; column < maxColumns; ++column) { | 194 for (size_t column = m_columnIndex; column < maxColumns; ++column) { |
| 193 const GridCell& children = m_grid[row][column]; | 195 const GridCell& children = m_grid[row][column]; |
| 194 if (!children.isEmpty()) | 196 if (!children.isEmpty()) |
| 195 return false; | 197 return false; |
| 196 } | 198 } |
| 197 } | 199 } |
| 198 | 200 |
| 199 return true; | 201 return true; |
| 200 } | 202 } |
| 201 | 203 |
| 202 PassOwnPtr<GridArea> nextEmptyGridArea(size_t fixedTrackSpan, size_t varying
TrackSpan) | 204 std::unique_ptr<GridArea> nextEmptyGridArea(size_t fixedTrackSpan, size_t va
ryingTrackSpan) |
| 203 { | 205 { |
| 204 DCHECK(!m_grid.isEmpty()); | 206 DCHECK(!m_grid.isEmpty()); |
| 205 DCHECK(!m_grid[0].isEmpty()); | 207 DCHECK(!m_grid[0].isEmpty()); |
| 206 ASSERT(fixedTrackSpan >= 1 && varyingTrackSpan >= 1); | 208 ASSERT(fixedTrackSpan >= 1 && varyingTrackSpan >= 1); |
| 207 | 209 |
| 208 size_t rowSpan = (m_direction == ForColumns) ? varyingTrackSpan : fixedT
rackSpan; | 210 size_t rowSpan = (m_direction == ForColumns) ? varyingTrackSpan : fixedT
rackSpan; |
| 209 size_t columnSpan = (m_direction == ForColumns) ? fixedTrackSpan : varyi
ngTrackSpan; | 211 size_t columnSpan = (m_direction == ForColumns) ? fixedTrackSpan : varyi
ngTrackSpan; |
| 210 | 212 |
| 211 size_t& varyingTrackIndex = (m_direction == ForColumns) ? m_rowIndex : m
_columnIndex; | 213 size_t& varyingTrackIndex = (m_direction == ForColumns) ? m_rowIndex : m
_columnIndex; |
| 212 const size_t endOfVaryingTrackIndex = (m_direction == ForColumns) ? m_gr
id.size() : m_grid[0].size(); | 214 const size_t endOfVaryingTrackIndex = (m_direction == ForColumns) ? m_gr
id.size() : m_grid[0].size(); |
| 213 for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex)
{ | 215 for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex)
{ |
| 214 if (checkEmptyCells(rowSpan, columnSpan)) { | 216 if (checkEmptyCells(rowSpan, columnSpan)) { |
| 215 OwnPtr<GridArea> result = adoptPtr(new GridArea(GridSpan::transl
atedDefiniteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::translatedDefi
niteGridSpan(m_columnIndex, m_columnIndex + columnSpan))); | 217 std::unique_ptr<GridArea> result = wrapUnique(new GridArea(GridS
pan::translatedDefiniteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::tra
nslatedDefiniteGridSpan(m_columnIndex, m_columnIndex + columnSpan))); |
| 216 // Advance the iterator to avoid an infinite loop where we would
return the same grid area over and over. | 218 // Advance the iterator to avoid an infinite loop where we would
return the same grid area over and over. |
| 217 ++varyingTrackIndex; | 219 ++varyingTrackIndex; |
| 218 return result; | 220 return result; |
| 219 } | 221 } |
| 220 } | 222 } |
| 221 return nullptr; | 223 return nullptr; |
| 222 } | 224 } |
| 223 | 225 |
| 224 private: | 226 private: |
| 225 const GridRepresentation& m_grid; | 227 const GridRepresentation& m_grid; |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 return usedBreadth; | 629 return usedBreadth; |
| 628 | 630 |
| 629 const Length& trackLength = gridLength.length(); | 631 const Length& trackLength = gridLength.length(); |
| 630 if (trackLength.isSpecified()) | 632 if (trackLength.isSpecified()) |
| 631 return valueForLength(trackLength, maxSize); | 633 return valueForLength(trackLength, maxSize); |
| 632 | 634 |
| 633 ASSERT(trackLength.isMinContent() || trackLength.isAuto() || trackLength.isM
axContent()); | 635 ASSERT(trackLength.isMinContent() || trackLength.isAuto() || trackLength.isM
axContent()); |
| 634 return LayoutUnit(infinity); | 636 return LayoutUnit(infinity); |
| 635 } | 637 } |
| 636 | 638 |
| 637 double LayoutGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, Gr
idTrackSizingDirection direction, double flexFactorSum, LayoutUnit& leftOverSpac
e, const Vector<size_t, 8>& flexibleTracksIndexes, PassOwnPtr<TrackIndexSet> tra
cksToTreatAsInflexible) const | 639 double LayoutGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, Gr
idTrackSizingDirection direction, double flexFactorSum, LayoutUnit& leftOverSpac
e, const Vector<size_t, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet
> tracksToTreatAsInflexible) const |
| 638 { | 640 { |
| 639 // We want to avoid the effect of flex factors sum below 1 making the factor
unit size to grow exponentially. | 641 // We want to avoid the effect of flex factors sum below 1 making the factor
unit size to grow exponentially. |
| 640 double hypotheticalFactorUnitSize = leftOverSpace / std::max<double>(1, flex
FactorSum); | 642 double hypotheticalFactorUnitSize = leftOverSpace / std::max<double>(1, flex
FactorSum); |
| 641 | 643 |
| 642 // product of the hypothetical "flex factor unit" and any flexible track's "
flex factor" must be grater than such track's "base size". | 644 // product of the hypothetical "flex factor unit" and any flexible track's "
flex factor" must be grater than such track's "base size". |
| 643 OwnPtr<TrackIndexSet> additionalTracksToTreatAsInflexible = std::move(tracks
ToTreatAsInflexible); | 645 std::unique_ptr<TrackIndexSet> additionalTracksToTreatAsInflexible = std::mo
ve(tracksToTreatAsInflexible); |
| 644 bool validFlexFactorUnit = true; | 646 bool validFlexFactorUnit = true; |
| 645 for (auto index : flexibleTracksIndexes) { | 647 for (auto index : flexibleTracksIndexes) { |
| 646 if (additionalTracksToTreatAsInflexible && additionalTracksToTreatAsInfl
exible->contains(index)) | 648 if (additionalTracksToTreatAsInflexible && additionalTracksToTreatAsInfl
exible->contains(index)) |
| 647 continue; | 649 continue; |
| 648 LayoutUnit baseSize = tracks[index].baseSize(); | 650 LayoutUnit baseSize = tracks[index].baseSize(); |
| 649 double flexFactor = gridTrackSize(direction, index).maxTrackBreadth().fl
ex(); | 651 double flexFactor = gridTrackSize(direction, index).maxTrackBreadth().fl
ex(); |
| 650 // treating all such tracks as inflexible. | 652 // treating all such tracks as inflexible. |
| 651 if (baseSize > hypotheticalFactorUnitSize * flexFactor) { | 653 if (baseSize > hypotheticalFactorUnitSize * flexFactor) { |
| 652 leftOverSpace -= baseSize; | 654 leftOverSpace -= baseSize; |
| 653 flexFactorSum -= flexFactor; | 655 flexFactorSum -= flexFactor; |
| 654 if (!additionalTracksToTreatAsInflexible) | 656 if (!additionalTracksToTreatAsInflexible) |
| 655 additionalTracksToTreatAsInflexible = adoptPtr(new TrackIndexSet
()); | 657 additionalTracksToTreatAsInflexible = wrapUnique(new TrackIndexS
et()); |
| 656 additionalTracksToTreatAsInflexible->add(index); | 658 additionalTracksToTreatAsInflexible->add(index); |
| 657 validFlexFactorUnit = false; | 659 validFlexFactorUnit = false; |
| 658 } | 660 } |
| 659 } | 661 } |
| 660 if (!validFlexFactorUnit) | 662 if (!validFlexFactorUnit) |
| 661 return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftO
verSpace, flexibleTracksIndexes, std::move(additionalTracksToTreatAsInflexible))
; | 663 return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftO
verSpace, flexibleTracksIndexes, std::move(additionalTracksToTreatAsInflexible))
; |
| 662 return hypotheticalFactorUnitSize; | 664 return hypotheticalFactorUnitSize; |
| 663 } | 665 } |
| 664 | 666 |
| 665 double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const
GridSpan& tracksSpan, GridTrackSizingDirection direction, LayoutUnit leftOverSp
ace) const | 667 double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const
GridSpan& tracksSpan, GridTrackSizingDirection direction, LayoutUnit leftOverSp
ace) const |
| (...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1406 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForColumns); | 1408 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForColumns); |
| 1407 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); | 1409 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); |
| 1408 } | 1410 } |
| 1409 } | 1411 } |
| 1410 | 1412 |
| 1411 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); | 1413 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); |
| 1412 for (auto& column : m_grid) | 1414 for (auto& column : m_grid) |
| 1413 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); | 1415 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); |
| 1414 } | 1416 } |
| 1415 | 1417 |
| 1416 PassOwnPtr<GridArea> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideG
rid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection, cons
t GridSpan& specifiedPositions) const | 1418 std::unique_ptr<GridArea> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOut
sideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection,
const GridSpan& specifiedPositions) const |
| 1417 { | 1419 { |
| 1418 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; | 1420 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; |
| 1419 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); | 1421 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); |
| 1420 size_t crossDirectionSpanSize = GridPositionsResolver::spanSizeForAutoPlaced
Item(*style(), gridItem, crossDirection); | 1422 size_t crossDirectionSpanSize = GridPositionsResolver::spanSizeForAutoPlaced
Item(*style(), gridItem, crossDirection); |
| 1421 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endO
fCrossDirection, endOfCrossDirection + crossDirectionSpanSize); | 1423 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endO
fCrossDirection, endOfCrossDirection + crossDirectionSpanSize); |
| 1422 return adoptPtr(new GridArea(specifiedDirection == ForColumns ? crossDirecti
onPositions : specifiedPositions, specifiedDirection == ForColumns ? specifiedPo
sitions : crossDirectionPositions)); | 1424 return wrapUnique(new GridArea(specifiedDirection == ForColumns ? crossDirec
tionPositions : specifiedPositions, specifiedDirection == ForColumns ? specified
Positions : crossDirectionPositions)); |
| 1423 } | 1425 } |
| 1424 | 1426 |
| 1425 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) | 1427 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) |
| 1426 { | 1428 { |
| 1427 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; | 1429 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; |
| 1428 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1430 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
| 1429 | 1431 |
| 1430 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on | 1432 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on |
| 1431 // that track. This is needed to implement "sparse" packing for items locked
to a given track. | 1433 // that track. This is needed to implement "sparse" packing for items locked
to a given track. |
| 1432 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo | 1434 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo |
| 1433 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; | 1435 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; |
| 1434 | 1436 |
| 1435 for (const auto& autoGridItem : autoGridItems) { | 1437 for (const auto& autoGridItem : autoGridItems) { |
| 1436 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); | 1438 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); |
| 1437 ASSERT(majorAxisPositions.isTranslatedDefinite()); | 1439 ASSERT(majorAxisPositions.isTranslatedDefinite()); |
| 1438 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isTranslatedDefinite()); | 1440 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isTranslatedDefinite()); |
| 1439 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); | 1441 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); |
| 1440 unsigned majorAxisInitialPosition = majorAxisPositions.startLine(); | 1442 unsigned majorAxisInitialPosition = majorAxisPositions.startLine(); |
| 1441 | 1443 |
| 1442 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxi
sInitialPosition)); | 1444 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxi
sInitialPosition)); |
| 1443 OwnPtr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPos
itions.integerSpan(), minorAxisSpanSize); | 1445 std::unique_ptr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(maj
orAxisPositions.integerSpan(), minorAxisSpanSize); |
| 1444 if (!emptyGridArea) | 1446 if (!emptyGridArea) |
| 1445 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); | 1447 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); |
| 1446 | 1448 |
| 1447 m_gridItemArea.set(autoGridItem, *emptyGridArea); | 1449 m_gridItemArea.set(autoGridItem, *emptyGridArea); |
| 1448 insertItemIntoGrid(*autoGridItem, *emptyGridArea); | 1450 insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
| 1449 | 1451 |
| 1450 if (!isGridAutoFlowDense) | 1452 if (!isGridAutoFlowDense) |
| 1451 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG
ridArea->rows.startLine() : emptyGridArea->columns.startLine()); | 1453 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG
ridArea->rows.startLine() : emptyGridArea->columns.startLine()); |
| 1452 } | 1454 } |
| 1453 } | 1455 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1471 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) | 1473 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) |
| 1472 { | 1474 { |
| 1473 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi
sDirection()); | 1475 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi
sDirection()); |
| 1474 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl
atedDefinite()); | 1476 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl
atedDefinite()); |
| 1475 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
*style(), gridItem, autoPlacementMajorAxisDirection()); | 1477 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
*style(), gridItem, autoPlacementMajorAxisDirection()); |
| 1476 | 1478 |
| 1477 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); | 1479 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); |
| 1478 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; | 1480 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; |
| 1479 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; | 1481 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
| 1480 | 1482 |
| 1481 OwnPtr<GridArea> emptyGridArea; | 1483 std::unique_ptr<GridArea> emptyGridArea; |
| 1482 if (minorAxisPositions.isTranslatedDefinite()) { | 1484 if (minorAxisPositions.isTranslatedDefinite()) { |
| 1483 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. | 1485 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. |
| 1484 if (minorAxisPositions.startLine() < minorAxisAutoPlacementCursor) | 1486 if (minorAxisPositions.startLine() < minorAxisAutoPlacementCursor) |
| 1485 majorAxisAutoPlacementCursor++; | 1487 majorAxisAutoPlacementCursor++; |
| 1486 | 1488 |
| 1487 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { | 1489 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
| 1488 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.startLine(), majorAxisAutoPlacementCursor); | 1490 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.startLine(), majorAxisAutoPlacementCursor); |
| 1489 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); | 1491 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); |
| 1490 } | 1492 } |
| 1491 | 1493 |
| (...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2251 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child, sizingData
)); | 2253 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child, sizingData
)); |
| 2252 } | 2254 } |
| 2253 | 2255 |
| 2254 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const | 2256 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const |
| 2255 { | 2257 { |
| 2256 if (!m_gridItemArea.isEmpty()) | 2258 if (!m_gridItemArea.isEmpty()) |
| 2257 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2259 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
| 2258 } | 2260 } |
| 2259 | 2261 |
| 2260 } // namespace blink | 2262 } // namespace blink |
| OLD | NEW |