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 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
225 size_t m_columnIndex; | 225 size_t m_columnIndex; |
226 size_t m_childIndex; | 226 size_t m_childIndex; |
227 }; | 227 }; |
228 | 228 |
229 struct LayoutGrid::GridSizingData { | 229 struct LayoutGrid::GridSizingData { |
230 WTF_MAKE_NONCOPYABLE(GridSizingData); | 230 WTF_MAKE_NONCOPYABLE(GridSizingData); |
231 STACK_ALLOCATED(); | 231 STACK_ALLOCATED(); |
232 public: | 232 public: |
233 GridSizingData(size_t gridColumnCount, size_t gridRowCount) | 233 GridSizingData(size_t gridColumnCount, size_t gridRowCount) |
234 : columnTracks(gridColumnCount) | 234 : columnTracks(gridColumnCount) |
235 , rowTracks(gridRowCount) | 235 , rowTracks(0) |
236 { | 236 { |
237 } | 237 } |
238 | 238 |
239 Vector<GridTrack> columnTracks; | 239 Vector<GridTrack> columnTracks; |
240 Vector<GridTrack> rowTracks; | 240 Vector<GridTrack> rowTracks; |
241 Vector<size_t> contentSizedTracksIndex; | 241 Vector<size_t> contentSizedTracksIndex; |
242 | 242 |
243 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free. | 243 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free. |
244 Vector<GridTrack*> filteredTracks; | 244 Vector<GridTrack*> filteredTracks; |
245 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; | 245 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
352 | 352 |
353 updateLogicalWidth(); | 353 updateLogicalWidth(); |
354 bool logicalHeightWasIndefinite = computeContentLogicalHeight(MainOrPref erredSize, style()->logicalHeight(), -1) == -1; | 354 bool logicalHeightWasIndefinite = computeContentLogicalHeight(MainOrPref erredSize, style()->logicalHeight(), -1) == -1; |
355 | 355 |
356 TextAutosizer::LayoutScope textAutosizerLayoutScope(this); | 356 TextAutosizer::LayoutScope textAutosizerLayoutScope(this); |
357 | 357 |
358 placeItemsOnGrid(); | 358 placeItemsOnGrid(); |
359 | 359 |
360 GridSizingData sizingData(gridColumnCount(), gridRowCount()); | 360 GridSizingData sizingData(gridColumnCount(), gridRowCount()); |
361 | 361 |
362 // 1- First, the track sizing algorithm is used to resolve the sizes of the grid columns. | |
362 // At this point the logical width is always definite as the above call to updateLogicalWidth() | 363 // At this point the logical width is always definite as the above call to updateLogicalWidth() |
363 // properly resolves intrinsic sizes. We cannot do the same for heights though because many code | 364 // properly resolves intrinsic sizes. We cannot do the same for heights though because many code |
364 // paths inside updateLogicalHeight() require a previous call to setLogi calHeight() to resolve | 365 // paths inside updateLogicalHeight() require a previous call to setLogi calHeight() to resolve |
365 // heights properly (like for positioned items for example). | 366 // heights properly (like for positioned items for example). |
366 computeTrackSizesForDirection(ForColumns, sizingData, availableLogicalWi dth()); | 367 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); |
368 computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForC olumns); | |
367 | 369 |
370 // 2- Next, the track sizing algorithm resolves the sizes of the grid ro ws, using the | |
371 // grid column sizes calculated in the previous step. | |
368 if (logicalHeightWasIndefinite) | 372 if (logicalHeightWasIndefinite) |
369 computeIntrinsicLogicalHeight(sizingData); | 373 computeIntrinsicLogicalHeight(sizingData); |
370 else | 374 else |
371 computeTrackSizesForDirection(ForRows, sizingData, availableLogicalH eight(ExcludeMarginBorderPadding)); | 375 computeTrackSizesForDirection(ForRows, sizingData, availableLogicalH eight(ExcludeMarginBorderPadding)); |
372 setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndP addingLogicalHeight()); | 376 setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndP addingLogicalHeight()); |
373 | 377 |
374 LayoutUnit oldClientAfterEdge = clientLogicalBottom(); | 378 LayoutUnit oldClientAfterEdge = clientLogicalBottom(); |
375 updateLogicalHeight(); | 379 updateLogicalHeight(); |
376 | 380 |
377 // The above call might have changed the grid's logical height depending on min|max height restrictions. | 381 // The above call might have changed the grid's logical height depending on min|max height restrictions. |
378 // Update the sizes of the rows whose size depends on the logical height (also on definite|indefinite sizes). | 382 // Update the sizes of the rows whose size depends on the logical height (also on definite|indefinite sizes). |
379 if (logicalHeightWasIndefinite) | 383 if (logicalHeightWasIndefinite) |
380 computeTrackSizesForDirection(ForRows, sizingData, logicalHeight()); | 384 computeTrackSizesForDirection(ForRows, sizingData, logicalHeight()); |
381 | 385 |
382 // Grid container should have the minimum height of a line if it's edita ble. That doesn't affect track sizing though. | 386 // Grid container should have the minimum height of a line if it's edita ble. That doesn't affect track sizing though. |
383 if (hasLineIfEmpty()) | 387 if (hasLineIfEmpty()) |
384 setLogicalHeight(std::max(logicalHeight(), minimumLogicalHeightForEm ptyLine())); | 388 setLogicalHeight(std::max(logicalHeight(), minimumLogicalHeightForEm ptyLine())); |
385 | 389 |
390 // 3- If the min-content contribution of any grid items have changed bas ed on the row | |
391 // sizes calculated in step 2, steps 1 and 2 are repeated with the new m in-content | |
392 // contribution (once only). | |
393 // TODO (lajava): is enough just verifying whether there are any orthogo nal item ? | |
394 // TODO (lajava): Could we find better ways to fulfill such spec stateme nt ? | |
395 // TODO (lajava): Could we avoid iterating over all the grid items ?" | |
396 // TODO (lajava): Why we dont need to repeat row tracks sizing as spec s uggests (I was unable to find any test case needing so) ?" | |
svillar
2015/12/01 12:43:14
We need to do that for example if we have two item
| |
397 if (hasAnyOrthogonalChild()) { | |
398 // In orthogonal flow cases column tracks size is determined based o n the computed | |
399 // row track sizes, hence we need to repeat computeUsedBreadthOfGrid Tracks for columns. | |
400 computeTrackSizesForDirection(ForColumns, sizingData, availableSpace ForColumns); | |
401 } | |
402 | |
svillar
2015/12/01 12:43:14
This should be placed before the if (hasLineIfEmpt
jfernandez
2015/12/01 15:13:38
Acknowledged.
| |
386 applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData); | 403 applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData); |
387 applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData); | 404 applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData); |
388 | 405 |
389 layoutGridItems(sizingData); | 406 layoutGridItems(sizingData); |
390 | 407 |
391 if (size() != previousSize) | 408 if (size() != previousSize) |
392 relayoutChildren = true; | 409 relayoutChildren = true; |
393 | 410 |
394 layoutPositionedObjects(relayoutChildren || isDocumentElement()); | 411 layoutPositionedObjects(relayoutChildren || isDocumentElement()); |
395 | 412 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
470 } | 487 } |
471 | 488 |
472 void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi on, GridSizingData& sizingData, LayoutUnit& baseSizesWithoutMaximization, Layout Unit& growthLimitsWithoutMaximization, AvailableSpaceType availableSpaceType) | 489 void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi on, GridSizingData& sizingData, LayoutUnit& baseSizesWithoutMaximization, Layout Unit& growthLimitsWithoutMaximization, AvailableSpaceType availableSpaceType) |
473 { | 490 { |
474 LayoutUnit& freeSpace = sizingData.freeSpaceForDirection(direction); | 491 LayoutUnit& freeSpace = sizingData.freeSpaceForDirection(direction); |
475 const LayoutUnit initialFreeSpace = freeSpace; | 492 const LayoutUnit initialFreeSpace = freeSpace; |
476 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks; | 493 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks; |
477 Vector<size_t> flexibleSizedTracksIndex; | 494 Vector<size_t> flexibleSizedTracksIndex; |
478 sizingData.contentSizedTracksIndex.shrink(0); | 495 sizingData.contentSizedTracksIndex.shrink(0); |
479 | 496 |
497 if (direction == ForRows && tracks.size() == 0) | |
498 tracks.grow(gridRowCount()); | |
cbiesinger
2015/11/26 02:26:16
why is this now needed, when it wasn't before?
jfernandez
2015/11/26 08:58:27
Since I needed a way to detect we are using rowTra
| |
499 | |
480 const LayoutUnit maxSize = std::max(LayoutUnit(), initialFreeSpace); | 500 const LayoutUnit maxSize = std::max(LayoutUnit(), initialFreeSpace); |
481 // 1. Initialize per Grid track variables. | 501 // 1. Initialize per Grid track variables. |
482 for (size_t i = 0; i < tracks.size(); ++i) { | 502 for (size_t i = 0; i < tracks.size(); ++i) { |
483 GridTrack& track = tracks[i]; | 503 GridTrack& track = tracks[i]; |
484 GridTrackSize trackSize = gridTrackSize(direction, i); | 504 GridTrackSize trackSize = gridTrackSize(direction, i); |
485 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); | 505 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); |
486 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); | 506 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); |
487 | 507 |
488 track.setBaseSize(computeUsedBreadthOfMinLength(minTrackBreadth, maxSize )); | 508 track.setBaseSize(computeUsedBreadthOfMinLength(minTrackBreadth, maxSize )); |
489 track.setGrowthLimit(computeUsedBreadthOfMaxLength(maxTrackBreadth, trac k.baseSize(), maxSize)); | 509 track.setGrowthLimit(computeUsedBreadthOfMaxLength(maxTrackBreadth, trac k.baseSize(), maxSize)); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
543 | 563 |
544 for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) { | 564 for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) { |
545 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i] ); | 565 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i] ); |
546 while (LayoutBox* gridItem = iterator.nextGridItem()) { | 566 while (LayoutBox* gridItem = iterator.nextGridItem()) { |
547 const GridSpan span = cachedGridSpan(*gridItem, direction); | 567 const GridSpan span = cachedGridSpan(*gridItem, direction); |
548 | 568 |
549 // Do not include already processed items. | 569 // Do not include already processed items. |
550 if (i > 0 && span.resolvedInitialPosition.toInt() <= flexibleSiz edTracksIndex[i - 1]) | 570 if (i > 0 && span.resolvedInitialPosition.toInt() <= flexibleSiz edTracksIndex[i - 1]) |
551 continue; | 571 continue; |
552 | 572 |
553 flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tra cks, span, direction, maxContentForChild(*gridItem, direction, sizingData.column Tracks))); | 573 flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tra cks, span, direction, maxContentForChild(*gridItem, direction, sizingData))); |
554 } | 574 } |
555 } | 575 } |
556 } | 576 } |
557 | 577 |
558 for (const auto& trackIndex : flexibleSizedTracksIndex) { | 578 for (const auto& trackIndex : flexibleSizedTracksIndex) { |
559 GridTrackSize trackSize = gridTrackSize(direction, trackIndex); | 579 GridTrackSize trackSize = gridTrackSize(direction, trackIndex); |
560 | 580 |
561 LayoutUnit oldBaseSize = tracks[trackIndex].baseSize(); | 581 LayoutUnit oldBaseSize = tracks[trackIndex].baseSize(); |
562 LayoutUnit baseSize = std::max<LayoutUnit>(oldBaseSize, flexFraction * t rackSize.maxTrackBreadth().flex()); | 582 LayoutUnit baseSize = std::max<LayoutUnit>(oldBaseSize, flexFraction * t rackSize.maxTrackBreadth().flex()); |
563 if (LayoutUnit increment = baseSize - oldBaseSize) { | 583 if (LayoutUnit increment = baseSize - oldBaseSize) { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
641 flexFactorSum += trackSize.maxTrackBreadth().flex(); | 661 flexFactorSum += trackSize.maxTrackBreadth().flex(); |
642 } | 662 } |
643 } | 663 } |
644 | 664 |
645 // The function is not called if we don't have <flex> grid tracks | 665 // The function is not called if we don't have <flex> grid tracks |
646 ASSERT(!flexibleTracksIndexes.isEmpty()); | 666 ASSERT(!flexibleTracksIndexes.isEmpty()); |
647 | 667 |
648 return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftOverS pace, flexibleTracksIndexes); | 668 return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftOverS pace, flexibleTracksIndexes); |
649 } | 669 } |
650 | 670 |
671 bool LayoutGrid::hasAnyOrthogonalChild() const | |
672 { | |
673 for (LayoutBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) { | |
674 if (child->isHorizontalWritingMode() != isHorizontalWritingMode()) | |
675 return true; | |
676 } | |
677 return false; | |
678 } | |
679 | |
651 bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) cons t | 680 bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) cons t |
652 { | 681 { |
653 return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogi calWidth(); | 682 return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogi calWidth(); |
654 } | 683 } |
655 | 684 |
685 LayoutUnit LayoutGrid::overrideContainingBlockBreadthForChild(const LayoutBox& c hild, GridTrackSizingDirection direction) | |
686 { | |
svillar
2015/12/01 12:43:14
I'd ASSERT() on hasOverrideContainingBlockXXX() an
jfernandez
2015/12/01 15:13:39
I really wanted to return 0 (actually, it was the
| |
687 if (direction == ForRows) | |
688 return child.hasOverrideContainingBlockLogicalHeight() ? child.overrideC ontainingBlockContentLogicalHeight() : LayoutUnit(); | |
689 return child.hasOverrideContainingBlockLogicalWidth() ? child.overrideContai ningBlockContentLogicalWidth() : LayoutUnit(); | |
690 } | |
691 | |
692 void LayoutGrid::setOverrideContainingBlockBreadthForChild(LayoutBox& child, Gri dTrackSizingDirection direction, LayoutUnit breadth) | |
693 { | |
694 if (direction == ForRows) | |
695 child.setOverrideContainingBlockContentLogicalHeight(breadth); | |
696 else | |
697 child.setOverrideContainingBlockContentLogicalWidth(breadth); | |
698 } | |
699 | |
656 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size _t i) const | 700 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size _t i) const |
657 { | 701 { |
658 bool isForColumns = direction == ForColumns; | 702 bool isForColumns = direction == ForColumns; |
659 const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTempl ateColumns() : style()->gridTemplateRows(); | 703 const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTempl ateColumns() : style()->gridTemplateRows(); |
660 const GridTrackSize& trackSize = (i >= trackStyles.size()) ? (isForColumns ? style()->gridAutoColumns() : style()->gridAutoRows()) : trackStyles[i]; | 704 const GridTrackSize& trackSize = (i >= trackStyles.size()) ? (isForColumns ? style()->gridAutoColumns() : style()->gridAutoRows()) : trackStyles[i]; |
661 | 705 |
662 GridLength minTrackBreadth = trackSize.minTrackBreadth(); | 706 GridLength minTrackBreadth = trackSize.minTrackBreadth(); |
663 GridLength maxTrackBreadth = trackSize.maxTrackBreadth(); | 707 GridLength maxTrackBreadth = trackSize.maxTrackBreadth(); |
664 | 708 |
665 // If the logical width/height of the grid container is indefinite, percenta ge values are treated as <auto> | 709 // If the logical width/height of the grid container is indefinite, percenta ge values are treated as <auto> |
666 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) { | 710 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) { |
667 if (!hasDefiniteLogicalSize(direction)) { | 711 if (!hasDefiniteLogicalSize(direction)) { |
668 if (minTrackBreadth.hasPercentage()) | 712 if (minTrackBreadth.hasPercentage()) |
669 minTrackBreadth = Length(Auto); | 713 minTrackBreadth = Length(Auto); |
670 if (maxTrackBreadth.hasPercentage()) | 714 if (maxTrackBreadth.hasPercentage()) |
671 maxTrackBreadth = Length(Auto); | 715 maxTrackBreadth = Length(Auto); |
672 } | 716 } |
673 } | 717 } |
674 | 718 |
675 return GridTrackSize(minTrackBreadth, maxTrackBreadth); | 719 return GridTrackSize(minTrackBreadth, maxTrackBreadth); |
676 } | 720 } |
677 | 721 |
678 LayoutUnit LayoutGrid::logicalHeightForChild(LayoutBox& child, Vector<GridTrack> & columnTracks) | 722 LayoutUnit LayoutGrid::logicalHeightForChild(LayoutBox& child, const GridSizingD ata& sizingData) |
679 { | 723 { |
724 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); | |
svillar
2015/12/01 12:43:14
This is repeated so many times that we should have
jfernandez
2015/12/01 15:13:39
Acknowledged.
| |
725 GridTrackSizingDirection childInlineDirection = hasOrthogonalWritingMode ? F orRows : ForColumns; | |
680 SubtreeLayoutScope layoutScope(child); | 726 SubtreeLayoutScope layoutScope(child); |
681 LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child.hasOverride ContainingBlockLogicalWidth() ? child.overrideContainingBlockContentLogicalWidth () : LayoutUnit(); | 727 // Child's min-content contribution depends on the container's size along th e child's inline-axis. |
682 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthForCh ild(child, ForColumns, columnTracks); | 728 LayoutUnit oldGridAreaBreadth = overrideContainingBlockBreadthForChild(child , childInlineDirection); |
683 if (child.hasRelativeLogicalHeight() || oldOverrideContainingBlockContentLog icalWidth != overrideContainingBlockContentLogicalWidth) { | 729 LayoutUnit gridAreaBreadth = gridAreaBreadthForChild(child, childInlineDirec tion, sizingData); |
730 if (child.hasRelativeLogicalHeight() || oldGridAreaBreadth != gridAreaBreadt h) { | |
684 layoutScope.setNeedsLayout(&child, LayoutInvalidationReason::GridChanged ); | 731 layoutScope.setNeedsLayout(&child, LayoutInvalidationReason::GridChanged ); |
685 } | 732 } |
686 | 733 |
687 bool hasOverrideHeight = child.hasOverrideLogicalContentHeight(); | 734 bool hasOverrideHeight = child.hasOverrideLogicalContentHeight(); |
688 // We need to clear the stretched height to properly compute logical height during layout. | 735 // We need to clear the stretched height to properly compute logical height during layout. |
689 if (hasOverrideHeight && child.needsLayout()) | 736 if (hasOverrideHeight && child.needsLayout()) |
690 child.clearOverrideLogicalContentHeight(); | 737 child.clearOverrideLogicalContentHeight(); |
691 | 738 |
692 child.setOverrideContainingBlockContentLogicalWidth(overrideContainingBlockC ontentLogicalWidth); | 739 setOverrideContainingBlockBreadthForChild(child, childInlineDirection, gridA reaBreadth); |
693 // If |child| has a relative logical height, we shouldn't let it override it s intrinsic height, which is | 740 // If |child| has a relative logical height, we shouldn't let it override it s intrinsic height, which is |
694 // what we are interested in here. Thus we need to set the override logical height to -1 (no possible resolution). | 741 // what we are interested in here. Thus we need to set the block-axis overri de breadth to -1 (no possible resolution). |
695 if (child.hasRelativeLogicalHeight()) | 742 if (child.hasRelativeLogicalHeight()) |
696 child.setOverrideContainingBlockContentLogicalHeight(-1); | 743 setOverrideContainingBlockBreadthForChild(child, childInlineDirection == ForColumns ? ForRows : ForColumns, -1); |
697 child.layoutIfNeeded(); | 744 child.layoutIfNeeded(); |
698 // If the child was stretched we should use its intrinsic height. | 745 // If the child was stretched we should use its intrinsic height. |
699 return (hasOverrideHeight ? childIntrinsicHeight(child) : child.logicalHeigh t()) + child.marginLogicalHeight(); | 746 return (hasOverrideHeight ? childIntrinsicHeight(child) : child.logicalHeigh t()) + child.marginLogicalHeight(); |
700 } | 747 } |
701 | 748 |
702 LayoutUnit LayoutGrid::minSizeForChild(LayoutBox& child, GridTrackSizingDirectio n direction, Vector<GridTrack>& columnTracks) | 749 static inline GridTrackSizingDirection flowAwareDirection(bool hasOrthogonalWrit ingMode, GridTrackSizingDirection direction) |
750 { | |
751 if (hasOrthogonalWritingMode) | |
752 return direction == ForColumns ? ForRows : ForColumns; | |
753 return direction; | |
754 } | |
svillar
2015/12/01 12:43:14
With the private method I mentioned above we could
jfernandez
2015/12/01 15:13:39
We would change an static inline method for a clas
| |
755 | |
756 LayoutUnit LayoutGrid::minSizeForChild(LayoutBox& child, GridTrackSizingDirectio n direction, const GridSizingData& sizingData) | |
703 { | 757 { |
704 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); | 758 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); |
705 // TODO(svillar): Properly support orthogonal writing mode. | 759 const Length& childMinSize = flowAwareDirection(hasOrthogonalWritingMode, di rection) == ForColumns ? child.style()->logicalMinWidth() : child.style()->logic alMinHeight(); |
706 if (hasOrthogonalWritingMode) | |
707 return LayoutUnit(); | |
708 | |
709 const Length& childMinSize = direction == ForColumns ? child.style()->logica lMinWidth() : child.style()->logicalMinHeight(); | |
710 if (childMinSize.isAuto()) { | 760 if (childMinSize.isAuto()) { |
711 // TODO(svillar): Implement intrinsic aspect ratio support (transferred size in specs). | 761 // TODO(svillar): Implement intrinsic aspect ratio support (transferred size in specs). |
712 return minContentForChild(child, direction, columnTracks); | 762 return minContentForChild(child, direction, sizingData); |
713 } | 763 } |
714 | 764 |
715 if (direction == ForColumns) | 765 if (flowAwareDirection(hasOrthogonalWritingMode, direction) == ForColumns) |
716 return child.computeLogicalWidthUsing(MinSize, childMinSize, contentLogi calWidth(), this); | 766 return child.computeLogicalWidthUsing(MinSize, childMinSize, contentLogi calWidth(), this); |
717 | 767 |
718 return child.computeContentLogicalHeight(MinSize, childMinSize, child.logica lHeight()) + child.scrollbarLogicalHeight(); | 768 return child.computeContentLogicalHeight(MinSize, childMinSize, child.logica lHeight()) + child.scrollbarLogicalHeight(); |
719 } | 769 } |
720 | 770 |
721 LayoutUnit LayoutGrid::minContentForChild(LayoutBox& child, GridTrackSizingDirec tion direction, Vector<GridTrack>& columnTracks) | 771 LayoutUnit LayoutGrid::minContentForChild(LayoutBox& child, GridTrackSizingDirec tion direction, const GridSizingData& sizingData) |
722 { | 772 { |
723 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); | 773 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); |
724 // FIXME: Properly support orthogonal writing mode. | 774 if (flowAwareDirection(hasOrthogonalWritingMode, direction) == ForColumns) { |
725 if (hasOrthogonalWritingMode) | |
726 return 0; | |
727 | |
728 if (direction == ForColumns) { | |
729 // If |child| has a relative logical width, we shouldn't let it override its intrinsic width, which is | 775 // If |child| has a relative logical width, we shouldn't let it override its intrinsic width, which is |
730 // what we are interested in here. Thus we need to set the override logi cal width to -1 (no possible resolution). | 776 // what we are interested in here. Thus we need to set the inline-axis o verride breadth to -1 (no possible resolution). |
777 GridTrackSizingDirection childInlineDirection = hasOrthogonalWritingMode ? ForRows : ForColumns; | |
731 if (child.hasRelativeLogicalWidth()) | 778 if (child.hasRelativeLogicalWidth()) |
732 child.setOverrideContainingBlockContentLogicalWidth(-1); | 779 setOverrideContainingBlockBreadthForChild(child, childInlineDirectio n, -1); |
733 | 780 |
734 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width. | 781 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width. |
735 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html | 782 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html |
736 return child.minPreferredLogicalWidth() + marginIntrinsicLogicalWidthFor Child(child); | 783 return child.minPreferredLogicalWidth() + marginIntrinsicLogicalWidthFor Child(child); |
737 } | 784 } |
738 | 785 |
739 return logicalHeightForChild(child, columnTracks); | 786 return logicalHeightForChild(child, sizingData); |
740 } | 787 } |
741 | 788 |
742 LayoutUnit LayoutGrid::maxContentForChild(LayoutBox& child, GridTrackSizingDirec tion direction, Vector<GridTrack>& columnTracks) | 789 LayoutUnit LayoutGrid::maxContentForChild(LayoutBox& child, GridTrackSizingDirec tion direction, const GridSizingData& sizingData) |
743 { | 790 { |
744 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); | 791 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); |
745 // FIXME: Properly support orthogonal writing mode. | 792 if (flowAwareDirection(hasOrthogonalWritingMode, direction) == ForColumns) { |
746 if (hasOrthogonalWritingMode) | |
747 return LayoutUnit(); | |
748 | |
749 if (direction == ForColumns) { | |
750 // If |child| has a relative logical width, we shouldn't let it override its intrinsic width, which is | 793 // If |child| has a relative logical width, we shouldn't let it override its intrinsic width, which is |
751 // what we are interested in here. Thus we need to set the override logi cal width to -1 (no possible resolution). | 794 // what we are interested in here. Thus we need to set the override logi cal width to -1 (no possible resolution). |
795 GridTrackSizingDirection childInlineDirection = hasOrthogonalWritingMode ? ForRows : ForColumns; | |
752 if (child.hasRelativeLogicalWidth()) | 796 if (child.hasRelativeLogicalWidth()) |
753 child.setOverrideContainingBlockContentLogicalWidth(-1); | 797 setOverrideContainingBlockBreadthForChild(child, childInlineDirectio n, -1); |
754 | 798 |
755 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width. | 799 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width. |
756 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html | 800 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html |
757 return child.maxPreferredLogicalWidth() + marginIntrinsicLogicalWidthFor Child(child); | 801 return child.maxPreferredLogicalWidth() + marginIntrinsicLogicalWidthFor Child(child); |
758 } | 802 } |
759 | 803 |
760 return logicalHeightForChild(child, columnTracks); | 804 return logicalHeightForChild(child, sizingData); |
761 } | 805 } |
762 | 806 |
763 // We're basically using a class instead of a std::pair because of accessing gri dItem() or gridSpan() is much more | 807 // We're basically using a class instead of a std::pair because of accessing gri dItem() or gridSpan() is much more |
764 // self-explanatory that using .first or .second members in the pair. Having a s td::pair<LayoutBox*, size_t> | 808 // self-explanatory that using .first or .second members in the pair. Having a s td::pair<LayoutBox*, size_t> |
765 // does not work either because we still need the GridSpan so we'd have to add a n extra hash lookup for each item | 809 // does not work either because we still need the GridSpan so we'd have to add a n extra hash lookup for each item |
766 // at the beginning of LayoutGrid::resolveContentBasedTrackSizingFunctionsForIte ms(). | 810 // at the beginning of LayoutGrid::resolveContentBasedTrackSizingFunctionsForIte ms(). |
767 class GridItemWithSpan { | 811 class GridItemWithSpan { |
768 public: | 812 public: |
769 GridItemWithSpan(LayoutBox& gridItem, const GridSpan& gridSpan) | 813 GridItemWithSpan(LayoutBox& gridItem, const GridSpan& gridSpan) |
770 : m_gridItem(&gridItem) | 814 : m_gridItem(&gridItem) |
(...skipping 26 matching lines...) Expand all Loading... | |
797 { | 841 { |
798 sizingData.itemsSortedByIncreasingSpan.shrink(0); | 842 sizingData.itemsSortedByIncreasingSpan.shrink(0); |
799 HashSet<LayoutBox*> itemsSet; | 843 HashSet<LayoutBox*> itemsSet; |
800 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 844 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
801 GridIterator iterator(m_grid, direction, trackIndex); | 845 GridIterator iterator(m_grid, direction, trackIndex); |
802 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; | 846 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; |
803 while (LayoutBox* gridItem = iterator.nextGridItem()) { | 847 while (LayoutBox* gridItem = iterator.nextGridItem()) { |
804 if (itemsSet.add(gridItem).isNewEntry) { | 848 if (itemsSet.add(gridItem).isNewEntry) { |
805 const GridSpan& span = cachedGridSpan(*gridItem, direction); | 849 const GridSpan& span = cachedGridSpan(*gridItem, direction); |
806 if (span.integerSpan() == 1) { | 850 if (span.integerSpan() == 1) { |
807 resolveContentBasedTrackSizingFunctionsForNonSpanningItems(d irection, span, *gridItem, track, sizingData.columnTracks); | 851 resolveContentBasedTrackSizingFunctionsForNonSpanningItems(d irection, span, *gridItem, track, sizingData); |
808 } else if (!spanningItemCrossesFlexibleSizedTracks(span, directi on)) { | 852 } else if (!spanningItemCrossesFlexibleSizedTracks(span, directi on)) { |
809 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, span)); | 853 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, span)); |
810 } | 854 } |
811 } | 855 } |
812 } | 856 } |
813 } | 857 } |
814 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); | 858 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); |
815 | 859 |
816 auto it = sizingData.itemsSortedByIncreasingSpan.begin(); | 860 auto it = sizingData.itemsSortedByIncreasingSpan.begin(); |
817 auto end = sizingData.itemsSortedByIncreasingSpan.end(); | 861 auto end = sizingData.itemsSortedByIncreasingSpan.end(); |
818 while (it != end) { | 862 while (it != end) { |
819 GridItemsSpanGroupRange spanGroupRange = { it, std::upper_bound(it, end, *it) }; | 863 GridItemsSpanGroupRange spanGroupRange = { it, std::upper_bound(it, end, *it) }; |
820 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMinimums >(direction, sizingData, spanGroupRange); | 864 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMinimums >(direction, sizingData, spanGroupRange); |
821 resolveContentBasedTrackSizingFunctionsForItems<ResolveContentBasedMinim ums>(direction, sizingData, spanGroupRange); | 865 resolveContentBasedTrackSizingFunctionsForItems<ResolveContentBasedMinim ums>(direction, sizingData, spanGroupRange); |
822 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMinimum s>(direction, sizingData, spanGroupRange); | 866 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMinimum s>(direction, sizingData, spanGroupRange); |
823 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMaximums >(direction, sizingData, spanGroupRange); | 867 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMaximums >(direction, sizingData, spanGroupRange); |
824 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMaximum s>(direction, sizingData, spanGroupRange); | 868 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMaximum s>(direction, sizingData, spanGroupRange); |
825 it = spanGroupRange.rangeEnd; | 869 it = spanGroupRange.rangeEnd; |
826 } | 870 } |
827 | 871 |
828 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 872 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
829 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; | 873 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; |
830 if (track.growthLimitIsInfinite()) | 874 if (track.growthLimitIsInfinite()) |
831 track.setGrowthLimit(track.baseSize()); | 875 track.setGrowthLimit(track.baseSize()); |
832 } | 876 } |
833 } | 877 } |
834 | 878 |
835 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridT rack& track, Vector<GridTrack>& columnTracks) | 879 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridT rack& track, const GridSizingData& sizingData) |
836 { | 880 { |
837 const GridResolvedPosition trackPosition = span.resolvedInitialPosition; | 881 const GridResolvedPosition trackPosition = span.resolvedInitialPosition; |
838 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); | 882 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); |
839 | 883 |
840 if (trackSize.hasMinContentMinTrackBreadth()) | 884 if (trackSize.hasMinContentMinTrackBreadth()) |
841 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, columnTracks))); | 885 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, sizingData))); |
842 else if (trackSize.hasMaxContentMinTrackBreadth()) | 886 else if (trackSize.hasMaxContentMinTrackBreadth()) |
843 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, columnTracks))); | 887 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, sizingData))); |
844 else if (trackSize.hasAutoMinTrackBreadth()) | 888 else if (trackSize.hasAutoMinTrackBreadth()) |
845 track.setBaseSize(std::max(track.baseSize(), minSizeForChild(gridItem, d irection, columnTracks))); | 889 track.setBaseSize(std::max(track.baseSize(), minSizeForChild(gridItem, d irection, sizingData))); |
846 | 890 |
847 if (trackSize.hasMinContentMaxTrackBreadth()) | 891 if (trackSize.hasMinContentMaxTrackBreadth()) |
848 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr idItem, direction, columnTracks))); | 892 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr idItem, direction, sizingData))); |
849 else if (trackSize.hasMaxContentOrAutoMaxTrackBreadth()) | 893 else if (trackSize.hasMaxContentOrAutoMaxTrackBreadth()) |
850 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr idItem, direction, columnTracks))); | 894 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr idItem, direction, sizingData))); |
851 } | 895 } |
852 | 896 |
853 static const LayoutUnit& trackSizeForTrackSizeComputationPhase(TrackSizeComputat ionPhase phase, const GridTrack& track, TrackSizeRestriction restriction) | 897 static const LayoutUnit& trackSizeForTrackSizeComputationPhase(TrackSizeComputat ionPhase phase, const GridTrack& track, TrackSizeRestriction restriction) |
854 { | 898 { |
855 switch (phase) { | 899 switch (phase) { |
856 case ResolveIntrinsicMinimums: | 900 case ResolveIntrinsicMinimums: |
857 case ResolveContentBasedMinimums: | 901 case ResolveContentBasedMinimums: |
858 case ResolveMaxContentMinimums: | 902 case ResolveMaxContentMinimums: |
859 case MaximizeTracks: | 903 case MaximizeTracks: |
860 return track.baseSize(); | 904 return track.baseSize(); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
948 track.setGrowthLimit(track.plannedSize()); | 992 track.setGrowthLimit(track.plannedSize()); |
949 return; | 993 return; |
950 case MaximizeTracks: | 994 case MaximizeTracks: |
951 ASSERT_NOT_REACHED(); | 995 ASSERT_NOT_REACHED(); |
952 return; | 996 return; |
953 } | 997 } |
954 | 998 |
955 ASSERT_NOT_REACHED(); | 999 ASSERT_NOT_REACHED(); |
956 } | 1000 } |
957 | 1001 |
958 LayoutUnit LayoutGrid::currentItemSizeForTrackSizeComputationPhase(TrackSizeComp utationPhase phase, LayoutBox& gridItem, GridTrackSizingDirection direction, Vec tor<GridTrack>& columnTracks) | 1002 LayoutUnit LayoutGrid::currentItemSizeForTrackSizeComputationPhase(TrackSizeComp utationPhase phase, LayoutBox& gridItem, GridTrackSizingDirection direction, con st GridSizingData& sizingData) |
959 { | 1003 { |
960 switch (phase) { | 1004 switch (phase) { |
961 case ResolveIntrinsicMinimums: | 1005 case ResolveIntrinsicMinimums: |
962 return minSizeForChild(gridItem, direction, columnTracks); | 1006 return minSizeForChild(gridItem, direction, sizingData); |
963 case ResolveContentBasedMinimums: | 1007 case ResolveContentBasedMinimums: |
964 case ResolveIntrinsicMaximums: | 1008 case ResolveIntrinsicMaximums: |
965 return minContentForChild(gridItem, direction, columnTracks); | 1009 return minContentForChild(gridItem, direction, sizingData); |
966 case ResolveMaxContentMinimums: | 1010 case ResolveMaxContentMinimums: |
967 case ResolveMaxContentMaximums: | 1011 case ResolveMaxContentMaximums: |
968 return maxContentForChild(gridItem, direction, columnTracks); | 1012 return maxContentForChild(gridItem, direction, sizingData); |
969 case MaximizeTracks: | 1013 case MaximizeTracks: |
970 ASSERT_NOT_REACHED(); | 1014 ASSERT_NOT_REACHED(); |
971 return 0; | 1015 return 0; |
972 } | 1016 } |
973 | 1017 |
974 ASSERT_NOT_REACHED(); | 1018 ASSERT_NOT_REACHED(); |
975 return 0; | 1019 return 0; |
976 } | 1020 } |
977 | 1021 |
978 template <TrackSizeComputationPhase phase> | 1022 template <TrackSizeComputationPhase phase> |
(...skipping 24 matching lines...) Expand all Loading... | |
1003 | 1047 |
1004 if (trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(ph ase, trackSize)) | 1048 if (trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(ph ase, trackSize)) |
1005 sizingData.growBeyondGrowthLimitsTracks.append(&track); | 1049 sizingData.growBeyondGrowthLimitsTracks.append(&track); |
1006 } | 1050 } |
1007 | 1051 |
1008 if (sizingData.filteredTracks.isEmpty()) | 1052 if (sizingData.filteredTracks.isEmpty()) |
1009 continue; | 1053 continue; |
1010 | 1054 |
1011 spanningTracksSize += guttersSize(direction, itemSpan.integerSpan()); | 1055 spanningTracksSize += guttersSize(direction, itemSpan.integerSpan()); |
1012 | 1056 |
1013 LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phas e, gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTr acksSize; | 1057 LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phas e, gridItemWithSpan.gridItem(), direction, sizingData) - spanningTracksSize; |
1014 extraSpace = std::max<LayoutUnit>(extraSpace, 0); | 1058 extraSpace = std::max<LayoutUnit>(extraSpace, 0); |
1015 auto& tracksToGrowBeyondGrowthLimits = sizingData.growBeyondGrowthLimits Tracks.isEmpty() ? sizingData.filteredTracks : sizingData.growBeyondGrowthLimits Tracks; | 1059 auto& tracksToGrowBeyondGrowthLimits = sizingData.growBeyondGrowthLimits Tracks.isEmpty() ? sizingData.filteredTracks : sizingData.growBeyondGrowthLimits Tracks; |
1016 distributeSpaceToTracks<phase>(sizingData.filteredTracks, &tracksToGrowB eyondGrowthLimits, sizingData, extraSpace); | 1060 distributeSpaceToTracks<phase>(sizingData.filteredTracks, &tracksToGrowB eyondGrowthLimits, sizingData, extraSpace); |
1017 } | 1061 } |
1018 | 1062 |
1019 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 1063 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
1020 GridTrack& track = tracks[trackIndex]; | 1064 GridTrack& track = tracks[trackIndex]; |
1021 markAsInfinitelyGrowableForTrackSizeComputationPhase(phase, track); | 1065 markAsInfinitelyGrowableForTrackSizeComputationPhase(phase, track); |
1022 updateTrackSizeForTrackSizeComputationPhase(phase, track); | 1066 updateTrackSizeForTrackSizeComputationPhase(phase, track); |
1023 } | 1067 } |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1521 ASSERT(m_gridItemCoordinate.contains(&gridItem)); | 1565 ASSERT(m_gridItemCoordinate.contains(&gridItem)); |
1522 return m_gridItemCoordinate.get(&gridItem); | 1566 return m_gridItemCoordinate.get(&gridItem); |
1523 } | 1567 } |
1524 | 1568 |
1525 GridSpan LayoutGrid::cachedGridSpan(const LayoutBox& gridItem, GridTrackSizingDi rection direction) const | 1569 GridSpan LayoutGrid::cachedGridSpan(const LayoutBox& gridItem, GridTrackSizingDi rection direction) const |
1526 { | 1570 { |
1527 GridCoordinate coordinate = cachedGridCoordinate(gridItem); | 1571 GridCoordinate coordinate = cachedGridCoordinate(gridItem); |
1528 return direction == ForColumns ? coordinate.columns : coordinate.rows; | 1572 return direction == ForColumns ? coordinate.columns : coordinate.rows; |
1529 } | 1573 } |
1530 | 1574 |
1531 LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack SizingDirection direction, const Vector<GridTrack>& tracks) const | 1575 bool LayoutGrid::gridLengthIsIndefinite(const GridLength& length, GridTrackSizin gDirection direction) const |
1532 { | 1576 { |
1577 return length.isContentSized() || length.isFlex() || (length.hasPercentage() && !hasDefiniteLogicalSize(direction)); | |
1578 } | |
svillar
2015/12/01 12:43:14
I panicked when I saw this one :). We should not u
jfernandez
2015/12/01 15:13:39
Umm, can you confirm that checking that out is eno
| |
1579 | |
1580 LayoutUnit LayoutGrid::assumedRowsBreadthForOrthogonalChild(const LayoutBox& chi ld) const | |
1581 { | |
1582 ASSERT(child.isHorizontalWritingMode() != isHorizontalWritingMode()); | |
1583 const GridSpan& span = cachedGridSpan(child, ForRows); | |
1584 LayoutUnit gridAreaBreadth = 0; | |
1585 for (GridSpan::iterator trackPosition = span.begin(); trackPosition != span. end(); ++trackPosition) { | |
svillar
2015/12/01 12:43:14
Better do:
for (auto trackPosition : span)
since
jfernandez
2015/12/01 15:13:39
Acknowledged.
| |
1586 const GridLength& maxTrackBreadth = gridTrackSize(ForRows, trackPosition .toInt()).maxTrackBreadth(); | |
1587 if (gridLengthIsIndefinite(maxTrackBreadth, ForRows)) { | |
1588 gridAreaBreadth = child.maxPreferredLogicalWidth() + marginIntrinsic LogicalWidthForChild(child); | |
1589 break; | |
1590 } | |
1591 gridAreaBreadth += valueForLength(maxTrackBreadth.length(), 0); | |
1592 } | |
1593 | |
1594 gridAreaBreadth += guttersSize(ForRows, span.integerSpan()); | |
1595 | |
1596 return gridAreaBreadth; | |
1597 } | |
1598 | |
1599 LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack SizingDirection direction, const GridSizingData& sizingData) const | |
1600 { | |
1601 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col umnTracks : sizingData.rowTracks; | |
1602 if (child.isHorizontalWritingMode() != isHorizontalWritingMode() && tracks.i sEmpty()) | |
svillar
2015/12/01 12:43:14
Don't get why you need the isEmpty().
jfernandez
2015/12/01 15:13:39
I needed a way to detect whether row tracks were a
| |
1603 return assumedRowsBreadthForOrthogonalChild(child); | |
1533 const GridSpan& span = cachedGridSpan(child, direction); | 1604 const GridSpan& span = cachedGridSpan(child, direction); |
1534 LayoutUnit gridAreaBreadth = 0; | 1605 LayoutUnit gridAreaBreadth = 0; |
1535 for (GridSpan::iterator trackPosition = span.begin(); trackPosition != span. end(); ++trackPosition) | 1606 for (GridSpan::iterator trackPosition = span.begin(); trackPosition != span. end(); ++trackPosition) |
1536 gridAreaBreadth += tracks[trackPosition.toInt()].baseSize(); | 1607 gridAreaBreadth += tracks[trackPosition.toInt()].baseSize(); |
1537 | 1608 |
1538 gridAreaBreadth += guttersSize(direction, span.integerSpan()); | 1609 gridAreaBreadth += guttersSize(direction, span.integerSpan()); |
1539 | 1610 |
1540 return gridAreaBreadth; | 1611 return gridAreaBreadth; |
1541 } | 1612 } |
1542 | 1613 |
(...skipping 19 matching lines...) Expand all Loading... | |
1562 // using these positions to compute them. | 1633 // using these positions to compute them. |
1563 | 1634 |
1564 unsigned numberOfTracks = sizingData.columnTracks.size(); | 1635 unsigned numberOfTracks = sizingData.columnTracks.size(); |
1565 unsigned numberOfLines = numberOfTracks + 1; | 1636 unsigned numberOfLines = numberOfTracks + 1; |
1566 unsigned lastLine = numberOfLines - 1; | 1637 unsigned lastLine = numberOfLines - 1; |
1567 unsigned nextToLastLine = numberOfLines - 2; | 1638 unsigned nextToLastLine = numberOfLines - 2; |
1568 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(Fo rColumns, sizingData.freeSpaceForDirection(ForColumns), numberOfTracks); | 1639 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(Fo rColumns, sizingData.freeSpaceForDirection(ForColumns), numberOfTracks); |
1569 LayoutUnit trackGap = guttersSize(ForColumns, 2); | 1640 LayoutUnit trackGap = guttersSize(ForColumns, 2); |
1570 m_columnPositions.resize(numberOfLines); | 1641 m_columnPositions.resize(numberOfLines); |
1571 m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset; | 1642 m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset; |
1572 for (unsigned i = 0; i < lastLine; ++i) | 1643 for (unsigned i = 0; i < nextToLastLine; ++i) |
cbiesinger
2015/11/26 02:26:16
Why this change now?
jfernandez
2015/11/26 08:58:27
I admit that this change is unrelated to the issue
| |
1573 m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOff set + sizingData.columnTracks[i].baseSize() + trackGap; | 1644 m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOff set + sizingData.columnTracks[i].baseSize() + trackGap; |
1574 m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData .columnTracks[nextToLastLine].baseSize(); | 1645 m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData .columnTracks[nextToLastLine].baseSize(); |
1575 | 1646 |
1576 numberOfTracks = sizingData.rowTracks.size(); | 1647 numberOfTracks = sizingData.rowTracks.size(); |
1577 numberOfLines = numberOfTracks + 1; | 1648 numberOfLines = numberOfTracks + 1; |
1578 lastLine = numberOfLines - 1; | 1649 lastLine = numberOfLines - 1; |
1579 nextToLastLine = numberOfLines - 2; | 1650 nextToLastLine = numberOfLines - 2; |
1580 offset = computeContentPositionAndDistributionOffset(ForRows, sizingData.fre eSpaceForDirection(ForRows), numberOfTracks); | 1651 offset = computeContentPositionAndDistributionOffset(ForRows, sizingData.fre eSpaceForDirection(ForRows), numberOfTracks); |
1581 trackGap = guttersSize(ForRows, 2); | 1652 trackGap = guttersSize(ForRows, 2); |
1582 m_rowPositions.resize(numberOfLines); | 1653 m_rowPositions.resize(numberOfLines); |
1583 m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset; | 1654 m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset; |
1584 for (unsigned i = 0; i < lastLine; ++i) | 1655 for (unsigned i = 0; i < nextToLastLine; ++i) |
1585 m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize() + trackGap; | 1656 m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize() + trackGap; |
1586 m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTr acks[nextToLastLine].baseSize(); | 1657 m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTr acks[nextToLastLine].baseSize(); |
1587 } | 1658 } |
1588 | 1659 |
1589 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackBreadth, LayoutUnit childBreadth) | 1660 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackBreadth, LayoutUnit childBreadth) |
1590 { | 1661 { |
1591 LayoutUnit offset = trackBreadth - childBreadth; | 1662 LayoutUnit offset = trackBreadth - childBreadth; |
1592 switch (overflow) { | 1663 switch (overflow) { |
1593 case OverflowAlignmentSafe: | 1664 case OverflowAlignmentSafe: |
1594 // If overflow is 'safe', we have to make sure we don't overflow the 'st art' | 1665 // If overflow is 'safe', we have to make sure we don't overflow the 'st art' |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2026 case ContentPositionAuto: | 2097 case ContentPositionAuto: |
2027 break; | 2098 break; |
2028 } | 2099 } |
2029 | 2100 |
2030 ASSERT_NOT_REACHED(); | 2101 ASSERT_NOT_REACHED(); |
2031 return {0, 0}; | 2102 return {0, 0}; |
2032 } | 2103 } |
2033 | 2104 |
2034 LayoutPoint LayoutGrid::findChildLogicalPosition(const LayoutBox& child, GridSiz ingData& sizingData) const | 2105 LayoutPoint LayoutGrid::findChildLogicalPosition(const LayoutBox& child, GridSiz ingData& sizingData) const |
2035 { | 2106 { |
2107 LayoutUnit columnAxisOffset = columnAxisOffsetForChild(child); | |
2036 LayoutUnit rowAxisOffset = rowAxisOffsetForChild(child); | 2108 LayoutUnit rowAxisOffset = rowAxisOffsetForChild(child); |
2037 // We stored m_columnPosition s's data ignoring the direction, hence we migh t need now | 2109 // We stored m_columnPositions's data ignoring the direction, hence we might need now |
2038 // to translate positions from RTL to LTR, as it's more convenient for paint ing. | 2110 // to translate positions from RTL to LTR, as it's more convenient for paint ing. |
2039 if (!style()->isLeftToRightDirection()) { | 2111 if (!style()->isLeftToRightDirection()) { |
2040 LayoutUnit alignmentOffset = m_columnPositions[0] - borderAndPaddingSta rt(); | 2112 LayoutUnit alignmentOffset = m_columnPositions[0] - borderAndPaddingSta rt(); |
2041 LayoutUnit rightGridEdgePosition = m_columnPositions[m_columnPositions.s ize() - 1] + alignmentOffset + borderAndPaddingLogicalLeft(); | 2113 LayoutUnit rightGridEdgePosition = m_columnPositions[m_columnPositions.s ize() - 1] + alignmentOffset + borderAndPaddingLogicalLeft(); |
2042 rowAxisOffset = rightGridEdgePosition - (rowAxisOffset + child.logicalWi dth()); | 2114 rowAxisOffset = rightGridEdgePosition - (rowAxisOffset + child.logicalWi dth()); |
2043 } | 2115 } |
2044 | 2116 |
2045 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); | 2117 // "In the positioning phase [...] calculations are performed according to t he writing mode |
2118 // of the containing block of the box establishing the orthogonal flow." How ever, the | |
2119 // resulting LayoutPoint will be used in 'setLogicalPosition' in order to se t the child's | |
2120 // logical position, which will only take into account the child's writing-m ode. | |
2121 LayoutPoint childLocation(rowAxisOffset, columnAxisOffset); | |
2122 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); | |
2123 return hasOrthogonalWritingMode ? childLocation.transposedPoint() : childLoc ation; | |
2046 } | 2124 } |
2047 | 2125 |
2048 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const | 2126 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const |
2049 { | 2127 { |
2050 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2128 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2051 } | 2129 } |
2052 | 2130 |
2053 } // namespace blink | 2131 } // namespace blink |
OLD | NEW |