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 // TODO(svillar): we won't need to do this once the intrinsic width comp
utation is isolated |
| 447 // from the LayoutGrid object state (it should not touch any attribute)
(see crbug.com/627812) |
| 448 if (m_autoRepeatColumns && m_autoRepeatColumns != computeAutoRepeatTrack
sCount(ForColumns)) |
| 449 dirtyGrid(); |
| 450 placeItemsOnGrid(TrackSizing); |
447 | 451 |
448 GridSizingData sizingData(gridColumnCount(), gridRowCount()); | 452 GridSizingData sizingData(gridColumnCount(), gridRowCount()); |
449 | 453 |
450 // 1- First, the track sizing algorithm is used to resolve the sizes of
the grid columns. | 454 // 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() | 455 // 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 | 456 // 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 | 457 // paths inside updateLogicalHeight() require a previous call to setLogi
calHeight() to resolve |
454 // heights properly (like for positioned items for example). | 458 // heights properly (like for positioned items for example). |
455 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); | 459 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); |
456 computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForC
olumns); | 460 computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForC
olumns); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 { | 508 { |
505 if (span <= 1) | 509 if (span <= 1) |
506 return LayoutUnit(); | 510 return LayoutUnit(); |
507 | 511 |
508 const Length& trackGap = direction == ForColumns ? styleRef().gridColumnGap(
) : styleRef().gridRowGap(); | 512 const Length& trackGap = direction == ForColumns ? styleRef().gridColumnGap(
) : styleRef().gridRowGap(); |
509 return valueForLength(trackGap, LayoutUnit()) * (span - 1); | 513 return valueForLength(trackGap, LayoutUnit()) * (span - 1); |
510 } | 514 } |
511 | 515 |
512 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo
utUnit& maxLogicalWidth) const | 516 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo
utUnit& maxLogicalWidth) const |
513 { | 517 { |
514 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(); | 518 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(IntrinsicSizeComputation); |
515 | 519 |
516 GridSizingData sizingData(gridColumnCount(), gridRowCount()); | 520 GridSizingData sizingData(gridColumnCount(), gridRowCount()); |
517 sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit(); | 521 sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit(); |
518 sizingData.sizingOperation = IntrinsicSizeComputation; | 522 sizingData.sizingOperation = IntrinsicSizeComputation; |
519 const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, si
zingData, minLogicalWidth, maxLogicalWidth); | 523 const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, si
zingData, minLogicalWidth, maxLogicalWidth); |
520 | 524 |
521 LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTrack
s.size()); | 525 LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTrack
s.size()); |
522 minLogicalWidth += totalGuttersSize; | 526 minLogicalWidth += totalGuttersSize; |
523 maxLogicalWidth += totalGuttersSize; | 527 maxLogicalWidth += totalGuttersSize; |
524 | 528 |
(...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1377 | 1381 |
1378 // Provided the grid container does not have a definite size or max-size in
the relevant axis, | 1382 // 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 | 1383 // if the min size is definite then the number of repetitions is the largest
possible positive |
1380 // integer that fulfills that minimum requirement. | 1384 // integer that fulfills that minimum requirement. |
1381 if (needsToFulfillMinimumSize) | 1385 if (needsToFulfillMinimumSize) |
1382 ++repetitions; | 1386 ++repetitions; |
1383 | 1387 |
1384 return repetitions; | 1388 return repetitions; |
1385 } | 1389 } |
1386 | 1390 |
1387 void LayoutGrid::placeItemsOnGrid() | 1391 void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) |
1388 { | 1392 { |
1389 if (!m_gridIsDirty) | 1393 if (!m_gridIsDirty) |
1390 return; | 1394 return; |
1391 | 1395 |
1392 ASSERT(m_gridItemArea.isEmpty()); | 1396 ASSERT(m_gridItemArea.isEmpty()); |
1393 | 1397 |
1394 m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns); | 1398 if (sizingOperation == IntrinsicSizeComputation) |
| 1399 m_autoRepeatColumns = styleRef().gridAutoRepeatColumns().isEmpty() ? 0 :
1; |
| 1400 else |
| 1401 m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns); |
1395 m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows); | 1402 m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows); |
1396 | 1403 |
1397 populateExplicitGridAndOrderIterator(); | 1404 populateExplicitGridAndOrderIterator(); |
1398 | 1405 |
1399 // We clear the dirty bit here as the grid sizes have been updated. | 1406 // We clear the dirty bit here as the grid sizes have been updated. |
1400 m_gridIsDirty = false; | 1407 m_gridIsDirty = false; |
1401 | 1408 |
1402 Vector<LayoutBox*> autoMajorAxisAutoGridItems; | 1409 Vector<LayoutBox*> autoMajorAxisAutoGridItems; |
1403 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; | 1410 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; |
1404 m_hasAnyOrthogonalChild = false; | 1411 m_hasAnyOrthogonalChild = false; |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1624 // style changes events happening during the layout phase or even while the
painting process | 1631 // style changes events happening during the layout phase or even while the
painting process |
1625 // is still ongoing. | 1632 // is still ongoing. |
1626 // Forcing a new layout for the Grid layout would cancel any ongoing paintin
g and ensure | 1633 // 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. | 1634 // the grid and its children are correctly laid out according to the new sty
le rules. |
1628 setNeedsLayout(LayoutInvalidationReason::GridChanged); | 1635 setNeedsLayout(LayoutInvalidationReason::GridChanged); |
1629 | 1636 |
1630 m_grid.resize(0); | 1637 m_grid.resize(0); |
1631 m_gridItemArea.clear(); | 1638 m_gridItemArea.clear(); |
1632 m_gridItemsOverflowingGridArea.resize(0); | 1639 m_gridItemsOverflowingGridArea.resize(0); |
1633 m_gridItemsIndexesMap.clear(); | 1640 m_gridItemsIndexesMap.clear(); |
| 1641 m_autoRepeatColumns = 0; |
| 1642 m_autoRepeatRows = 0; |
1634 m_gridIsDirty = true; | 1643 m_gridIsDirty = true; |
1635 } | 1644 } |
1636 | 1645 |
1637 static const StyleContentAlignmentData& normalValueBehavior() | 1646 static const StyleContentAlignmentData& normalValueBehavior() |
1638 { | 1647 { |
1639 static const StyleContentAlignmentData normalBehavior = {ContentPositionNorm
al, ContentDistributionStretch}; | 1648 static const StyleContentAlignmentData normalBehavior = {ContentPositionNorm
al, ContentDistributionStretch}; |
1640 return normalBehavior; | 1649 return normalBehavior; |
1641 } | 1650 } |
1642 | 1651 |
1643 void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection
direction, GridSizingData& sizingData) | 1652 void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection
direction, GridSizingData& sizingData) |
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2363 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc
ation; | 2372 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc
ation; |
2364 } | 2373 } |
2365 | 2374 |
2366 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const | 2375 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const |
2367 { | 2376 { |
2368 if (!m_gridItemArea.isEmpty()) | 2377 if (!m_gridItemArea.isEmpty()) |
2369 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2378 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2370 } | 2379 } |
2371 | 2380 |
2372 } // namespace blink | 2381 } // namespace blink |
OLD | NEW |