Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

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

Powered by Google App Engine
This is Rietveld 408576698