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 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
436 // may trigger relayout). | 436 // may trigger relayout). |
437 LayoutState state(*this, locationOffset()); | 437 LayoutState state(*this, locationOffset()); |
438 | 438 |
439 LayoutSize previousSize = size(); | 439 LayoutSize previousSize = size(); |
440 | 440 |
441 updateLogicalWidth(); | 441 updateLogicalWidth(); |
442 bool logicalHeightWasIndefinite = computeContentLogicalHeight(MainOrPref erredSize, style()->logicalHeight(), LayoutUnit(-1)) == LayoutUnit(-1); | 442 bool logicalHeightWasIndefinite = computeContentLogicalHeight(MainOrPref erredSize, style()->logicalHeight(), LayoutUnit(-1)) == LayoutUnit(-1); |
443 | 443 |
444 TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); | 444 TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); |
445 | 445 |
446 placeItemsOnGrid(); | 446 placeItemsOnGrid(TrackSizing); |
447 | 447 |
448 GridSizingData sizingData(gridColumnCount(), gridRowCount()); | 448 GridSizingData sizingData(gridColumnCount(), gridRowCount()); |
449 | 449 |
450 // 1- First, the track sizing algorithm is used to resolve the sizes of the grid columns. | 450 // 1- First, the track sizing algorithm is used to resolve the sizes of the grid columns. |
451 // At this point the logical width is always definite as the above call to updateLogicalWidth() | 451 // At this point the logical width is always definite as the above call to updateLogicalWidth() |
452 // properly resolves intrinsic sizes. We cannot do the same for heights though because many code | 452 // properly resolves intrinsic sizes. We cannot do the same for heights though because many code |
453 // paths inside updateLogicalHeight() require a previous call to setLogi calHeight() to resolve | 453 // paths inside updateLogicalHeight() require a previous call to setLogi calHeight() to resolve |
454 // heights properly (like for positioned items for example). | 454 // heights properly (like for positioned items for example). |
455 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); | 455 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); |
456 computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForC olumns); | 456 computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForC olumns); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
504 { | 504 { |
505 if (span <= 1) | 505 if (span <= 1) |
506 return LayoutUnit(); | 506 return LayoutUnit(); |
507 | 507 |
508 const Length& trackGap = direction == ForColumns ? styleRef().gridColumnGap( ) : styleRef().gridRowGap(); | 508 const Length& trackGap = direction == ForColumns ? styleRef().gridColumnGap( ) : styleRef().gridRowGap(); |
509 return valueForLength(trackGap, LayoutUnit()) * (span - 1); | 509 return valueForLength(trackGap, LayoutUnit()) * (span - 1); |
510 } | 510 } |
511 | 511 |
512 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo utUnit& maxLogicalWidth) const | 512 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo utUnit& maxLogicalWidth) const |
513 { | 513 { |
514 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(); | 514 // TODO(svillar): check the comment in clearGridDataAndMarkAsDirty() to remo ve these two const_cast. |
515 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(IntrinsicSizeComputation); | |
515 | 516 |
516 GridSizingData sizingData(gridColumnCount(), gridRowCount()); | 517 GridSizingData sizingData(gridColumnCount(), gridRowCount()); |
517 sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit(); | 518 sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit(); |
518 sizingData.sizingOperation = IntrinsicSizeComputation; | 519 sizingData.sizingOperation = IntrinsicSizeComputation; |
519 const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, si zingData, minLogicalWidth, maxLogicalWidth); | 520 const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, si zingData, minLogicalWidth, maxLogicalWidth); |
520 | 521 |
521 LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTrack s.size()); | 522 LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTrack s.size()); |
522 minLogicalWidth += totalGuttersSize; | 523 minLogicalWidth += totalGuttersSize; |
523 maxLogicalWidth += totalGuttersSize; | 524 maxLogicalWidth += totalGuttersSize; |
524 | 525 |
525 LayoutUnit scrollbarWidth = LayoutUnit(scrollbarLogicalWidth()); | 526 LayoutUnit scrollbarWidth = LayoutUnit(scrollbarLogicalWidth()); |
526 minLogicalWidth += scrollbarWidth; | 527 minLogicalWidth += scrollbarWidth; |
527 maxLogicalWidth += scrollbarWidth; | 528 maxLogicalWidth += scrollbarWidth; |
529 | |
530 // Mark the grid as dirty as we need to recompute the auto repeat columns du ring layout. | |
531 if (m_autoRepeatColumns) | |
532 clearGridDataAndMarkAsDirty(); | |
528 } | 533 } |
529 | 534 |
530 void LayoutGrid::computeIntrinsicLogicalHeight(GridSizingData& sizingData) | 535 void LayoutGrid::computeIntrinsicLogicalHeight(GridSizingData& sizingData) |
531 { | 536 { |
532 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData)); | 537 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData)); |
533 sizingData.freeSpaceForDirection(ForRows) = LayoutUnit(); | 538 sizingData.freeSpaceForDirection(ForRows) = LayoutUnit(); |
534 sizingData.sizingOperation = IntrinsicSizeComputation; | 539 sizingData.sizingOperation = IntrinsicSizeComputation; |
535 computeUsedBreadthOfGridTracks(ForRows, sizingData, m_minContentHeight, m_ma xContentHeight); | 540 computeUsedBreadthOfGridTracks(ForRows, sizingData, m_minContentHeight, m_ma xContentHeight); |
536 | 541 |
537 LayoutUnit totalGuttersSize = guttersSize(ForRows, gridRowCount()); | 542 LayoutUnit totalGuttersSize = guttersSize(ForRows, gridRowCount()); |
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1377 | 1382 |
1378 // Provided the grid container does not have a definite size or max-size in the relevant axis, | 1383 // Provided the grid container does not have a definite size or max-size in the relevant axis, |
1379 // if the min size is definite then the number of repetitions is the largest possible positive | 1384 // if the min size is definite then the number of repetitions is the largest possible positive |
1380 // integer that fulfills that minimum requirement. | 1385 // integer that fulfills that minimum requirement. |
1381 if (needsToFulfillMinimumSize) | 1386 if (needsToFulfillMinimumSize) |
1382 ++repetitions; | 1387 ++repetitions; |
1383 | 1388 |
1384 return repetitions; | 1389 return repetitions; |
1385 } | 1390 } |
1386 | 1391 |
1387 void LayoutGrid::placeItemsOnGrid() | 1392 void LayoutGrid::placeItemsOnGrid(SizingOperation inlineAxisSizingOperation) |
jfernandez
2016/07/11 12:52:22
Why we need to know whether is inline or block axi
svillar
2016/07/11 14:18:43
Well I tried to make a bit explicit that the sizin
| |
1388 { | 1393 { |
1389 if (!m_gridIsDirty) | 1394 if (!m_gridIsDirty) |
1390 return; | 1395 return; |
1391 | 1396 |
1392 ASSERT(m_gridItemArea.isEmpty()); | 1397 ASSERT(m_gridItemArea.isEmpty()); |
1393 | 1398 |
1394 m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns); | 1399 if (inlineAxisSizingOperation == IntrinsicSizeComputation) |
1400 m_autoRepeatColumns = styleRef().gridAutoRepeatColumns().isEmpty() ? 0 : 1; | |
jfernandez
2016/07/11 12:52:22
Why 1 ? Hadn't we avoid that kind of harcoded 1 va
svillar
2016/07/11 14:18:43
Because that's what the spec says (https://drafts.
| |
1401 else | |
1402 m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns); | |
1395 m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows); | 1403 m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows); |
1396 | 1404 |
1397 populateExplicitGridAndOrderIterator(); | 1405 populateExplicitGridAndOrderIterator(); |
1398 | 1406 |
1399 // We clear the dirty bit here as the grid sizes have been updated. | 1407 // We clear the dirty bit here as the grid sizes have been updated. |
1400 m_gridIsDirty = false; | 1408 m_gridIsDirty = false; |
1401 | 1409 |
1402 Vector<LayoutBox*> autoMajorAxisAutoGridItems; | 1410 Vector<LayoutBox*> autoMajorAxisAutoGridItems; |
1403 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; | 1411 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; |
1404 m_hasAnyOrthogonalChild = false; | 1412 m_hasAnyOrthogonalChild = false; |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1608 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const | 1616 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const |
1609 { | 1617 { |
1610 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; | 1618 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; |
1611 } | 1619 } |
1612 | 1620 |
1613 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const | 1621 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const |
1614 { | 1622 { |
1615 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; | 1623 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; |
1616 } | 1624 } |
1617 | 1625 |
1626 void LayoutGrid::clearGridDataAndMarkAsDirty() const | |
1627 { | |
Manuel Rego
2016/07/11 11:10:57
Maybe add a similar if to the one in dirtyGrid():
svillar
2016/07/11 11:48:00
I think I'm adding an ASSERT there.
| |
1628 // TODO(svillar): The track sizing algorithm is used for preferredLogicalWid ths | |
1629 // computations. This means that some attributes of this class will be modif ied during that | |
1630 // process. We should make the algorithm work against some interface that wo uld allow us not to | |
1631 // have to change these attributes while computing the intrinsic sizes. | |
1632 m_grid.resize(0); | |
1633 m_gridItemArea.clear(); | |
1634 m_gridItemsOverflowingGridArea.resize(0); | |
1635 m_gridItemsIndexesMap.clear(); | |
1636 m_autoRepeatColumns = 0; | |
1637 m_autoRepeatRows = 0; | |
1638 m_gridIsDirty = true; | |
1639 } | |
1640 | |
1618 void LayoutGrid::dirtyGrid() | 1641 void LayoutGrid::dirtyGrid() |
Manuel Rego
2016/07/11 11:10:57
Shouldn't we rename this method?
We've now:
* dir
svillar
2016/07/11 11:48:00
The reason why I added a new method is because dir
| |
1619 { | 1642 { |
1620 if (m_gridIsDirty) | 1643 if (m_gridIsDirty) |
1621 return; | 1644 return; |
1622 | 1645 |
1623 // Even if this could be redundant, it could be seen as a defensive strategy against | 1646 // Even if this could be redundant, it could be seen as a defensive strategy against |
1624 // style changes events happening during the layout phase or even while the painting process | 1647 // style changes events happening during the layout phase or even while the painting process |
1625 // is still ongoing. | 1648 // is still ongoing. |
1626 // Forcing a new layout for the Grid layout would cancel any ongoing paintin g and ensure | 1649 // Forcing a new layout for the Grid layout would cancel any ongoing paintin g and ensure |
1627 // the grid and its children are correctly laid out according to the new sty le rules. | 1650 // the grid and its children are correctly laid out according to the new sty le rules. |
1628 setNeedsLayout(LayoutInvalidationReason::GridChanged); | 1651 setNeedsLayout(LayoutInvalidationReason::GridChanged); |
1629 | 1652 |
1630 m_grid.resize(0); | 1653 clearGridDataAndMarkAsDirty(); |
1631 m_gridItemArea.clear(); | |
1632 m_gridItemsOverflowingGridArea.resize(0); | |
1633 m_gridItemsIndexesMap.clear(); | |
1634 m_gridIsDirty = true; | |
1635 } | 1654 } |
1636 | 1655 |
1637 static const StyleContentAlignmentData& normalValueBehavior() | 1656 static const StyleContentAlignmentData& normalValueBehavior() |
1638 { | 1657 { |
1639 static const StyleContentAlignmentData normalBehavior = {ContentPositionNorm al, ContentDistributionStretch}; | 1658 static const StyleContentAlignmentData normalBehavior = {ContentPositionNorm al, ContentDistributionStretch}; |
1640 return normalBehavior; | 1659 return normalBehavior; |
1641 } | 1660 } |
1642 | 1661 |
1643 void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection direction, GridSizingData& sizingData) | 1662 void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection direction, GridSizingData& sizingData) |
1644 { | 1663 { |
(...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2363 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc ation; | 2382 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc ation; |
2364 } | 2383 } |
2365 | 2384 |
2366 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const | 2385 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const |
2367 { | 2386 { |
2368 if (!m_gridItemArea.isEmpty()) | 2387 if (!m_gridItemArea.isEmpty()) |
2369 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2388 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2370 } | 2389 } |
2371 | 2390 |
2372 } // namespace blink | 2391 } // namespace blink |
OLD | NEW |