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

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

Issue 2050123002: Remove OwnPtr from Blink. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: First attempt to land. 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"
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
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
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
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
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
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
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