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 |