| 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 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 } | 139 } |
| 140 | 140 |
| 141 private: | 141 private: |
| 142 const GridRepresentation& m_grid; | 142 const GridRepresentation& m_grid; |
| 143 TrackSizingDirection m_direction; | 143 TrackSizingDirection m_direction; |
| 144 size_t m_rowIndex; | 144 size_t m_rowIndex; |
| 145 size_t m_columnIndex; | 145 size_t m_columnIndex; |
| 146 size_t m_childIndex; | 146 size_t m_childIndex; |
| 147 }; | 147 }; |
| 148 | 148 |
| 149 struct RenderGrid::GridSizingData { |
| 150 WTF_MAKE_NONCOPYABLE(GridSizingData); |
| 151 public: |
| 152 GridSizingData(size_t gridColumnCount, size_t gridRowCount) |
| 153 : columnTracks(gridColumnCount) |
| 154 , rowTracks(gridRowCount) |
| 155 { |
| 156 } |
| 157 |
| 158 Vector<GridTrack> columnTracks; |
| 159 Vector<GridTrack> rowTracks; |
| 160 Vector<size_t> contentSizedTracksIndex; |
| 161 |
| 162 // Performance optimization: hold onto these Vectors until the end of Layout
to avoid repeated malloc / free. |
| 163 Vector<LayoutUnit> distributeTrackVector; |
| 164 Vector<GridTrack*> filteredTracks; |
| 165 }; |
| 166 |
| 149 RenderGrid::RenderGrid(Element* element) | 167 RenderGrid::RenderGrid(Element* element) |
| 150 : RenderBlock(element) | 168 : RenderBlock(element) |
| 151 , m_gridIsDirty(true) | 169 , m_gridIsDirty(true) |
| 152 , m_orderIterator(this) | 170 , m_orderIterator(this) |
| 153 { | 171 { |
| 154 // All of our children must be block level. | 172 // All of our children must be block level. |
| 155 setChildrenInline(false); | 173 setChildrenInline(false); |
| 156 } | 174 } |
| 157 | 175 |
| 158 RenderGrid::~RenderGrid() | 176 RenderGrid::~RenderGrid() |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 maxContentSize = std::max(maxContentSize, gridItem->maxPreferredLogi
calWidth() + marginIntrinsicLogicalWidthForChild(gridItem)); | 364 maxContentSize = std::max(maxContentSize, gridItem->maxPreferredLogi
calWidth() + marginIntrinsicLogicalWidthForChild(gridItem)); |
| 347 | 365 |
| 348 return maxContentSize; | 366 return maxContentSize; |
| 349 } | 367 } |
| 350 | 368 |
| 351 // FIXME: css3-sizing mentions that we should resolve "definite sizes" | 369 // FIXME: css3-sizing mentions that we should resolve "definite sizes" |
| 352 // (including <percentage> and calc()) but we don't do it elsewhere. | 370 // (including <percentage> and calc()) but we don't do it elsewhere. |
| 353 return 0; | 371 return 0; |
| 354 } | 372 } |
| 355 | 373 |
| 356 void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction,
Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks) | 374 void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction,
GridSizingData& sizingData) |
| 357 { | 375 { |
| 358 LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogi
calWidth() : availableLogicalHeight(IncludeMarginBorderPadding); | 376 LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogi
calWidth() : availableLogicalHeight(IncludeMarginBorderPadding); |
| 359 Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTr
acks; | 377 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra
cks : sizingData.rowTracks; |
| 360 Vector<size_t> contentSizedTracks; | 378 sizingData.contentSizedTracksIndex.shrink(0); |
| 361 for (size_t i = 0; i < tracks.size(); ++i) { | 379 for (size_t i = 0; i < tracks.size(); ++i) { |
| 362 GridTrack& track = tracks[i]; | 380 GridTrack& track = tracks[i]; |
| 363 const GridTrackSize& trackSize = gridTrackSize(direction, i); | 381 const GridTrackSize& trackSize = gridTrackSize(direction, i); |
| 364 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); | 382 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); |
| 365 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); | 383 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); |
| 366 | 384 |
| 367 track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackB
readth); | 385 track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackB
readth); |
| 368 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBr
eadth, track.m_usedBreadth); | 386 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBr
eadth, track.m_usedBreadth); |
| 369 | 387 |
| 370 track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth); | 388 track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth); |
| 371 | 389 |
| 372 if (trackSize.isContentSized()) | 390 if (trackSize.isContentSized()) |
| 373 contentSizedTracks.append(i); | 391 sizingData.contentSizedTracksIndex.append(i); |
| 374 } | 392 } |
| 375 | 393 |
| 376 if (!contentSizedTracks.isEmpty()) | 394 if (!sizingData.contentSizedTracksIndex.isEmpty()) |
| 377 resolveContentBasedTrackSizingFunctions(direction, columnTracks, rowTrac
ks, contentSizedTracks, availableLogicalSpace); | 395 resolveContentBasedTrackSizingFunctions(direction, sizingData, available
LogicalSpace); |
| 378 | 396 |
| 379 for (size_t i = 0; i < tracks.size(); ++i) { | 397 for (size_t i = 0; i < tracks.size(); ++i) { |
| 380 ASSERT(tracks[i].m_maxBreadth != infinity); | 398 ASSERT(tracks[i].m_maxBreadth != infinity); |
| 381 availableLogicalSpace -= tracks[i].m_usedBreadth; | 399 availableLogicalSpace -= tracks[i].m_usedBreadth; |
| 382 } | 400 } |
| 383 | 401 |
| 384 if (availableLogicalSpace <= 0) | 402 if (availableLogicalSpace <= 0) |
| 385 return; | 403 return; |
| 386 | 404 |
| 387 const size_t tracksSize = tracks.size(); | 405 const size_t tracksSize = tracks.size(); |
| 388 Vector<GridTrack*> tracksForDistribution(tracksSize); | 406 Vector<GridTrack*> tracksForDistribution(tracksSize); |
| 389 for (size_t i = 0; i < tracksSize; ++i) | 407 for (size_t i = 0; i < tracksSize; ++i) |
| 390 tracksForDistribution[i] = tracks.data() + i; | 408 tracksForDistribution[i] = tracks.data() + i; |
| 391 | 409 |
| 392 distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, &
GridTrack::growUsedBreadth, availableLogicalSpace); | 410 distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, &
GridTrack::growUsedBreadth, sizingData, availableLogicalSpace); |
| 393 | 411 |
| 394 // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. | 412 // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. |
| 395 | 413 |
| 396 // FIXME: Handle the case where RemainingSpace is not defined. | 414 // FIXME: Handle the case where RemainingSpace is not defined. |
| 397 double normalizedFractionBreadth = computeNormalizedFractionBreadth(tracks,
direction, availableLogicalSpace); | 415 double normalizedFractionBreadth = computeNormalizedFractionBreadth(tracks,
direction, availableLogicalSpace); |
| 398 for (size_t i = 0; i < tracksSize; ++i) { | 416 for (size_t i = 0; i < tracksSize; ++i) { |
| 399 const GridTrackSize& trackSize = gridTrackSize(direction, i); | 417 const GridTrackSize& trackSize = gridTrackSize(direction, i); |
| 400 if (!trackSize.maxTrackBreadth().isFlex()) | 418 if (!trackSize.maxTrackBreadth().isFlex()) |
| 401 continue; | 419 continue; |
| 402 | 420 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 | 574 |
| 557 if (direction == ForColumns) { | 575 if (direction == ForColumns) { |
| 558 // FIXME: It's unclear if we should return the intrinsic width or the pr
eferred width. | 576 // FIXME: It's unclear if we should return the intrinsic width or the pr
eferred width. |
| 559 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html | 577 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html |
| 560 return child->maxPreferredLogicalWidth(); | 578 return child->maxPreferredLogicalWidth(); |
| 561 } | 579 } |
| 562 | 580 |
| 563 return logicalContentHeightForChild(child, columnTracks); | 581 return logicalContentHeightForChild(child, columnTracks); |
| 564 } | 582 } |
| 565 | 583 |
| 566 void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection di
rection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, const Ve
ctor<size_t>& contentSizedTracks, LayoutUnit& availableLogicalSpace) | 584 void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection di
rection, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) |
| 567 { | 585 { |
| 568 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr
id track (crbug.com/235258). | 586 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr
id track (crbug.com/235258). |
| 569 | 587 |
| 570 // FIXME: Per step 2 of the specification, we should order the grid items by
increasing span. | 588 // FIXME: Per step 2 of the specification, we should order the grid items by
increasing span. |
| 571 | 589 |
| 572 for (size_t i = 0; i < contentSizedTracks.size(); ++i) { | 590 for (size_t i = 0; i < sizingData.contentSizedTracksIndex.size(); ++i) { |
| 573 GridIterator iterator(m_grid, direction, contentSizedTracks[i]); | 591 GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIn
dex[i]); |
| 574 while (RenderBox* gridItem = iterator.nextGridItem()) { | 592 while (RenderBox* gridItem = iterator.nextGridItem()) { |
| 575 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &Re
nderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBread
th); | 593 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat
a, gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min
ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
| 576 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderG
rid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | 594 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat
a, gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte
ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
| 577 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &Re
nderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::g
rowMaxBreadth); | 595 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat
a, gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min
ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth
); |
| 578 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderG
rid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMa
xBreadth); | 596 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat
a, gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte
ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
| 579 } | 597 } |
| 580 | 598 |
| 581 GridTrack& track = (direction == ForColumns) ? columnTracks[i] : rowTrac
ks[i]; | 599 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[i
] : sizingData.rowTracks[i]; |
| 582 if (track.m_maxBreadth == infinity) | 600 if (track.m_maxBreadth == infinity) |
| 583 track.m_maxBreadth = track.m_usedBreadth; | 601 track.m_maxBreadth = track.m_usedBreadth; |
| 584 } | 602 } |
| 585 } | 603 } |
| 586 | 604 |
| 587 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDire
ction direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks,
RenderBox* gridItem, FilterFunction filterFunction, SizingFunction sizingFunctio
n, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) | 605 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDire
ction direction, GridSizingData& sizingData, RenderBox* gridItem, FilterFunction
filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, A
ccumulatorGrowFunction trackGrowthFunction) |
| 588 { | 606 { |
| 589 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); | 607 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); |
| 590 const size_t initialTrackIndex = (direction == ForColumns) ? coordinate.colu
mns.initialPositionIndex : coordinate.rows.initialPositionIndex; | 608 const size_t initialTrackIndex = (direction == ForColumns) ? coordinate.colu
mns.initialPositionIndex : coordinate.rows.initialPositionIndex; |
| 591 const size_t finalTrackIndex = (direction == ForColumns) ? coordinate.column
s.finalPositionIndex : coordinate.rows.finalPositionIndex; | 609 const size_t finalTrackIndex = (direction == ForColumns) ? coordinate.column
s.finalPositionIndex : coordinate.rows.finalPositionIndex; |
| 592 | 610 |
| 593 Vector<GridTrack*> tracks; | 611 sizingData.filteredTracks.shrink(0); |
| 594 for (size_t trackIndex = initialTrackIndex; trackIndex <= finalTrackIndex; +
+trackIndex) { | 612 for (size_t trackIndex = initialTrackIndex; trackIndex <= finalTrackIndex; +
+trackIndex) { |
| 595 const GridTrackSize& trackSize = gridTrackSize(direction, trackIndex); | 613 const GridTrackSize& trackSize = gridTrackSize(direction, trackIndex); |
| 596 if (!(trackSize.*filterFunction)()) | 614 if (!(trackSize.*filterFunction)()) |
| 597 continue; | 615 continue; |
| 598 | 616 |
| 599 GridTrack& track = (direction == ForColumns) ? columnTracks[trackIndex]
: rowTracks[trackIndex]; | 617 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t
rackIndex] : sizingData.rowTracks[trackIndex]; |
| 600 tracks.append(&track); | 618 sizingData.filteredTracks.append(&track); |
| 601 } | 619 } |
| 602 | 620 |
| 603 if (tracks.isEmpty()) | 621 if (sizingData.filteredTracks.isEmpty()) |
| 604 return; | 622 return; |
| 605 | 623 |
| 606 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItem, direct
ion, columnTracks); | 624 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItem, direct
ion, sizingData.columnTracks); |
| 607 for (size_t trackIndexForSpace = initialTrackIndex; trackIndexForSpace <= fi
nalTrackIndex; ++trackIndexForSpace) { | 625 for (size_t trackIndexForSpace = initialTrackIndex; trackIndexForSpace <= fi
nalTrackIndex; ++trackIndexForSpace) { |
| 608 GridTrack& track = (direction == ForColumns) ? columnTracks[trackIndexFo
rSpace] : rowTracks[trackIndexForSpace]; | 626 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t
rackIndexForSpace] : sizingData.rowTracks[trackIndexForSpace]; |
| 609 additionalBreadthSpace -= (track.*trackGetter)(); | 627 additionalBreadthSpace -= (track.*trackGetter)(); |
| 610 } | 628 } |
| 611 | 629 |
| 612 // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadt
h|. | 630 // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadt
h|. |
| 613 distributeSpaceToTracks(tracks, &tracks, trackGetter, trackGrowthFunction, a
dditionalBreadthSpace); | 631 distributeSpaceToTracks(sizingData.filteredTracks, &sizingData.filteredTrack
s, trackGetter, trackGrowthFunction, sizingData, additionalBreadthSpace); |
| 614 } | 632 } |
| 615 | 633 |
| 616 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr
ack* track2) | 634 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr
ack* track2) |
| 617 { | 635 { |
| 618 return (track1->m_maxBreadth - track1->m_usedBreadth) < (track2->m_maxBreadt
h - track2->m_usedBreadth); | 636 return (track1->m_maxBreadth - track1->m_usedBreadth) < (track2->m_maxBreadt
h - track2->m_usedBreadth); |
| 619 } | 637 } |
| 620 | 638 |
| 621 void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<Grid
Track*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter trackGetter, Accumula
torGrowFunction trackGrowthFunction, LayoutUnit& availableLogicalSpace) | 639 void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<Grid
Track*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter trackGetter, Accumula
torGrowFunction trackGrowthFunction, GridSizingData& sizingData, LayoutUnit& ava
ilableLogicalSpace) |
| 622 { | 640 { |
| 623 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); | 641 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); |
| 624 | 642 |
| 625 size_t tracksSize = tracks.size(); | 643 size_t tracksSize = tracks.size(); |
| 626 Vector<LayoutUnit> updatedTrackBreadths(tracksSize); | 644 sizingData.distributeTrackVector.resize(tracksSize); |
| 627 | 645 |
| 628 for (size_t i = 0; i < tracksSize; ++i) { | 646 for (size_t i = 0; i < tracksSize; ++i) { |
| 629 GridTrack& track = *tracks[i]; | 647 GridTrack& track = *tracks[i]; |
| 630 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksS
ize - i); | 648 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksS
ize - i); |
| 631 LayoutUnit trackBreadth = (tracks[i]->*trackGetter)(); | 649 LayoutUnit trackBreadth = (tracks[i]->*trackGetter)(); |
| 632 LayoutUnit growthShare = std::max(LayoutUnit(), std::min(availableLogica
lSpaceShare, track.m_maxBreadth - trackBreadth)); | 650 LayoutUnit growthShare = std::max(LayoutUnit(), std::min(availableLogica
lSpaceShare, track.m_maxBreadth - trackBreadth)); |
| 633 // We should never shrink any grid track or else we can't guarantee we a
bide by our min-sizing function. | 651 // We should never shrink any grid track or else we can't guarantee we a
bide by our min-sizing function. |
| 634 updatedTrackBreadths[i] = trackBreadth + growthShare; | 652 sizingData.distributeTrackVector[i] = trackBreadth + growthShare; |
| 635 availableLogicalSpace -= growthShare; | 653 availableLogicalSpace -= growthShare; |
| 636 } | 654 } |
| 637 | 655 |
| 638 if (availableLogicalSpace > 0 && tracksForGrowthAboveMaxBreadth) { | 656 if (availableLogicalSpace > 0 && tracksForGrowthAboveMaxBreadth) { |
| 639 tracksSize = tracksForGrowthAboveMaxBreadth->size(); | 657 tracksSize = tracksForGrowthAboveMaxBreadth->size(); |
| 640 for (size_t i = 0; i < tracksSize; ++i) { | 658 for (size_t i = 0; i < tracksSize; ++i) { |
| 641 LayoutUnit growthShare = availableLogicalSpace / (tracksSize - i); | 659 LayoutUnit growthShare = availableLogicalSpace / (tracksSize - i); |
| 642 updatedTrackBreadths[i] += growthShare; | 660 sizingData.distributeTrackVector[i] += growthShare; |
| 643 availableLogicalSpace -= growthShare; | 661 availableLogicalSpace -= growthShare; |
| 644 } | 662 } |
| 645 } | 663 } |
| 646 | 664 |
| 647 for (size_t i = 0; i < tracksSize; ++i) { | 665 for (size_t i = 0; i < tracksSize; ++i) { |
| 648 LayoutUnit growth = updatedTrackBreadths[i] - (tracks[i]->*trackGetter)(
); | 666 LayoutUnit growth = sizingData.distributeTrackVector[i] - (tracks[i]->*t
rackGetter)(); |
| 649 if (growth >= 0) | 667 if (growth >= 0) |
| 650 (tracks[i]->*trackGrowthFunction)(growth); | 668 (tracks[i]->*trackGrowthFunction)(growth); |
| 651 } | 669 } |
| 652 } | 670 } |
| 653 | 671 |
| 654 #ifndef NDEBUG | 672 #ifndef NDEBUG |
| 655 bool RenderGrid::tracksAreWiderThanMinTrackBreadth(TrackSizingDirection directio
n, const Vector<GridTrack>& tracks) | 673 bool RenderGrid::tracksAreWiderThanMinTrackBreadth(TrackSizingDirection directio
n, const Vector<GridTrack>& tracks) |
| 656 { | 674 { |
| 657 for (size_t i = 0; i < tracks.size(); ++i) { | 675 for (size_t i = 0; i < tracks.size(); ++i) { |
| 658 const GridTrackSize& trackSize = gridTrackSize(direction, i); | 676 const GridTrackSize& trackSize = gridTrackSize(direction, i); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 { | 858 { |
| 841 m_grid.resize(0); | 859 m_grid.resize(0); |
| 842 m_gridItemCoordinate.clear(); | 860 m_gridItemCoordinate.clear(); |
| 843 m_gridIsDirty = true; | 861 m_gridIsDirty = true; |
| 844 } | 862 } |
| 845 | 863 |
| 846 void RenderGrid::layoutGridItems() | 864 void RenderGrid::layoutGridItems() |
| 847 { | 865 { |
| 848 placeItemsOnGrid(); | 866 placeItemsOnGrid(); |
| 849 | 867 |
| 850 Vector<GridTrack> columnTracks(gridColumnCount()); | 868 GridSizingData sizingData(gridColumnCount(), gridRowCount()); |
| 851 Vector<GridTrack> rowTracks(gridRowCount()); | 869 computedUsedBreadthOfGridTracks(ForColumns, sizingData); |
| 852 computedUsedBreadthOfGridTracks(ForColumns, columnTracks, rowTracks); | 870 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks
)); |
| 853 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, columnTracks)); | 871 computedUsedBreadthOfGridTracks(ForRows, sizingData); |
| 854 computedUsedBreadthOfGridTracks(ForRows, columnTracks, rowTracks); | 872 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData.rowTracks)); |
| 855 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, rowTracks)); | |
| 856 | 873 |
| 857 populateGridPositions(columnTracks, rowTracks); | 874 populateGridPositions(sizingData); |
| 858 | 875 |
| 859 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { | 876 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { |
| 860 // Because the grid area cannot be styled, we don't need to adjust | 877 // Because the grid area cannot be styled, we don't need to adjust |
| 861 // the grid breadth to account for 'box-sizing'. | 878 // the grid breadth to account for 'box-sizing'. |
| 862 LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOve
rrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogica
lWidth() : LayoutUnit(); | 879 LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOve
rrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogica
lWidth() : LayoutUnit(); |
| 863 LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOv
errideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogi
calHeight() : LayoutUnit(); | 880 LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOv
errideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogi
calHeight() : LayoutUnit(); |
| 864 | 881 |
| 865 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthF
orChild(child, ForColumns, columnTracks); | 882 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthF
orChild(child, ForColumns, sizingData.columnTracks); |
| 866 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadth
ForChild(child, ForRows, rowTracks); | 883 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadth
ForChild(child, ForRows, sizingData.rowTracks); |
| 867 | 884 |
| 868 SubtreeLayoutScope layoutScope(child); | 885 SubtreeLayoutScope layoutScope(child); |
| 869 if (oldOverrideContainingBlockContentLogicalWidth != overrideContainingB
lockContentLogicalWidth || (child->hasRelativeLogicalHeight() && oldOverrideCont
ainingBlockContentLogicalHeight != overrideContainingBlockContentLogicalHeight)) | 886 if (oldOverrideContainingBlockContentLogicalWidth != overrideContainingB
lockContentLogicalWidth || (child->hasRelativeLogicalHeight() && oldOverrideCont
ainingBlockContentLogicalHeight != overrideContainingBlockContentLogicalHeight)) |
| 870 layoutScope.setNeedsLayout(child); | 887 layoutScope.setNeedsLayout(child); |
| 871 | 888 |
| 872 child->setOverrideContainingBlockContentLogicalWidth(overrideContainingB
lockContentLogicalWidth); | 889 child->setOverrideContainingBlockContentLogicalWidth(overrideContainingB
lockContentLogicalWidth); |
| 873 child->setOverrideContainingBlockContentLogicalHeight(overrideContaining
BlockContentLogicalHeight); | 890 child->setOverrideContainingBlockContentLogicalHeight(overrideContaining
BlockContentLogicalHeight); |
| 874 | 891 |
| 875 LayoutRect oldChildRect = child->frameRect(); | 892 LayoutRect oldChildRect = child->frameRect(); |
| 876 | 893 |
| 877 // FIXME: Grid items should stretch to fill their cells. Once we | 894 // FIXME: Grid items should stretch to fill their cells. Once we |
| 878 // implement grid-{column,row}-align, we can also shrink to fit. For | 895 // implement grid-{column,row}-align, we can also shrink to fit. For |
| 879 // now, just size as if we were a regular child. | 896 // now, just size as if we were a regular child. |
| 880 child->layoutIfNeeded(); | 897 child->layoutIfNeeded(); |
| 881 | 898 |
| 882 child->setLogicalLocation(findChildLogicalPosition(child, columnTracks,
rowTracks)); | 899 child->setLogicalLocation(findChildLogicalPosition(child, sizingData)); |
| 883 | 900 |
| 884 // If the child moved, we have to repaint it as well as any floating/pos
itioned | 901 // If the child moved, we have to repaint it as well as any floating/pos
itioned |
| 885 // descendants. An exception is if we need a layout. In this case, we kn
ow we're going to | 902 // descendants. An exception is if we need a layout. In this case, we kn
ow we're going to |
| 886 // repaint ourselves (and the child) anyway. | 903 // repaint ourselves (and the child) anyway. |
| 887 if (!selfNeedsLayout() && child->checkForRepaintDuringLayout()) | 904 if (!selfNeedsLayout() && child->checkForRepaintDuringLayout()) |
| 888 child->repaintDuringLayoutIfMoved(oldChildRect); | 905 child->repaintDuringLayoutIfMoved(oldChildRect); |
| 889 } | 906 } |
| 890 | 907 |
| 891 for (size_t i = 0; i < rowTracks.size(); ++i) | 908 for (size_t i = 0; i < sizingData.rowTracks.size(); ++i) |
| 892 setLogicalHeight(logicalHeight() + rowTracks[i].m_usedBreadth); | 909 setLogicalHeight(logicalHeight() + sizingData.rowTracks[i].m_usedBreadth
); |
| 893 | 910 |
| 894 // FIXME: We should handle min / max logical height. | 911 // FIXME: We should handle min / max logical height. |
| 895 | 912 |
| 896 setLogicalHeight(logicalHeight() + borderAndPaddingLogicalHeight()); | 913 setLogicalHeight(logicalHeight() + borderAndPaddingLogicalHeight()); |
| 897 } | 914 } |
| 898 | 915 |
| 899 GridCoordinate RenderGrid::cachedGridCoordinate(const RenderBox* gridItem) const | 916 GridCoordinate RenderGrid::cachedGridCoordinate(const RenderBox* gridItem) const |
| 900 { | 917 { |
| 901 ASSERT(m_gridItemCoordinate.contains(gridItem)); | 918 ASSERT(m_gridItemCoordinate.contains(gridItem)); |
| 902 return m_gridItemCoordinate.get(gridItem); | 919 return m_gridItemCoordinate.get(gridItem); |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1111 LayoutUnit RenderGrid::gridAreaBreadthForChild(const RenderBox* child, TrackSizi
ngDirection direction, const Vector<GridTrack>& tracks) const | 1128 LayoutUnit RenderGrid::gridAreaBreadthForChild(const RenderBox* child, TrackSizi
ngDirection direction, const Vector<GridTrack>& tracks) const |
| 1112 { | 1129 { |
| 1113 const GridCoordinate& coordinate = cachedGridCoordinate(child); | 1130 const GridCoordinate& coordinate = cachedGridCoordinate(child); |
| 1114 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor
dinate.rows; | 1131 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor
dinate.rows; |
| 1115 LayoutUnit gridAreaBreadth = 0; | 1132 LayoutUnit gridAreaBreadth = 0; |
| 1116 for (size_t trackIndex = span.initialPositionIndex; trackIndex <= span.final
PositionIndex; ++trackIndex) | 1133 for (size_t trackIndex = span.initialPositionIndex; trackIndex <= span.final
PositionIndex; ++trackIndex) |
| 1117 gridAreaBreadth += tracks[trackIndex].m_usedBreadth; | 1134 gridAreaBreadth += tracks[trackIndex].m_usedBreadth; |
| 1118 return gridAreaBreadth; | 1135 return gridAreaBreadth; |
| 1119 } | 1136 } |
| 1120 | 1137 |
| 1121 void RenderGrid::populateGridPositions(const Vector<GridTrack>& columnTracks, co
nst Vector<GridTrack>& rowTracks) | 1138 void RenderGrid::populateGridPositions(const GridSizingData& sizingData) |
| 1122 { | 1139 { |
| 1123 m_columnPositions.resize(columnTracks.size() + 1); | 1140 m_columnPositions.resize(sizingData.columnTracks.size() + 1); |
| 1124 m_columnPositions[0] = borderAndPaddingStart(); | 1141 m_columnPositions[0] = borderAndPaddingStart(); |
| 1125 for (size_t i = 0; i < m_columnPositions.size() - 1; ++i) | 1142 for (size_t i = 0; i < m_columnPositions.size() - 1; ++i) |
| 1126 m_columnPositions[i + 1] = m_columnPositions[i] + columnTracks[i].m_used
Breadth; | 1143 m_columnPositions[i + 1] = m_columnPositions[i] + sizingData.columnTrack
s[i].m_usedBreadth; |
| 1127 | 1144 |
| 1128 m_rowPositions.resize(rowTracks.size() + 1); | 1145 m_rowPositions.resize(sizingData.rowTracks.size() + 1); |
| 1129 m_rowPositions[0] = borderAndPaddingBefore(); | 1146 m_rowPositions[0] = borderAndPaddingBefore(); |
| 1130 for (size_t i = 0; i < m_rowPositions.size() - 1; ++i) | 1147 for (size_t i = 0; i < m_rowPositions.size() - 1; ++i) |
| 1131 m_rowPositions[i + 1] = m_rowPositions[i] + rowTracks[i].m_usedBreadth; | 1148 m_rowPositions[i + 1] = m_rowPositions[i] + sizingData.rowTracks[i].m_us
edBreadth; |
| 1132 } | 1149 } |
| 1133 | 1150 |
| 1134 LayoutPoint RenderGrid::findChildLogicalPosition(RenderBox* child, const Vector<
GridTrack>& columnTracks, const Vector<GridTrack>& rowTracks) | 1151 LayoutPoint RenderGrid::findChildLogicalPosition(RenderBox* child, const GridSiz
ingData& sizingData) |
| 1135 { | 1152 { |
| 1136 const GridCoordinate& coordinate = cachedGridCoordinate(child); | 1153 const GridCoordinate& coordinate = cachedGridCoordinate(child); |
| 1137 ASSERT(coordinate.columns.initialPositionIndex < columnTracks.size()); | 1154 ASSERT(coordinate.columns.initialPositionIndex < sizingData.columnTracks.siz
e()); |
| 1138 ASSERT(coordinate.rows.initialPositionIndex < rowTracks.size()); | 1155 ASSERT(coordinate.rows.initialPositionIndex < sizingData.rowTracks.size()); |
| 1139 | 1156 |
| 1140 // The grid items should be inside the grid container's border box, that's w
hy they need to be shifted. | 1157 // The grid items should be inside the grid container's border box, that's w
hy they need to be shifted. |
| 1141 return LayoutPoint(m_columnPositions[coordinate.columns.initialPositionIndex
] + marginStartForChild(child), m_rowPositions[coordinate.rows.initialPositionIn
dex] + marginBeforeForChild(child)); | 1158 return LayoutPoint(m_columnPositions[coordinate.columns.initialPositionIndex
] + marginStartForChild(child), m_rowPositions[coordinate.rows.initialPositionIn
dex] + marginBeforeForChild(child)); |
| 1142 } | 1159 } |
| 1143 | 1160 |
| 1144 static GridSpan dirtiedGridAreas(const Vector<LayoutUnit>& coordinates, LayoutUn
it start, LayoutUnit end) | 1161 static GridSpan dirtiedGridAreas(const Vector<LayoutUnit>& coordinates, LayoutUn
it start, LayoutUnit end) |
| 1145 { | 1162 { |
| 1146 // This function does a binary search over the coordinates. | 1163 // This function does a binary search over the coordinates. |
| 1147 // FIXME: This doesn't work with grid items overflowing their grid areas and
should be tested & fixed. | 1164 // FIXME: This doesn't work with grid items overflowing their grid areas and
should be tested & fixed. |
| 1148 | 1165 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1190 if (isOutOfFlowPositioned()) | 1207 if (isOutOfFlowPositioned()) |
| 1191 return "RenderGrid (positioned)"; | 1208 return "RenderGrid (positioned)"; |
| 1192 if (isAnonymous()) | 1209 if (isAnonymous()) |
| 1193 return "RenderGrid (generated)"; | 1210 return "RenderGrid (generated)"; |
| 1194 if (isRelPositioned()) | 1211 if (isRelPositioned()) |
| 1195 return "RenderGrid (relative positioned)"; | 1212 return "RenderGrid (relative positioned)"; |
| 1196 return "RenderGrid"; | 1213 return "RenderGrid"; |
| 1197 } | 1214 } |
| 1198 | 1215 |
| 1199 } // namespace WebCore | 1216 } // namespace WebCore |
| OLD | NEW |