Commit 7dcf0e7c authored by Jacques Newman's avatar Jacques Newman Committed by Chromium LUCI CQ

[GridNG] Refactor NGGridLayoutAlgorithm

Refactors NGGridLayoutAlgorithm to reduce member variable usage.
This change should not have any functional changes.
The helpers used in NGGridLayoutAlgorithm::Layout need to be used
to help compute the min/max sizes, to do this they must be static
or const. This refactor has an emphasis on moving data from the
class to the stack whenever possible.
This change also removes the state machine, as the added complexity
was determined to not be needed.

Bug: 1045599
Change-Id: I6af79bc2e3093ccfd33d8c6cb5cc6d46c2ed3698
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2542766
Commit-Queue: Jacques Newman <janewman@microsoft.com>
Reviewed-by: default avatarKurt Catti-Schmidt <kschmi@microsoft.com>
Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarChristian Biesinger <cbiesinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#832589}
parent 679c0abd
...@@ -16,8 +16,7 @@ namespace blink { ...@@ -16,8 +16,7 @@ namespace blink {
NGGridLayoutAlgorithm::NGGridLayoutAlgorithm( NGGridLayoutAlgorithm::NGGridLayoutAlgorithm(
const NGLayoutAlgorithmParams& params) const NGLayoutAlgorithmParams& params)
: NGLayoutAlgorithm(params), : NGLayoutAlgorithm(params) {
state_(GridLayoutAlgorithmState::kMeasuringItems) {
DCHECK(params.space.IsNewFormattingContext()); DCHECK(params.space.IsNewFormattingContext());
DCHECK(!params.break_token); DCHECK(!params.break_token);
...@@ -27,75 +26,44 @@ NGGridLayoutAlgorithm::NGGridLayoutAlgorithm( ...@@ -27,75 +26,44 @@ NGGridLayoutAlgorithm::NGGridLayoutAlgorithm(
} }
scoped_refptr<const NGLayoutResult> NGGridLayoutAlgorithm::Layout() { scoped_refptr<const NGLayoutResult> NGGridLayoutAlgorithm::Layout() {
// Proceed by algorithm state, as some scenarios will involve a non-linear // Measure Items
// path through these steps (e.g. skipping or redoing some of them). Vector<GridItemData> grid_items;
while (state_ != GridLayoutAlgorithmState::kCompletedLayout) { Vector<GridItemData> out_of_flow_items;
switch (state_) { ConstructAndAppendGridItems(&grid_items, &out_of_flow_items);
case GridLayoutAlgorithmState::kMeasuringItems: {
SetSpecifiedTracks(); NGGridLayoutAlgorithmTrackCollection algorithm_column_track_collection;
DetermineExplicitTrackStarts(); NGGridLayoutAlgorithmTrackCollection algorithm_row_track_collection;
ConstructAndAppendGridItems(); BuildAlgorithmTrackCollections(&grid_items,
&algorithm_column_track_collection,
// TODO(janewman): Split placement into its own GridLayoutAlgorithmState &algorithm_row_track_collection);
NGGridPlacement(
automatic_row_repetitions_, automatic_column_repetitions_, // Cache set indices.
explicit_row_start_, explicit_column_start_, CacheItemSetIndices(GridTrackSizingDirection::kForColumns,
Style().IsGridAutoFlowAlgorithmSparse() &algorithm_column_track_collection, &grid_items);
? NGGridPlacement::PackingBehavior::kSparse CacheItemSetIndices(GridTrackSizingDirection::kForRows,
: NGGridPlacement::PackingBehavior::kDense, &algorithm_row_track_collection, &grid_items);
AutoFlowDirection(), Style(),
AutoFlowDirection() == kForRows ? column_count_ : row_count_, // Resolve inline size.
block_row_track_collection_, block_column_track_collection_, ComputeUsedTrackSizes(GridTrackSizingDirection::kForColumns, &grid_items,
grid_items_) &algorithm_column_track_collection);
.RunAutoPlacementAlgorithm();
// Resolve block size.
block_column_track_collection_.FinalizeRanges(); ComputeUsedTrackSizes(GridTrackSizingDirection::kForRows, &grid_items,
block_row_track_collection_.FinalizeRanges(); &algorithm_row_track_collection);
DCHECK_NE(child_percentage_size_.inline_size, kIndefiniteSize); // Place items.
algorithm_column_track_collection_ = LayoutUnit intrinsic_block_size;
NGGridLayoutAlgorithmTrackCollection( PlaceGridItems(grid_items, out_of_flow_items,
block_column_track_collection_, algorithm_column_track_collection,
/* is_content_box_size_indefinite */ false); algorithm_row_track_collection, &intrinsic_block_size);
bool is_content_box_block_size_indefinite = intrinsic_block_size =
child_percentage_size_.block_size == kIndefiniteSize;
algorithm_row_track_collection_ = NGGridLayoutAlgorithmTrackCollection(
block_row_track_collection_, is_content_box_block_size_indefinite);
CacheItemSetIndices();
state_ = GridLayoutAlgorithmState::kResolvingInlineSize;
break;
}
case GridLayoutAlgorithmState::kResolvingInlineSize:
ComputeUsedTrackSizes(GridTrackSizingDirection::kForColumns);
state_ = GridLayoutAlgorithmState::kResolvingBlockSize;
break;
case GridLayoutAlgorithmState::kResolvingBlockSize:
ComputeUsedTrackSizes(GridTrackSizingDirection::kForRows);
state_ = GridLayoutAlgorithmState::kPlacingGridItems;
break;
case GridLayoutAlgorithmState::kPlacingGridItems:
PlaceGridItems();
state_ = GridLayoutAlgorithmState::kCompletedLayout;
break;
case GridLayoutAlgorithmState::kCompletedLayout:
NOTREACHED();
break;
}
}
intrinsic_block_size_ =
ClampIntrinsicBlockSize(ConstraintSpace(), Node(), ClampIntrinsicBlockSize(ConstraintSpace(), Node(),
BorderScrollbarPadding(), intrinsic_block_size_); BorderScrollbarPadding(), intrinsic_block_size);
container_builder_.SetIntrinsicBlockSize(intrinsic_block_size_); container_builder_.SetIntrinsicBlockSize(intrinsic_block_size);
LayoutUnit block_size = ComputeBlockSizeForFragment( LayoutUnit block_size = ComputeBlockSizeForFragment(
ConstraintSpace(), Style(), BorderPadding(), intrinsic_block_size_, ConstraintSpace(), Style(), BorderPadding(), intrinsic_block_size,
border_box_size_.inline_size); border_box_size_.inline_size);
container_builder_.SetFragmentsTotalBlockSize(block_size); container_builder_.SetFragmentsTotalBlockSize(block_size);
...@@ -108,16 +76,6 @@ MinMaxSizesResult NGGridLayoutAlgorithm::ComputeMinMaxSizes( ...@@ -108,16 +76,6 @@ MinMaxSizesResult NGGridLayoutAlgorithm::ComputeMinMaxSizes(
return {MinMaxSizes(), /* depends_on_percentage_block_size */ true}; return {MinMaxSizes(), /* depends_on_percentage_block_size */ true};
} }
const NGGridLayoutAlgorithmTrackCollection&
NGGridLayoutAlgorithm::ColumnTrackCollection() const {
return algorithm_column_track_collection_;
}
const NGGridLayoutAlgorithmTrackCollection&
NGGridLayoutAlgorithm::RowTrackCollection() const {
return algorithm_row_track_collection_;
}
NGGridLayoutAlgorithm::GridItemData::GridItemData(const NGBlockNode node) NGGridLayoutAlgorithm::GridItemData::GridItemData(const NGBlockNode node)
: node(node) {} : node(node) {}
...@@ -230,22 +188,11 @@ NGGridLayoutAlgorithm::ReorderedGridItems::end() { ...@@ -230,22 +188,11 @@ NGGridLayoutAlgorithm::ReorderedGridItems::end() {
return Iterator(reordered_item_indices_.end(), &grid_items_); return Iterator(reordered_item_indices_.end(), &grid_items_);
} }
NGGridLayoutAlgorithm::ReorderedGridItems
NGGridLayoutAlgorithm::GetReorderedGridItems() {
return ReorderedGridItems(reordered_item_indices_, grid_items_);
}
NGGridLayoutAlgorithmTrackCollection& NGGridLayoutAlgorithm::TrackCollection(
GridTrackSizingDirection track_direction) {
return (track_direction == kForColumns) ? algorithm_column_track_collection_
: algorithm_row_track_collection_;
}
NGGridLayoutAlgorithmTrackCollection::SetIterator NGGridLayoutAlgorithmTrackCollection::SetIterator
NGGridLayoutAlgorithm::GetSetIteratorForItem( NGGridLayoutAlgorithm::GetSetIteratorForItem(
const GridItemData& item, const GridItemData& item,
GridTrackSizingDirection track_direction) { GridTrackSizingDirection track_direction,
auto& track_collection = TrackCollection(track_direction); NGGridLayoutAlgorithmTrackCollection& track_collection) {
return track_collection.GetSetIterator( return track_collection.GetSetIterator(
(track_direction == kForColumns) ? item.columns_begin_set_index (track_direction == kForColumns) ? item.columns_begin_set_index
: item.rows_begin_set_index, : item.rows_begin_set_index,
...@@ -278,7 +225,11 @@ LayoutUnit NGGridLayoutAlgorithm::ContributionSizeForGridItem( ...@@ -278,7 +225,11 @@ LayoutUnit NGGridLayoutAlgorithm::ContributionSizeForGridItem(
: LayoutUnit(); : LayoutUnit();
} }
void NGGridLayoutAlgorithm::ConstructAndAppendGridItems() { void NGGridLayoutAlgorithm::ConstructAndAppendGridItems(
Vector<GridItemData>* grid_items,
Vector<GridItemData>* out_of_flow_items) const {
DCHECK(grid_items);
DCHECK(out_of_flow_items);
NGGridChildIterator iterator(Node()); NGGridChildIterator iterator(Node());
for (NGBlockNode child = iterator.NextChild(); child; for (NGBlockNode child = iterator.NextChild(); child;
child = iterator.NextChild()) { child = iterator.NextChild()) {
...@@ -286,15 +237,10 @@ void NGGridLayoutAlgorithm::ConstructAndAppendGridItems() { ...@@ -286,15 +237,10 @@ void NGGridLayoutAlgorithm::ConstructAndAppendGridItems() {
// Store out-of-flow items separately, as they do not contribute to track // Store out-of-flow items separately, as they do not contribute to track
// sizing or auto placement. // sizing or auto placement.
if (child.IsOutOfFlowPositioned()) if (child.IsOutOfFlowPositioned())
out_of_flow_items_.emplace_back(grid_item); out_of_flow_items->emplace_back(grid_item);
else else
grid_items_.emplace_back(grid_item); grid_items->emplace_back(grid_item);
} }
// Fill grid item indices vector in document order.
reordered_item_indices_.ReserveInitialCapacity(grid_items_.size());
for (wtf_size_t i = 0; i < grid_items_.size(); ++i)
reordered_item_indices_.push_back(i);
} }
namespace { namespace {
...@@ -393,7 +339,7 @@ AxisEdge AxisEdgeFromItemPosition(const ComputedStyle& container_style, ...@@ -393,7 +339,7 @@ AxisEdge AxisEdgeFromItemPosition(const ComputedStyle& container_style,
} // namespace } // namespace
NGGridLayoutAlgorithm::GridItemData NGGridLayoutAlgorithm::MeasureGridItem( NGGridLayoutAlgorithm::GridItemData NGGridLayoutAlgorithm::MeasureGridItem(
const NGBlockNode node) { const NGBlockNode node) const {
const auto& container_style = Style(); const auto& container_style = Style();
// Before we take track sizing into account for column width contributions, // Before we take track sizing into account for column width contributions,
...@@ -463,116 +409,193 @@ NGConstraintSpace NGGridLayoutAlgorithm::BuildSpaceForGridItem( ...@@ -463,116 +409,193 @@ NGConstraintSpace NGGridLayoutAlgorithm::BuildSpaceForGridItem(
return builder.ToConstraintSpace(); return builder.ToConstraintSpace();
} }
void NGGridLayoutAlgorithm::SetSpecifiedTracks() { void NGGridLayoutAlgorithm::BuildBlockTrackCollections(
Vector<GridItemData>* grid_items,
NGGridBlockTrackCollection* column_track_collection,
NGGridBlockTrackCollection* row_track_collection) const {
DCHECK(grid_items);
DCHECK(column_track_collection);
DCHECK(row_track_collection);
// TODO(kschmi): Auto track repeat count should be based on the number
// of children, rather than specified auto-column/track. Temporarily
// assign them to zero here to avoid DCHECK's until we implement this
// logic.
wtf_size_t automatic_column_repetitions = 0;
wtf_size_t automatic_row_repetitions = 0;
SetSpecifiedTracks(GridTrackSizingDirection::kForColumns,
automatic_column_repetitions, column_track_collection);
SetSpecifiedTracks(GridTrackSizingDirection::kForRows,
automatic_row_repetitions, row_track_collection);
wtf_size_t explicit_column_start;
wtf_size_t explicit_row_start;
wtf_size_t column_count;
wtf_size_t row_count;
DetermineExplicitTrackStarts(
automatic_column_repetitions, automatic_row_repetitions,
&explicit_column_start, &explicit_row_start, &column_count, &row_count);
NGGridPlacement(automatic_row_repetitions, automatic_column_repetitions,
explicit_row_start, explicit_column_start,
Style().IsGridAutoFlowAlgorithmSparse()
? NGGridPlacement::PackingBehavior::kSparse
: NGGridPlacement::PackingBehavior::kDense,
AutoFlowDirection(), Style(),
AutoFlowDirection() == kForRows ? column_count : row_count,
row_track_collection, column_track_collection, grid_items)
.RunAutoPlacementAlgorithm();
column_track_collection->FinalizeRanges();
row_track_collection->FinalizeRanges();
}
void NGGridLayoutAlgorithm::BuildAlgorithmTrackCollections(
Vector<GridItemData>* grid_items,
NGGridLayoutAlgorithmTrackCollection* column_track_collection,
NGGridLayoutAlgorithmTrackCollection* row_track_collection) const {
DCHECK(grid_items);
DCHECK(column_track_collection);
DCHECK(row_track_collection);
DCHECK_NE(child_percentage_size_.inline_size, kIndefiniteSize);
// Build track collections.
NGGridBlockTrackCollection column_block_track_collection;
NGGridBlockTrackCollection row_block_track_collection;
BuildBlockTrackCollections(grid_items, &column_block_track_collection,
&row_block_track_collection);
// Build Algorithm track collections from the Block track collections.
*column_track_collection = NGGridLayoutAlgorithmTrackCollection(
column_block_track_collection,
/* is_content_box_size_indefinite */ false);
bool is_content_box_block_size_indefinite =
child_percentage_size_.block_size == kIndefiniteSize;
*row_track_collection = NGGridLayoutAlgorithmTrackCollection(
row_block_track_collection, is_content_box_block_size_indefinite);
}
void NGGridLayoutAlgorithm::SetSpecifiedTracks(
GridTrackSizingDirection track_direction,
wtf_size_t automatic_repetitions,
NGGridBlockTrackCollection* track_collection) const {
const ComputedStyle& grid_style = Style(); const ComputedStyle& grid_style = Style();
// TODO(kschmi): Auto track repeat count should be based on the number of const NGGridTrackList& template_track_list =
// children, rather than specified auto-column/track. Temporarily assign them track_direction == GridTrackSizingDirection::kForColumns
// to zero here to avoid DCHECK's until we implement this logic. ? grid_style.GridTemplateColumns().NGTrackList()
automatic_column_repetitions_ = 0; : grid_style.GridTemplateRows().NGTrackList();
automatic_row_repetitions_ = 0; const NGGridTrackList& auto_track_list =
track_direction == GridTrackSizingDirection::kForColumns
// TODO(janewman): We need to implement calculation for track auto repeat ? grid_style.GridAutoColumns().NGTrackList()
// count so this can be used outside of testing. : grid_style.GridAutoRows().NGTrackList();
block_column_track_collection_.SetSpecifiedTracks( track_collection->SetSpecifiedTracks(&template_track_list, &auto_track_list,
&grid_style.GridTemplateColumns().NGTrackList(), automatic_repetitions);
&grid_style.GridAutoColumns().NGTrackList(),
automatic_column_repetitions_);
block_row_track_collection_.SetSpecifiedTracks(
&grid_style.GridTemplateRows().NGTrackList(),
&grid_style.GridAutoRows().NGTrackList(), automatic_row_repetitions_);
} }
void NGGridLayoutAlgorithm::DetermineExplicitTrackStarts() { void NGGridLayoutAlgorithm::DetermineExplicitTrackStarts(
DCHECK_EQ(0u, explicit_column_start_); wtf_size_t automatic_column_repetitions,
DCHECK_EQ(0u, explicit_row_start_); wtf_size_t automatic_row_repetitions,
DCHECK_EQ(0u, column_count_); wtf_size_t* explicit_column_start,
DCHECK_EQ(0u, row_count_); wtf_size_t* explicit_row_start,
wtf_size_t* column_count,
wtf_size_t* row_count) const {
DCHECK(explicit_column_start);
DCHECK(explicit_row_start);
DCHECK(column_count);
DCHECK(row_count);
*explicit_column_start = 0u;
*explicit_row_start = 0u;
*column_count = 0u;
*row_count = 0u;
NGGridChildIterator iterator(Node()); NGGridChildIterator iterator(Node());
for (NGBlockNode child = iterator.NextChild(); child; for (NGBlockNode child = iterator.NextChild(); child;
child = iterator.NextChild()) { child = iterator.NextChild()) {
GridSpan column_span = GridPositionsResolver::ResolveGridPositionsFromStyle( GridSpan column_span = GridPositionsResolver::ResolveGridPositionsFromStyle(
Style(), child.Style(), kForColumns, Style(), child.Style(), kForColumns, automatic_column_repetitions);
AutoRepeatCountForDirection(kForColumns));
GridSpan row_span = GridPositionsResolver::ResolveGridPositionsFromStyle( GridSpan row_span = GridPositionsResolver::ResolveGridPositionsFromStyle(
Style(), child.Style(), kForRows, Style(), child.Style(), kForRows, automatic_row_repetitions);
AutoRepeatCountForDirection(kForRows));
if (!column_span.IsIndefinite()) { if (!column_span.IsIndefinite()) {
explicit_column_start_ = std::max<int>( *explicit_column_start = std::max<int>(
explicit_column_start_, -column_span.UntranslatedStartLine()); *explicit_column_start, -column_span.UntranslatedStartLine());
column_count_ = *column_count =
std::max<int>(column_count_, column_span.UntranslatedEndLine()); std::max<int>(*column_count, column_span.UntranslatedEndLine());
} else { } else {
column_count_ = std::max<int>( *column_count = std::max<int>(
column_count_, GridPositionsResolver::SpanSizeForAutoPlacedItem( *column_count, GridPositionsResolver::SpanSizeForAutoPlacedItem(
child.Style(), kForColumns)); child.Style(), kForColumns));
} }
if (!row_span.IsIndefinite()) { if (!row_span.IsIndefinite()) {
explicit_row_start_ = *explicit_row_start =
std::max<int>(explicit_row_start_, -row_span.UntranslatedStartLine()); std::max<int>(*explicit_row_start, -row_span.UntranslatedStartLine());
row_count_ = std::max<int>(row_count_, row_span.UntranslatedEndLine()); *row_count = std::max<int>(*row_count, row_span.UntranslatedEndLine());
} else { } else {
row_count_ = std::max<int>( *row_count = std::max<int>(
row_count_, GridPositionsResolver::SpanSizeForAutoPlacedItem( *row_count, GridPositionsResolver::SpanSizeForAutoPlacedItem(
child.Style(), kForRows)); child.Style(), kForRows));
} }
} }
} }
void NGGridLayoutAlgorithm::CacheItemSetIndices() { void NGGridLayoutAlgorithm::CacheItemSetIndices(
auto CacheItemSetIndices = [this](GridTrackSizingDirection track_direction) { GridTrackSizingDirection track_direction,
const auto& track_collection = TrackCollection(track_direction); const NGGridLayoutAlgorithmTrackCollection* track_collection,
for (GridItemData& item : grid_items_) { Vector<GridItemData>* grid_items) const {
wtf_size_t first_spanned_range = DCHECK(track_collection);
track_collection.RangeIndexFromTrackNumber( DCHECK(grid_items);
item.StartLine(track_direction)); for (GridItemData& item : *grid_items) {
wtf_size_t last_spanned_range = wtf_size_t first_spanned_range =
track_collection.RangeIndexFromTrackNumber( track_collection->RangeIndexFromTrackNumber(
item.EndLine(track_direction) - 1); item.StartLine(track_direction));
wtf_size_t last_spanned_range = track_collection->RangeIndexFromTrackNumber(
DCHECK_LE(first_spanned_range, last_spanned_range); item.EndLine(track_direction) - 1);
wtf_size_t begin_set_index =
track_collection.RangeStartingSetIndex(first_spanned_range); DCHECK_LE(first_spanned_range, last_spanned_range);
wtf_size_t end_set_index = wtf_size_t begin_set_index =
track_collection.RangeStartingSetIndex(last_spanned_range) + track_collection->RangeStartingSetIndex(first_spanned_range);
track_collection.RangeSetCount(last_spanned_range); wtf_size_t end_set_index =
track_collection->RangeStartingSetIndex(last_spanned_range) +
DCHECK_LE(begin_set_index, end_set_index); track_collection->RangeSetCount(last_spanned_range);
DCHECK_LE(end_set_index, track_collection.SetCount());
DCHECK_LE(begin_set_index, end_set_index);
if (track_direction == kForColumns) { DCHECK_LE(end_set_index, track_collection->SetCount());
item.columns_begin_set_index = begin_set_index;
item.columns_end_set_index = end_set_index; if (track_direction == kForColumns) {
} else { item.columns_begin_set_index = begin_set_index;
item.rows_begin_set_index = begin_set_index; item.columns_end_set_index = end_set_index;
item.rows_end_set_index = end_set_index; } else {
} item.rows_begin_set_index = begin_set_index;
item.rows_end_set_index = end_set_index;
} }
}; }
CacheItemSetIndices(kForColumns);
CacheItemSetIndices(kForRows);
} }
void NGGridLayoutAlgorithm::DetermineGridItemsSpanningIntrinsicOrFlexTracks( void NGGridLayoutAlgorithm::DetermineGridItemsSpanningIntrinsicOrFlexTracks(
GridTrackSizingDirection track_direction) { GridTrackSizingDirection track_direction,
auto CompareGridItemsByStartLine = Vector<GridItemData>* grid_items,
[this, track_direction](wtf_size_t index_a, wtf_size_t index_b) -> bool { Vector<wtf_size_t>* reordered_item_indices,
return grid_items_[index_a].StartLine(track_direction) < NGGridLayoutAlgorithmTrackCollection* track_collection) const {
grid_items_[index_b].StartLine(track_direction); DCHECK(grid_items);
DCHECK(track_collection);
DCHECK(reordered_item_indices);
auto CompareGridItemsByStartLine = [grid_items, track_direction](
wtf_size_t index_a,
wtf_size_t index_b) -> bool {
return grid_items->at(index_a).StartLine(track_direction) <
grid_items->at(index_b).StartLine(track_direction);
}; };
std::sort(reordered_item_indices_.begin(), reordered_item_indices_.end(), std::sort(reordered_item_indices->begin(), reordered_item_indices->end(),
CompareGridItemsByStartLine); CompareGridItemsByStartLine);
// At this point we have the grid items sorted by their start line in the // At this point we have the grid items sorted by their start line in the
// respective direction; this is important since we'll process both, the // respective direction; this is important since we'll process both, the
// ranges in the track collection and the grid items, incrementally. // ranges in the track collection and the grid items, incrementally.
const auto& track_collection = TrackCollection(track_direction); auto range_spanning_flex_track_iterator = track_collection->RangeIterator();
auto range_spanning_flex_track_iterator = track_collection.RangeIterator();
auto range_spanning_intrinsic_track_iterator = auto range_spanning_intrinsic_track_iterator =
track_collection.RangeIterator(); track_collection->RangeIterator();
for (GridItemData& grid_item : GetReorderedGridItems()) { for (GridItemData& grid_item :
ReorderedGridItems(*reordered_item_indices, *grid_items)) {
// We want to find the first range in the collection that: // We want to find the first range in the collection that:
// - Spans tracks located AFTER the start line of the current grid item; // - Spans tracks located AFTER the start line of the current grid item;
// this can be done by checking that the last track number of the current // this can be done by checking that the last track number of the current
...@@ -584,14 +607,14 @@ void NGGridLayoutAlgorithm::DetermineGridItemsSpanningIntrinsicOrFlexTracks( ...@@ -584,14 +607,14 @@ void NGGridLayoutAlgorithm::DetermineGridItemsSpanningIntrinsicOrFlexTracks(
while (!range_spanning_intrinsic_track_iterator.IsAtEnd() && while (!range_spanning_intrinsic_track_iterator.IsAtEnd() &&
(range_spanning_intrinsic_track_iterator.RangeTrackEnd() < (range_spanning_intrinsic_track_iterator.RangeTrackEnd() <
grid_item.StartLine(track_direction) || grid_item.StartLine(track_direction) ||
!track_collection.IsRangeSpanningIntrinsicTrack( !track_collection->IsRangeSpanningIntrinsicTrack(
range_spanning_intrinsic_track_iterator.RangeIndex()))) { range_spanning_intrinsic_track_iterator.RangeIndex()))) {
range_spanning_intrinsic_track_iterator.MoveToNextRange(); range_spanning_intrinsic_track_iterator.MoveToNextRange();
} }
while (!range_spanning_flex_track_iterator.IsAtEnd() && while (!range_spanning_flex_track_iterator.IsAtEnd() &&
(range_spanning_flex_track_iterator.RangeTrackEnd() < (range_spanning_flex_track_iterator.RangeTrackEnd() <
grid_item.StartLine(track_direction) || grid_item.StartLine(track_direction) ||
!track_collection.IsRangeSpanningFlexTrack( !track_collection->IsRangeSpanningFlexTrack(
range_spanning_flex_track_iterator.RangeIndex()))) { range_spanning_flex_track_iterator.RangeIndex()))) {
range_spanning_flex_track_iterator.MoveToNextRange(); range_spanning_flex_track_iterator.MoveToNextRange();
} }
...@@ -617,14 +640,17 @@ void NGGridLayoutAlgorithm::DetermineGridItemsSpanningIntrinsicOrFlexTracks( ...@@ -617,14 +640,17 @@ void NGGridLayoutAlgorithm::DetermineGridItemsSpanningIntrinsicOrFlexTracks(
// https://drafts.csswg.org/css-grid-1/#algo-track-sizing // https://drafts.csswg.org/css-grid-1/#algo-track-sizing
void NGGridLayoutAlgorithm::ComputeUsedTrackSizes( void NGGridLayoutAlgorithm::ComputeUsedTrackSizes(
GridTrackSizingDirection track_direction) { GridTrackSizingDirection track_direction,
auto& track_collection = TrackCollection(track_direction); Vector<GridItemData>* grid_items,
NGGridLayoutAlgorithmTrackCollection* track_collection) const {
DCHECK(grid_items);
DCHECK(track_collection);
LayoutUnit content_box_size = (track_direction == kForColumns) LayoutUnit content_box_size = (track_direction == kForColumns)
? child_percentage_size_.inline_size ? child_percentage_size_.inline_size
: child_percentage_size_.block_size; : child_percentage_size_.block_size;
// 1. Initialize track sizes (https://drafts.csswg.org/css-grid-1/#algo-init). // 1. Initialize track sizes (https://drafts.csswg.org/css-grid-1/#algo-init).
for (auto set_iterator = track_collection.GetSetIterator(); for (auto set_iterator = track_collection->GetSetIterator();
!set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) { !set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) {
NGGridSet& current_set = set_iterator.CurrentSet(); NGGridSet& current_set = set_iterator.CurrentSet();
const GridTrackSize& track_size = current_set.TrackSize(); const GridTrackSize& track_size = current_set.TrackSize();
...@@ -663,8 +689,15 @@ void NGGridLayoutAlgorithm::ComputeUsedTrackSizes( ...@@ -663,8 +689,15 @@ void NGGridLayoutAlgorithm::ComputeUsedTrackSizes(
} }
// 2. Resolve intrinsic track sizing functions to absolute lengths. // 2. Resolve intrinsic track sizing functions to absolute lengths.
DetermineGridItemsSpanningIntrinsicOrFlexTracks(track_direction); // Fill grid item indices vector in document order.
ResolveIntrinsicTrackSizes(track_direction); Vector<wtf_size_t> reordered_item_indices;
reordered_item_indices.ReserveInitialCapacity(grid_items->size());
for (wtf_size_t i = 0; i < grid_items->size(); ++i)
reordered_item_indices.push_back(i);
DetermineGridItemsSpanningIntrinsicOrFlexTracks(
track_direction, grid_items, &reordered_item_indices, track_collection);
ResolveIntrinsicTrackSizes(track_direction, grid_items,
&reordered_item_indices, track_collection);
} }
// Helpers for the track sizing algorithm. // Helpers for the track sizing algorithm.
...@@ -972,9 +1005,10 @@ void NGGridLayoutAlgorithm::IncreaseTrackSizesToAccommodateGridItems( ...@@ -972,9 +1005,10 @@ void NGGridLayoutAlgorithm::IncreaseTrackSizesToAccommodateGridItems(
GridTrackSizingDirection track_direction, GridTrackSizingDirection track_direction,
ReorderedGridItems::Iterator group_begin, ReorderedGridItems::Iterator group_begin,
ReorderedGridItems::Iterator group_end, ReorderedGridItems::Iterator group_end,
GridItemContributionType contribution_type) { GridItemContributionType contribution_type,
auto& track_collection = TrackCollection(track_direction); NGGridLayoutAlgorithmTrackCollection* track_collection) const {
for (auto set_iterator = track_collection.GetSetIterator(); DCHECK(track_collection);
for (auto set_iterator = track_collection->GetSetIterator();
!set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) { !set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) {
set_iterator.CurrentSet().SetPlannedIncrease(LayoutUnit()); set_iterator.CurrentSet().SetPlannedIncrease(LayoutUnit());
} }
...@@ -999,7 +1033,8 @@ void NGGridLayoutAlgorithm::IncreaseTrackSizesToAccommodateGridItems( ...@@ -999,7 +1033,8 @@ void NGGridLayoutAlgorithm::IncreaseTrackSizesToAccommodateGridItems(
// know our block size. // know our block size.
LayoutUnit spanned_tracks_size = LayoutUnit spanned_tracks_size =
GridGap(track_direction) * (grid_item->SpanSize(track_direction) - 1); GridGap(track_direction) * (grid_item->SpanSize(track_direction) - 1);
for (auto set_iterator = GetSetIteratorForItem(*grid_item, track_direction); for (auto set_iterator = GetSetIteratorForItem(*grid_item, track_direction,
*track_collection);
!set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) { !set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) {
NGGridSet& current_set = set_iterator.CurrentSet(); NGGridSet& current_set = set_iterator.CurrentSet();
...@@ -1029,7 +1064,7 @@ void NGGridLayoutAlgorithm::IncreaseTrackSizesToAccommodateGridItems( ...@@ -1029,7 +1064,7 @@ void NGGridLayoutAlgorithm::IncreaseTrackSizesToAccommodateGridItems(
: &sets_to_grow_beyond_limit); : &sets_to_grow_beyond_limit);
} }
for (auto set_iterator = track_collection.GetSetIterator(); for (auto set_iterator = track_collection->GetSetIterator();
!set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) { !set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) {
GrowAffectedSizeByPlannedIncrease(set_iterator.CurrentSet(), GrowAffectedSizeByPlannedIncrease(set_iterator.CurrentSet(),
contribution_type); contribution_type);
...@@ -1038,7 +1073,13 @@ void NGGridLayoutAlgorithm::IncreaseTrackSizesToAccommodateGridItems( ...@@ -1038,7 +1073,13 @@ void NGGridLayoutAlgorithm::IncreaseTrackSizesToAccommodateGridItems(
// https://drafts.csswg.org/css-grid-1/#algo-content // https://drafts.csswg.org/css-grid-1/#algo-content
void NGGridLayoutAlgorithm::ResolveIntrinsicTrackSizes( void NGGridLayoutAlgorithm::ResolveIntrinsicTrackSizes(
GridTrackSizingDirection track_direction) { GridTrackSizingDirection track_direction,
Vector<GridItemData>* grid_items,
Vector<wtf_size_t>* reordered_item_indices,
NGGridLayoutAlgorithmTrackCollection* track_collection) const {
DCHECK(grid_items);
DCHECK(reordered_item_indices);
DCHECK(track_collection);
// Reorder grid items to process them as follows: // Reorder grid items to process them as follows:
// - First, consider items spanning a single non-flexible track. // - First, consider items spanning a single non-flexible track.
// - Next, consider items with span size of 2 not spanning a flexible track. // - Next, consider items with span size of 2 not spanning a flexible track.
...@@ -1046,24 +1087,26 @@ void NGGridLayoutAlgorithm::ResolveIntrinsicTrackSizes( ...@@ -1046,24 +1087,26 @@ void NGGridLayoutAlgorithm::ResolveIntrinsicTrackSizes(
// not spanning a flexible track have been considered. // not spanning a flexible track have been considered.
// - Finally, consider all items spanning a flexible track. // - Finally, consider all items spanning a flexible track.
auto CompareGridItemsForIntrinsicTrackResolution = auto CompareGridItemsForIntrinsicTrackResolution =
[this, track_direction](wtf_size_t index_a, wtf_size_t index_b) -> bool { [grid_items, track_direction](wtf_size_t index_a,
if (grid_items_[index_a].is_spanning_flex_track || wtf_size_t index_b) -> bool {
grid_items_[index_b].is_spanning_flex_track) { if (grid_items->at(index_a).is_spanning_flex_track ||
grid_items->at(index_b).is_spanning_flex_track) {
// Ignore span sizes if one of the items spans a track with a flexible // Ignore span sizes if one of the items spans a track with a flexible
// sizing function; items not spanning such tracks should come first. // sizing function; items not spanning such tracks should come first.
return !grid_items_[index_a].is_spanning_flex_track; return !grid_items->at(index_a).is_spanning_flex_track;
} }
return grid_items_[index_a].SpanSize(track_direction) < return grid_items->at(index_a).SpanSize(track_direction) <
grid_items_[index_b].SpanSize(track_direction); grid_items->at(index_b).SpanSize(track_direction);
}; };
std::sort(reordered_item_indices_.begin(), reordered_item_indices_.end(), std::sort(reordered_item_indices->begin(), reordered_item_indices->end(),
CompareGridItemsForIntrinsicTrackResolution); CompareGridItemsForIntrinsicTrackResolution);
// First, process the items that don't span a flexible track. // First, process the items that don't span a flexible track.
ReorderedGridItems grid_items = GetReorderedGridItems(); ReorderedGridItems reordered_items =
ReorderedGridItems::Iterator current_group_begin = grid_items.begin(); ReorderedGridItems(*reordered_item_indices, *grid_items);
ReorderedGridItems::Iterator current_group_begin = reordered_items.begin();
while (current_group_begin != grid_items.end() && while (current_group_begin != reordered_items.end() &&
!current_group_begin->is_spanning_flex_track) { !current_group_begin->is_spanning_flex_track) {
// Each iteration considers all items with the same span size. // Each iteration considers all items with the same span size.
wtf_size_t current_group_span_size = wtf_size_t current_group_span_size =
...@@ -1072,14 +1115,14 @@ void NGGridLayoutAlgorithm::ResolveIntrinsicTrackSizes( ...@@ -1072,14 +1115,14 @@ void NGGridLayoutAlgorithm::ResolveIntrinsicTrackSizes(
do { do {
DCHECK(!current_group_end->is_spanning_flex_track); DCHECK(!current_group_end->is_spanning_flex_track);
++current_group_end; ++current_group_end;
} while (current_group_end != grid_items.end() && } while (current_group_end != reordered_items.end() &&
!current_group_end->is_spanning_flex_track && !current_group_end->is_spanning_flex_track &&
current_group_end->SpanSize(track_direction) == current_group_end->SpanSize(track_direction) ==
current_group_span_size); current_group_span_size);
IncreaseTrackSizesToAccommodateGridItems( IncreaseTrackSizesToAccommodateGridItems(
track_direction, current_group_begin, current_group_end, track_direction, current_group_begin, current_group_end,
GridItemContributionType::kForIntrinsicMinimums); GridItemContributionType::kForIntrinsicMinimums, track_collection);
// TODO(ethavar): Add remaining stages, mark infinitely growable sets... // TODO(ethavar): Add remaining stages, mark infinitely growable sets...
current_group_begin = current_group_end; current_group_begin = current_group_end;
...@@ -1090,34 +1133,28 @@ void NGGridLayoutAlgorithm::ResolveIntrinsicTrackSizes( ...@@ -1090,34 +1133,28 @@ void NGGridLayoutAlgorithm::ResolveIntrinsicTrackSizes(
// by span) all items that do span a track with a flexible sizing function. // by span) all items that do span a track with a flexible sizing function.
} }
void NGGridLayoutAlgorithm::SetAutomaticTrackRepetitionsForTesting(
wtf_size_t auto_column,
wtf_size_t auto_row) {
automatic_column_repetitions_ = auto_column;
automatic_row_repetitions_ = auto_row;
}
wtf_size_t NGGridLayoutAlgorithm::AutoRepeatCountForDirection(
GridTrackSizingDirection track_direction) const {
return (track_direction == kForColumns) ? automatic_column_repetitions_
: automatic_row_repetitions_;
}
GridTrackSizingDirection NGGridLayoutAlgorithm::AutoFlowDirection() const { GridTrackSizingDirection NGGridLayoutAlgorithm::AutoFlowDirection() const {
return Style().IsGridAutoFlowDirectionRow() ? kForRows : kForColumns; return Style().IsGridAutoFlowDirectionRow() ? kForRows : kForColumns;
} }
void NGGridLayoutAlgorithm::PlaceGridItems() { void NGGridLayoutAlgorithm::PlaceGridItems(
const Vector<GridItemData>& grid_items,
const Vector<GridItemData>& out_of_flow_items,
NGGridLayoutAlgorithmTrackCollection& column_track_collection,
NGGridLayoutAlgorithmTrackCollection& row_track_collection,
LayoutUnit* intrinsic_block_size) {
DCHECK(intrinsic_block_size);
LayoutUnit column_grid_gap = LayoutUnit column_grid_gap =
GridGap(kForColumns, ChildAvailableSize().inline_size); GridGap(kForColumns, ChildAvailableSize().inline_size);
LayoutUnit row_grid_gap = GridGap(kForRows, ChildAvailableSize().block_size); LayoutUnit row_grid_gap = GridGap(kForRows, ChildAvailableSize().block_size);
Vector<LayoutUnit> column_set_offsets = Vector<LayoutUnit> column_set_offsets =
ComputeSetOffsets(kForColumns, column_grid_gap); ComputeSetOffsets(kForColumns, column_grid_gap, column_track_collection);
Vector<LayoutUnit> row_set_offsets = Vector<LayoutUnit> row_set_offsets =
ComputeSetOffsets(kForRows, row_grid_gap); ComputeSetOffsets(kForRows, row_grid_gap, row_track_collection);
// Store the total size of row definitions as the intrinsic block size. // Intrinsic block size is based on the final row offset.
intrinsic_block_size_ = // Because gaps are included in row offsets, subtract out the final gap.
*intrinsic_block_size =
row_set_offsets.back() - row_set_offsets.back() -
(row_set_offsets.size() == 1 ? LayoutUnit() : row_grid_gap) + (row_set_offsets.size() == 1 ? LayoutUnit() : row_grid_gap) +
BorderScrollbarPadding().block_end; BorderScrollbarPadding().block_end;
...@@ -1126,11 +1163,12 @@ void NGGridLayoutAlgorithm::PlaceGridItems() { ...@@ -1126,11 +1163,12 @@ void NGGridLayoutAlgorithm::PlaceGridItems() {
// intrinsic size is known. However, the gap should not be added to the // intrinsic size is known. However, the gap should not be added to the
// intrinsic block size. // intrinsic block size.
if (IsRowGridGapUnresolvable(ChildAvailableSize().block_size)) { if (IsRowGridGapUnresolvable(ChildAvailableSize().block_size)) {
row_grid_gap = GridGap(kForRows, intrinsic_block_size_); row_grid_gap = GridGap(kForRows, *intrinsic_block_size);
row_set_offsets = ComputeSetOffsets(kForRows, row_grid_gap); row_set_offsets =
ComputeSetOffsets(kForRows, row_grid_gap, row_track_collection);
} }
for (GridItemData& grid_item : grid_items_) { for (const GridItemData& grid_item : grid_items) {
wtf_size_t column_start_index = grid_item.columns_begin_set_index; wtf_size_t column_start_index = grid_item.columns_begin_set_index;
wtf_size_t column_end_index = grid_item.columns_end_set_index; wtf_size_t column_end_index = grid_item.columns_end_set_index;
wtf_size_t row_start_index = grid_item.rows_begin_set_index; wtf_size_t row_start_index = grid_item.rows_begin_set_index;
...@@ -1158,7 +1196,7 @@ void NGGridLayoutAlgorithm::PlaceGridItems() { ...@@ -1158,7 +1196,7 @@ void NGGridLayoutAlgorithm::PlaceGridItems() {
PlaceGridItem(grid_item, offset, size); PlaceGridItem(grid_item, offset, size);
} }
for (GridItemData& out_of_flow_item : out_of_flow_items_) { for (const GridItemData& out_of_flow_item : out_of_flow_items) {
// TODO(ansollan): Look up offsets based on specified row/column for // TODO(ansollan): Look up offsets based on specified row/column for
// absolutely-positioned items, as described in // absolutely-positioned items, as described in
// https://drafts.csswg.org/css-grid-1/#abspos, and pass the correct static // https://drafts.csswg.org/css-grid-1/#abspos, and pass the correct static
...@@ -1229,7 +1267,7 @@ void NGGridLayoutAlgorithm::PlaceGridItem(const GridItemData& grid_item, ...@@ -1229,7 +1267,7 @@ void NGGridLayoutAlgorithm::PlaceGridItem(const GridItemData& grid_item,
LayoutUnit NGGridLayoutAlgorithm::GridGap( LayoutUnit NGGridLayoutAlgorithm::GridGap(
GridTrackSizingDirection track_direction, GridTrackSizingDirection track_direction,
LayoutUnit available_size) { LayoutUnit available_size) const {
const base::Optional<Length>& gap = const base::Optional<Length>& gap =
track_direction == kForColumns ? Style().ColumnGap() : Style().RowGap(); track_direction == kForColumns ? Style().ColumnGap() : Style().RowGap();
...@@ -1242,14 +1280,12 @@ LayoutUnit NGGridLayoutAlgorithm::GridGap( ...@@ -1242,14 +1280,12 @@ LayoutUnit NGGridLayoutAlgorithm::GridGap(
Vector<LayoutUnit> NGGridLayoutAlgorithm::ComputeSetOffsets( Vector<LayoutUnit> NGGridLayoutAlgorithm::ComputeSetOffsets(
GridTrackSizingDirection track_direction, GridTrackSizingDirection track_direction,
LayoutUnit grid_gap) { LayoutUnit grid_gap,
NGGridLayoutAlgorithmTrackCollection& track_collection) const {
LayoutUnit set_offset = track_direction == kForColumns LayoutUnit set_offset = track_direction == kForColumns
? BorderScrollbarPadding().inline_start ? BorderScrollbarPadding().inline_start
: BorderScrollbarPadding().block_start; : BorderScrollbarPadding().block_start;
Vector<LayoutUnit> set_offsets = {set_offset}; Vector<LayoutUnit> set_offsets = {set_offset};
auto& track_collection = (track_direction == kForColumns)
? algorithm_column_track_collection_
: algorithm_row_track_collection_;
set_offsets.ReserveCapacity(track_collection.SetCount() + 1); set_offsets.ReserveCapacity(track_collection.SetCount() + 1);
for (auto set_iterator = track_collection.GetSetIterator(); for (auto set_iterator = track_collection.GetSetIterator();
!set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) { !set_iterator.IsAtEnd(); set_iterator.MoveToNextSet()) {
...@@ -1261,7 +1297,7 @@ Vector<LayoutUnit> NGGridLayoutAlgorithm::ComputeSetOffsets( ...@@ -1261,7 +1297,7 @@ Vector<LayoutUnit> NGGridLayoutAlgorithm::ComputeSetOffsets(
} }
bool NGGridLayoutAlgorithm::IsRowGridGapUnresolvable( bool NGGridLayoutAlgorithm::IsRowGridGapUnresolvable(
LayoutUnit available_size) { LayoutUnit available_size) const {
const base::Optional<Length>& row_gap = Style().RowGap(); const base::Optional<Length>& row_gap = Style().RowGap();
return row_gap && row_gap->IsPercentOrCalc() && return row_gap && row_gap->IsPercentOrCalc() &&
available_size == kIndefiniteSize; available_size == kIndefiniteSize;
......
...@@ -76,9 +76,6 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -76,9 +76,6 @@ class CORE_EXPORT NGGridLayoutAlgorithm
MinMaxSizesResult ComputeMinMaxSizes(const MinMaxSizesInput&) const override; MinMaxSizesResult ComputeMinMaxSizes(const MinMaxSizesInput&) const override;
const NGGridLayoutAlgorithmTrackCollection& ColumnTrackCollection() const;
const NGGridLayoutAlgorithmTrackCollection& RowTrackCollection() const;
private: private:
using NGGridSetVector = Vector<NGGridSet*, 16>; using NGGridSetVector = Vector<NGGridSet*, 16>;
...@@ -120,15 +117,13 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -120,15 +117,13 @@ class CORE_EXPORT NGGridLayoutAlgorithm
Vector<GridItemData>& grid_items_; Vector<GridItemData>& grid_items_;
}; };
ReorderedGridItems GetReorderedGridItems();
NGGridLayoutAlgorithmTrackCollection& TrackCollection(
GridTrackSizingDirection track_direction);
// Returns an iterator for every |NGGridSet| contained within an item's span // Returns an iterator for every |NGGridSet| contained within an item's span
// in the relevant track collection. // in the relevant track collection.
NGGridLayoutAlgorithmTrackCollection::SetIterator GetSetIteratorForItem( static NGGridLayoutAlgorithmTrackCollection::SetIterator
const GridItemData& item, GetSetIteratorForItem(const GridItemData& item,
GridTrackSizingDirection track_direction); GridTrackSizingDirection track_direction,
NGGridLayoutAlgorithmTrackCollection& track_collection);
// Returns the size that a grid item will distribute across the tracks with an // Returns the size that a grid item will distribute across the tracks with an
// intrinsic sizing function it spans in the relevant track direction. // intrinsic sizing function it spans in the relevant track direction.
...@@ -137,48 +132,82 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -137,48 +132,82 @@ class CORE_EXPORT NGGridLayoutAlgorithm
GridTrackSizingDirection track_direction, GridTrackSizingDirection track_direction,
GridItemContributionType contribution_type) const; GridItemContributionType contribution_type) const;
void ConstructAndAppendGridItems(); void ConstructAndAppendGridItems(
GridItemData MeasureGridItem(const NGBlockNode node); Vector<GridItemData>* grid_items,
Vector<GridItemData>* out_of_flow_items) const;
GridItemData MeasureGridItem(const NGBlockNode node) const;
NGConstraintSpace BuildSpaceForGridItem(const NGBlockNode node) const; NGConstraintSpace BuildSpaceForGridItem(const NGBlockNode node) const;
// Sets the specified tracks for row and column track lists. void BuildBlockTrackCollections(
void SetSpecifiedTracks(); Vector<GridItemData>* grid_items,
NGGridBlockTrackCollection* column_track_collection,
NGGridBlockTrackCollection* row_track_collection) const;
void BuildAlgorithmTrackCollections(
Vector<GridItemData>* grid_items,
NGGridLayoutAlgorithmTrackCollection* column_track_collection,
NGGridLayoutAlgorithmTrackCollection* row_track_collection) const;
// Sets specified track lists on |track_collection|.
void SetSpecifiedTracks(GridTrackSizingDirection track_direction,
wtf_size_t automatic_repetitions,
NGGridBlockTrackCollection* track_collection) const;
// Determines the explicit column and row track starts. // Determines the explicit column and row track starts.
void DetermineExplicitTrackStarts(); void DetermineExplicitTrackStarts(wtf_size_t automatic_column_repetitions,
wtf_size_t automatic_row_repetitions,
wtf_size_t* explicit_column_start,
wtf_size_t* explicit_row_start,
wtf_size_t* column_count,
wtf_size_t* row_count) const;
// For every item and track direction, computes and stores the pair of indices // For every item and track direction, computes and stores the pair of indices
// "begin" and "end" such that the item spans every set from the respective // "begin" and "end" such that the item spans every set from the respective
// collection's |sets_| with an index in the range [begin, end). // collection's |sets_| with an index in the range [begin, end).
void CacheItemSetIndices(); void CacheItemSetIndices(
GridTrackSizingDirection track_direction,
const NGGridLayoutAlgorithmTrackCollection* track_collection,
Vector<GridItemData>* grid_items) const;
// For every grid item, determines if it spans a track with an intrinsic or // For every grid item, determines if it spans a track with an intrinsic or
// flexible sizing function and caches the answer in its |GridItemData|. // flexible sizing function and caches the answer in its |GridItemData|.
void DetermineGridItemsSpanningIntrinsicOrFlexTracks( void DetermineGridItemsSpanningIntrinsicOrFlexTracks(
GridTrackSizingDirection track_direction); GridTrackSizingDirection track_direction,
Vector<GridItemData>* grid_items,
Vector<wtf_size_t>* reordered_item_indices,
NGGridLayoutAlgorithmTrackCollection* track_collection) const;
// Calculates from the min and max track sizing functions the used track size. // Calculates from the min and max track sizing functions the used track size.
void ComputeUsedTrackSizes(GridTrackSizingDirection track_direction); void ComputeUsedTrackSizes(
GridTrackSizingDirection track_direction,
Vector<GridItemData>* grid_items,
NGGridLayoutAlgorithmTrackCollection* track_collection) const;
// These methods implement the steps of the algorithm for intrinsic track size // These methods implement the steps of the algorithm for intrinsic track size
// resolution defined in https://drafts.csswg.org/css-grid-1/#algo-content. // resolution defined in https://drafts.csswg.org/css-grid-1/#algo-content.
void ResolveIntrinsicTrackSizes(GridTrackSizingDirection track_direction); void ResolveIntrinsicTrackSizes(
GridTrackSizingDirection track_direction,
Vector<GridItemData>* grid_items,
Vector<wtf_size_t>* reordered_item_indices,
NGGridLayoutAlgorithmTrackCollection* track_collection) const;
void IncreaseTrackSizesToAccommodateGridItems( void IncreaseTrackSizesToAccommodateGridItems(
GridTrackSizingDirection track_direction, GridTrackSizingDirection track_direction,
ReorderedGridItems::Iterator group_begin, ReorderedGridItems::Iterator group_begin,
ReorderedGridItems::Iterator group_end, ReorderedGridItems::Iterator group_end,
GridItemContributionType contribution_type); GridItemContributionType contribution_type,
void DistributeExtraSpaceToSets(LayoutUnit extra_space, NGGridLayoutAlgorithmTrackCollection* track_collection) const;
GridItemContributionType contribution_type,
NGGridSetVector* sets_to_grow, static void DistributeExtraSpaceToSets(
NGGridSetVector* sets_to_grow_beyond_limit); LayoutUnit extra_space,
GridItemContributionType contribution_type,
// Allows a test to set the value for automatic track repetition. NGGridSetVector* sets_to_grow,
void SetAutomaticTrackRepetitionsForTesting(wtf_size_t auto_column, NGGridSetVector* sets_to_grow_beyond_limit);
wtf_size_t auto_row);
wtf_size_t AutoRepeatCountForDirection(
GridTrackSizingDirection track_direction) const;
// Lays out and computes inline and block offsets for grid items. // Lays out and computes inline and block offsets for grid items.
void PlaceGridItems(); void PlaceGridItems(
const Vector<GridItemData>& grid_items,
const Vector<GridItemData>& out_of_flow_items,
NGGridLayoutAlgorithmTrackCollection& column_track_collection,
NGGridLayoutAlgorithmTrackCollection& row_track_collection,
LayoutUnit* intrinsic_block_size);
// Lays out |grid_item| based on the offsets and sizes provided. // Lays out |grid_item| based on the offsets and sizes provided.
void PlaceGridItem(const GridItemData& grid_item, void PlaceGridItem(const GridItemData& grid_item,
...@@ -187,42 +216,22 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -187,42 +216,22 @@ class CORE_EXPORT NGGridLayoutAlgorithm
// Gets the row or column gap of the grid. // Gets the row or column gap of the grid.
LayoutUnit GridGap(GridTrackSizingDirection track_direction, LayoutUnit GridGap(GridTrackSizingDirection track_direction,
LayoutUnit available_size = kIndefiniteSize); LayoutUnit available_size = kIndefiniteSize) const;
// Calculates inline and block offsets for all tracks. // Calculates inline and block offsets for all tracks.
Vector<LayoutUnit> ComputeSetOffsets(GridTrackSizingDirection track_direction, Vector<LayoutUnit> ComputeSetOffsets(
LayoutUnit grid_gap); GridTrackSizingDirection track_direction,
LayoutUnit grid_gap,
NGGridLayoutAlgorithmTrackCollection& track_collection) const;
// Tests whether the row gap is unresolvable based on its type and the // Tests whether the row gap is unresolvable based on its type and the
// available size. // available size.
bool IsRowGridGapUnresolvable(LayoutUnit available_size); bool IsRowGridGapUnresolvable(LayoutUnit available_size) const;
GridTrackSizingDirection AutoFlowDirection() const; GridTrackSizingDirection AutoFlowDirection() const;
GridLayoutAlgorithmState state_;
LogicalSize border_box_size_; LogicalSize border_box_size_;
LogicalSize child_percentage_size_; LogicalSize child_percentage_size_;
LayoutUnit intrinsic_block_size_;
Vector<GridItemData> grid_items_;
Vector<GridItemData> out_of_flow_items_;
Vector<wtf_size_t> reordered_item_indices_;
NGGridBlockTrackCollection block_column_track_collection_;
NGGridBlockTrackCollection block_row_track_collection_;
NGGridLayoutAlgorithmTrackCollection algorithm_column_track_collection_;
NGGridLayoutAlgorithmTrackCollection algorithm_row_track_collection_;
wtf_size_t explicit_column_start_ = 0;
wtf_size_t explicit_row_start_ = 0;
wtf_size_t column_count_ = 0;
wtf_size_t row_count_ = 0;
wtf_size_t automatic_column_repetitions_ =
NGGridBlockTrackCollection::kInvalidRangeIndex;
wtf_size_t automatic_row_repetitions_ =
NGGridBlockTrackCollection::kInvalidRangeIndex;
}; };
} // namespace blink } // namespace blink
......
...@@ -41,16 +41,49 @@ class NGGridLayoutAlgorithmTest ...@@ -41,16 +41,49 @@ class NGGridLayoutAlgorithmTest
style_ = ComputedStyle::Create(); style_ = ComputedStyle::Create();
} }
void BuildGridItemsAndTrackCollections(NGGridLayoutAlgorithm& algorithm) {
// Measure Items
algorithm.ConstructAndAppendGridItems(&grid_items_, &out_of_flow_items_);
algorithm.BuildAlgorithmTrackCollections(
&grid_items_, &algorithm_column_track_collection_,
&algorithm_row_track_collection_);
// Cache set indices.
algorithm.CacheItemSetIndices(GridTrackSizingDirection::kForColumns,
&algorithm_column_track_collection_,
&grid_items_);
algorithm.CacheItemSetIndices(GridTrackSizingDirection::kForRows,
&algorithm_row_track_collection_,
&grid_items_);
// Resolve inline size.
algorithm.ComputeUsedTrackSizes(GridTrackSizingDirection::kForColumns,
&grid_items_,
&algorithm_column_track_collection_);
// Resolve block size.
algorithm.ComputeUsedTrackSizes(GridTrackSizingDirection::kForRows,
&grid_items_,
&algorithm_row_track_collection_);
}
NGGridLayoutAlgorithmTrackCollection& TrackCollection(
GridTrackSizingDirection track_direction) {
return (track_direction == kForColumns) ? algorithm_column_track_collection_
: algorithm_row_track_collection_;
}
// Helper methods to access private data on NGGridLayoutAlgorithm. This class // Helper methods to access private data on NGGridLayoutAlgorithm. This class
// is a friend of NGGridLayoutAlgorithm but the individual tests are not. // is a friend of NGGridLayoutAlgorithm but the individual tests are not.
wtf_size_t GridItemCount(const NGGridLayoutAlgorithm& algorithm) { wtf_size_t GridItemCount(const NGGridLayoutAlgorithm& algorithm) {
return algorithm.grid_items_.size(); return grid_items_.size();
} }
Vector<LayoutUnit> GridItemInlineSizes( Vector<LayoutUnit> GridItemInlineSizes(
const NGGridLayoutAlgorithm& algorithm) { const NGGridLayoutAlgorithm& algorithm) {
Vector<LayoutUnit> results; Vector<LayoutUnit> results;
for (const auto& item : algorithm.grid_items_) { for (const auto& item : grid_items_) {
results.push_back(item.inline_size); results.push_back(item.inline_size);
} }
return results; return results;
...@@ -59,7 +92,7 @@ class NGGridLayoutAlgorithmTest ...@@ -59,7 +92,7 @@ class NGGridLayoutAlgorithmTest
Vector<LayoutUnit> GridItemInlineMarginSum( Vector<LayoutUnit> GridItemInlineMarginSum(
const NGGridLayoutAlgorithm& algorithm) { const NGGridLayoutAlgorithm& algorithm) {
Vector<LayoutUnit> results; Vector<LayoutUnit> results;
for (const auto& item : algorithm.grid_items_) { for (const auto& item : grid_items_) {
results.push_back(item.margins.InlineSum()); results.push_back(item.margins.InlineSum());
} }
return results; return results;
...@@ -68,7 +101,7 @@ class NGGridLayoutAlgorithmTest ...@@ -68,7 +101,7 @@ class NGGridLayoutAlgorithmTest
Vector<MinMaxSizes> GridItemMinMaxSizes( Vector<MinMaxSizes> GridItemMinMaxSizes(
const NGGridLayoutAlgorithm& algorithm) { const NGGridLayoutAlgorithm& algorithm) {
Vector<MinMaxSizes> results; Vector<MinMaxSizes> results;
for (const auto& item : algorithm.grid_items_) { for (const auto& item : grid_items_) {
results.push_back(item.min_max_sizes); results.push_back(item.min_max_sizes);
} }
return results; return results;
...@@ -76,7 +109,7 @@ class NGGridLayoutAlgorithmTest ...@@ -76,7 +109,7 @@ class NGGridLayoutAlgorithmTest
Vector<GridArea> GridItemGridAreas(const NGGridLayoutAlgorithm& algorithm) { Vector<GridArea> GridItemGridAreas(const NGGridLayoutAlgorithm& algorithm) {
Vector<GridArea> results; Vector<GridArea> results;
for (const auto& item : algorithm.grid_items_) { for (const auto& item : grid_items_) {
results.push_back(item.resolved_position); results.push_back(item.resolved_position);
} }
return results; return results;
...@@ -85,14 +118,20 @@ class NGGridLayoutAlgorithmTest ...@@ -85,14 +118,20 @@ class NGGridLayoutAlgorithmTest
void DetermineGridItemsSpanningIntrinsicOrFlexTracks( void DetermineGridItemsSpanningIntrinsicOrFlexTracks(
NGGridLayoutAlgorithm& algorithm, NGGridLayoutAlgorithm& algorithm,
GridTrackSizingDirection track_direction) { GridTrackSizingDirection track_direction) {
algorithm.DetermineGridItemsSpanningIntrinsicOrFlexTracks(track_direction); Vector<wtf_size_t> reordered_item_indices;
reordered_item_indices.ReserveInitialCapacity(grid_items_.size());
for (wtf_size_t i = 0; i < grid_items_.size(); ++i)
reordered_item_indices.push_back(i);
algorithm.DetermineGridItemsSpanningIntrinsicOrFlexTracks(
track_direction, &grid_items_, &reordered_item_indices,
&TrackCollection(track_direction));
} }
Vector<wtf_size_t> GridItemsSpanningIntrinsicTrack( Vector<wtf_size_t> GridItemsSpanningIntrinsicTrack(
const NGGridLayoutAlgorithm& algorithm) { const NGGridLayoutAlgorithm& algorithm) {
Vector<wtf_size_t> results; Vector<wtf_size_t> results;
for (wtf_size_t i = 0; i < algorithm.grid_items_.size(); ++i) { for (wtf_size_t i = 0; i < grid_items_.size(); ++i) {
if (algorithm.grid_items_[i].is_spanning_intrinsic_track) if (grid_items_[i].is_spanning_intrinsic_track)
results.push_back(i); results.push_back(i);
} }
return results; return results;
...@@ -101,25 +140,17 @@ class NGGridLayoutAlgorithmTest ...@@ -101,25 +140,17 @@ class NGGridLayoutAlgorithmTest
Vector<wtf_size_t> GridItemsSpanningFlexTrack( Vector<wtf_size_t> GridItemsSpanningFlexTrack(
const NGGridLayoutAlgorithm& algorithm) { const NGGridLayoutAlgorithm& algorithm) {
Vector<wtf_size_t> results; Vector<wtf_size_t> results;
for (wtf_size_t i = 0; i < algorithm.grid_items_.size(); ++i) { for (wtf_size_t i = 0; i < grid_items_.size(); ++i) {
if (algorithm.grid_items_[i].is_spanning_flex_track) if (grid_items_[i].is_spanning_flex_track)
results.push_back(i); results.push_back(i);
} }
return results; return results;
} }
void SetAutoTrackRepeat(NGGridLayoutAlgorithm& algorithm,
wtf_size_t auto_column,
wtf_size_t auto_row) {
algorithm.SetAutomaticTrackRepetitionsForTesting(auto_column, auto_row);
}
Vector<LayoutUnit> BaseSizes(NGGridLayoutAlgorithm& algorithm, Vector<LayoutUnit> BaseSizes(NGGridLayoutAlgorithm& algorithm,
GridTrackSizingDirection track_direction) { GridTrackSizingDirection track_direction) {
NGGridLayoutAlgorithmTrackCollection& collection = NGGridLayoutAlgorithmTrackCollection& collection =
(track_direction == kForColumns) TrackCollection(track_direction);
? algorithm.algorithm_column_track_collection_
: algorithm.algorithm_row_track_collection_;
Vector<LayoutUnit> base_sizes; Vector<LayoutUnit> base_sizes;
for (auto set_iterator = collection.GetSetIterator(); for (auto set_iterator = collection.GetSetIterator();
...@@ -132,9 +163,7 @@ class NGGridLayoutAlgorithmTest ...@@ -132,9 +163,7 @@ class NGGridLayoutAlgorithmTest
Vector<LayoutUnit> GrowthLimits(NGGridLayoutAlgorithm& algorithm, Vector<LayoutUnit> GrowthLimits(NGGridLayoutAlgorithm& algorithm,
GridTrackSizingDirection track_direction) { GridTrackSizingDirection track_direction) {
NGGridLayoutAlgorithmTrackCollection& collection = NGGridLayoutAlgorithmTrackCollection& collection =
(track_direction == kForColumns) TrackCollection(track_direction);
? algorithm.algorithm_column_track_collection_
: algorithm.algorithm_row_track_collection_;
Vector<LayoutUnit> growth_limits; Vector<LayoutUnit> growth_limits;
for (auto set_iterator = collection.GetSetIterator(); for (auto set_iterator = collection.GetSetIterator();
...@@ -166,6 +195,11 @@ class NGGridLayoutAlgorithmTest ...@@ -166,6 +195,11 @@ class NGGridLayoutAlgorithmTest
return fragment->DumpFragmentTree(flags); return fragment->DumpFragmentTree(flags);
} }
Vector<NGGridLayoutAlgorithm::GridItemData> grid_items_;
Vector<NGGridLayoutAlgorithm::GridItemData> out_of_flow_items_;
NGGridLayoutAlgorithmTrackCollection algorithm_column_track_collection_;
NGGridLayoutAlgorithmTrackCollection algorithm_row_track_collection_;
scoped_refptr<ComputedStyle> style_; scoped_refptr<ComputedStyle> style_;
}; };
...@@ -310,7 +344,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmMeasuring) { ...@@ -310,7 +344,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmMeasuring) {
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
algorithm.Layout(); BuildGridItemsAndTrackCollections(algorithm);
EXPECT_EQ(GridItemCount(algorithm), 9U); EXPECT_EQ(GridItemCount(algorithm), 9U);
Vector<LayoutUnit> actual_inline_sizes = GridItemInlineSizes(algorithm); Vector<LayoutUnit> actual_inline_sizes = GridItemInlineSizes(algorithm);
...@@ -387,18 +421,18 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRanges) { ...@@ -387,18 +421,18 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRanges) {
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
algorithm.Layout(); BuildGridItemsAndTrackCollections(algorithm);
EXPECT_EQ(GridItemCount(algorithm), 4U); EXPECT_EQ(GridItemCount(algorithm), 4U);
NGGridTrackCollectionBase::RangeRepeatIterator row_iterator( NGGridTrackCollectionBase::RangeRepeatIterator row_iterator(
&algorithm.RowTrackCollection(), 0u); &TrackCollection(kForRows), 0u);
EXPECT_RANGE(0u, 1u, row_iterator); EXPECT_RANGE(0u, 1u, row_iterator);
EXPECT_TRUE(row_iterator.MoveToNextRange()); EXPECT_TRUE(row_iterator.MoveToNextRange());
EXPECT_RANGE(1u, 999u, row_iterator); EXPECT_RANGE(1u, 999u, row_iterator);
EXPECT_FALSE(row_iterator.MoveToNextRange()); EXPECT_FALSE(row_iterator.MoveToNextRange());
NGGridTrackCollectionBase::RangeRepeatIterator column_iterator( NGGridTrackCollectionBase::RangeRepeatIterator column_iterator(
&algorithm.ColumnTrackCollection(), 0u); &TrackCollection(kForColumns), 0u);
EXPECT_RANGE(0u, 1u, column_iterator); EXPECT_RANGE(0u, 1u, column_iterator);
EXPECT_TRUE(column_iterator.MoveToNextRange()); EXPECT_TRUE(column_iterator.MoveToNextRange());
EXPECT_RANGE(1u, 1u, column_iterator); EXPECT_RANGE(1u, 1u, column_iterator);
...@@ -444,12 +478,11 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesWithAutoRepeater) { ...@@ -444,12 +478,11 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesWithAutoRepeater) {
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
SetAutoTrackRepeat(algorithm, 3, 3); BuildGridItemsAndTrackCollections(algorithm);
algorithm.Layout();
EXPECT_EQ(GridItemCount(algorithm), 4U); EXPECT_EQ(GridItemCount(algorithm), 4U);
NGGridTrackCollectionBase::RangeRepeatIterator row_iterator( NGGridTrackCollectionBase::RangeRepeatIterator row_iterator(
&algorithm.RowTrackCollection(), 0u); &TrackCollection(kForRows), 0u);
EXPECT_RANGE(0u, 1u, row_iterator); EXPECT_RANGE(0u, 1u, row_iterator);
EXPECT_TRUE(row_iterator.MoveToNextRange()); EXPECT_TRUE(row_iterator.MoveToNextRange());
EXPECT_RANGE(1u, 19u, row_iterator); EXPECT_RANGE(1u, 19u, row_iterator);
...@@ -461,7 +494,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesWithAutoRepeater) { ...@@ -461,7 +494,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesWithAutoRepeater) {
EXPECT_FALSE(row_iterator.MoveToNextRange()); EXPECT_FALSE(row_iterator.MoveToNextRange());
NGGridTrackCollectionBase::RangeRepeatIterator column_iterator( NGGridTrackCollectionBase::RangeRepeatIterator column_iterator(
&algorithm.ColumnTrackCollection(), 0u); &TrackCollection(kForColumns), 0u);
EXPECT_RANGE(0u, 1u, column_iterator); EXPECT_RANGE(0u, 1u, column_iterator);
EXPECT_TRUE(column_iterator.MoveToNextRange()); EXPECT_TRUE(column_iterator.MoveToNextRange());
...@@ -531,11 +564,11 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicit) { ...@@ -531,11 +564,11 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicit) {
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
algorithm.Layout(); BuildGridItemsAndTrackCollections(algorithm);
EXPECT_EQ(GridItemCount(algorithm), 4U); EXPECT_EQ(GridItemCount(algorithm), 4U);
NGGridTrackCollectionBase::RangeRepeatIterator column_iterator( NGGridTrackCollectionBase::RangeRepeatIterator column_iterator(
&algorithm.ColumnTrackCollection(), 0u); &TrackCollection(kForColumns), 0u);
EXPECT_RANGE(0u, 1u, column_iterator); EXPECT_RANGE(0u, 1u, column_iterator);
EXPECT_TRUE(column_iterator.MoveToNextRange()); EXPECT_TRUE(column_iterator.MoveToNextRange());
...@@ -546,7 +579,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicit) { ...@@ -546,7 +579,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicit) {
EXPECT_FALSE(column_iterator.MoveToNextRange()); EXPECT_FALSE(column_iterator.MoveToNextRange());
NGGridTrackCollectionBase::RangeRepeatIterator row_iterator( NGGridTrackCollectionBase::RangeRepeatIterator row_iterator(
&algorithm.RowTrackCollection(), 0u); &TrackCollection(kForRows), 0u);
EXPECT_RANGE(0u, 1u, row_iterator); EXPECT_RANGE(0u, 1u, row_iterator);
EXPECT_TRUE(row_iterator.MoveToNextRange()); EXPECT_TRUE(row_iterator.MoveToNextRange());
...@@ -602,12 +635,11 @@ TEST_F(NGGridLayoutAlgorithmTest, ...@@ -602,12 +635,11 @@ TEST_F(NGGridLayoutAlgorithmTest,
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
SetAutoTrackRepeat(algorithm, 0, 0); BuildGridItemsAndTrackCollections(algorithm);
algorithm.Layout();
EXPECT_EQ(GridItemCount(algorithm), 4U); EXPECT_EQ(GridItemCount(algorithm), 4U);
NGGridTrackCollectionBase::RangeRepeatIterator column_iterator( NGGridTrackCollectionBase::RangeRepeatIterator column_iterator(
&algorithm.ColumnTrackCollection(), 0u); &TrackCollection(kForColumns), 0u);
EXPECT_RANGE(0u, 1u, column_iterator); EXPECT_RANGE(0u, 1u, column_iterator);
EXPECT_TRUE(column_iterator.MoveToNextRange()); EXPECT_TRUE(column_iterator.MoveToNextRange());
...@@ -615,7 +647,7 @@ TEST_F(NGGridLayoutAlgorithmTest, ...@@ -615,7 +647,7 @@ TEST_F(NGGridLayoutAlgorithmTest,
EXPECT_FALSE(column_iterator.MoveToNextRange()); EXPECT_FALSE(column_iterator.MoveToNextRange());
NGGridTrackCollectionBase::RangeRepeatIterator row_iterator( NGGridTrackCollectionBase::RangeRepeatIterator row_iterator(
&algorithm.RowTrackCollection(), 0u); &TrackCollection(kForRows), 0u);
EXPECT_RANGE(0u, 1u, row_iterator); EXPECT_RANGE(0u, 1u, row_iterator);
EXPECT_TRUE(row_iterator.MoveToNextRange()); EXPECT_TRUE(row_iterator.MoveToNextRange());
...@@ -670,12 +702,11 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicitAutoRows) { ...@@ -670,12 +702,11 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicitAutoRows) {
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
SetAutoTrackRepeat(algorithm, 0, 0); BuildGridItemsAndTrackCollections(algorithm);
algorithm.Layout();
EXPECT_EQ(GridItemCount(algorithm), 4U); EXPECT_EQ(GridItemCount(algorithm), 4U);
NGGridTrackCollectionBase::RangeRepeatIterator column_iterator( NGGridTrackCollectionBase::RangeRepeatIterator column_iterator(
&algorithm.ColumnTrackCollection(), 0u); &TrackCollection(kForColumns), 0u);
EXPECT_RANGE(0u, 1u, column_iterator); EXPECT_RANGE(0u, 1u, column_iterator);
EXPECT_TRUE(column_iterator.MoveToNextRange()); EXPECT_TRUE(column_iterator.MoveToNextRange());
...@@ -686,7 +717,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicitAutoRows) { ...@@ -686,7 +717,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicitAutoRows) {
EXPECT_FALSE(column_iterator.MoveToNextRange()); EXPECT_FALSE(column_iterator.MoveToNextRange());
NGGridTrackCollectionBase::RangeRepeatIterator row_iterator( NGGridTrackCollectionBase::RangeRepeatIterator row_iterator(
&algorithm.RowTrackCollection(), 0u); &TrackCollection(kForRows), 0u);
EXPECT_RANGE(0u, 1u, row_iterator); EXPECT_RANGE(0u, 1u, row_iterator);
EXPECT_TRUE(row_iterator.MoveToNextRange()); EXPECT_TRUE(row_iterator.MoveToNextRange());
...@@ -730,12 +761,11 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicitMixed) { ...@@ -730,12 +761,11 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicitMixed) {
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
SetAutoTrackRepeat(algorithm, 0, 0); BuildGridItemsAndTrackCollections(algorithm);
algorithm.Layout();
EXPECT_EQ(GridItemCount(algorithm), 5U); EXPECT_EQ(GridItemCount(algorithm), 5U);
NGGridTrackCollectionBase::RangeRepeatIterator column_iterator( NGGridTrackCollectionBase::RangeRepeatIterator column_iterator(
&algorithm.ColumnTrackCollection(), 0u); &TrackCollection(kForColumns), 0u);
EXPECT_RANGE(0u, 1u, column_iterator); EXPECT_RANGE(0u, 1u, column_iterator);
EXPECT_TRUE(column_iterator.MoveToNextRange()); EXPECT_TRUE(column_iterator.MoveToNextRange());
...@@ -743,7 +773,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicitMixed) { ...@@ -743,7 +773,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmRangesImplicitMixed) {
EXPECT_FALSE(column_iterator.MoveToNextRange()); EXPECT_FALSE(column_iterator.MoveToNextRange());
NGGridTrackCollectionBase::RangeRepeatIterator row_iterator( NGGridTrackCollectionBase::RangeRepeatIterator row_iterator(
&algorithm.RowTrackCollection(), 0u); &TrackCollection(kForRows), 0u);
EXPECT_RANGE(0u, 1u, row_iterator); EXPECT_RANGE(0u, 1u, row_iterator);
EXPECT_TRUE(row_iterator.MoveToNextRange()); EXPECT_TRUE(row_iterator.MoveToNextRange());
...@@ -819,7 +849,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmAutoGridPositions) { ...@@ -819,7 +849,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmAutoGridPositions) {
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
algorithm.Layout(); BuildGridItemsAndTrackCollections(algorithm);
EXPECT_EQ(GridItemCount(algorithm), 4U); EXPECT_EQ(GridItemCount(algorithm), 4U);
Vector<GridArea> grid_positions = GridItemGridAreas(algorithm); Vector<GridArea> grid_positions = GridItemGridAreas(algorithm);
...@@ -948,7 +978,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmAutoDense) { ...@@ -948,7 +978,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmAutoDense) {
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
algorithm.Layout(); BuildGridItemsAndTrackCollections(algorithm);
EXPECT_EQ(GridItemCount(algorithm), 16U); EXPECT_EQ(GridItemCount(algorithm), 16U);
Vector<GridArea> grid_positions = GridItemGridAreas(algorithm); Vector<GridArea> grid_positions = GridItemGridAreas(algorithm);
...@@ -1033,18 +1063,18 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmGridPositions) { ...@@ -1033,18 +1063,18 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmGridPositions) {
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
EXPECT_EQ(GridItemCount(algorithm), 0U); EXPECT_EQ(GridItemCount(algorithm), 0U);
algorithm.Layout(); BuildGridItemsAndTrackCollections(algorithm);
EXPECT_EQ(GridItemCount(algorithm), 3U); EXPECT_EQ(GridItemCount(algorithm), 3U);
NGGridTrackCollectionBase::RangeRepeatIterator column_iterator( NGGridTrackCollectionBase::RangeRepeatIterator column_iterator(
&algorithm.ColumnTrackCollection(), 0u); &TrackCollection(kForColumns), 0u);
EXPECT_RANGE(0u, 1u, column_iterator); EXPECT_RANGE(0u, 1u, column_iterator);
EXPECT_TRUE(column_iterator.MoveToNextRange()); EXPECT_TRUE(column_iterator.MoveToNextRange());
EXPECT_RANGE(1u, 1u, column_iterator); EXPECT_RANGE(1u, 1u, column_iterator);
EXPECT_FALSE(column_iterator.MoveToNextRange()); EXPECT_FALSE(column_iterator.MoveToNextRange());
NGGridTrackCollectionBase::RangeRepeatIterator row_iterator( NGGridTrackCollectionBase::RangeRepeatIterator row_iterator(
&algorithm.RowTrackCollection(), 0u); &TrackCollection(kForRows), 0u);
EXPECT_RANGE(0u, 1u, row_iterator); EXPECT_RANGE(0u, 1u, row_iterator);
EXPECT_TRUE(row_iterator.MoveToNextRange()); EXPECT_TRUE(row_iterator.MoveToNextRange());
EXPECT_RANGE(1u, 2u, row_iterator); EXPECT_RANGE(1u, 2u, row_iterator);
...@@ -1084,7 +1114,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmResolveFixedTrackSizes) { ...@@ -1084,7 +1114,7 @@ TEST_F(NGGridLayoutAlgorithmTest, NGGridLayoutAlgorithmResolveFixedTrackSizes) {
CalculateInitialFragmentGeometry(space, node); CalculateInitialFragmentGeometry(space, node);
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
algorithm.Layout(); BuildGridItemsAndTrackCollections(algorithm);
Vector<LayoutUnit> expected_column_base_sizes = { Vector<LayoutUnit> expected_column_base_sizes = {
LayoutUnit(25), LayoutUnit(60), LayoutUnit(15)}; LayoutUnit(25), LayoutUnit(60), LayoutUnit(15)};
...@@ -1164,7 +1194,7 @@ TEST_F(NGGridLayoutAlgorithmTest, ...@@ -1164,7 +1194,7 @@ TEST_F(NGGridLayoutAlgorithmTest,
CalculateInitialFragmentGeometry(space, node); CalculateInitialFragmentGeometry(space, node);
NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space}); NGGridLayoutAlgorithm algorithm({node, fragment_geometry, space});
algorithm.Layout(); BuildGridItemsAndTrackCollections(algorithm);
DetermineGridItemsSpanningIntrinsicOrFlexTracks(algorithm, kForColumns); DetermineGridItemsSpanningIntrinsicOrFlexTracks(algorithm, kForColumns);
Vector<wtf_size_t> expected_grid_items_spanning_intrinsic_track = {0, 1, 3}; Vector<wtf_size_t> expected_grid_items_spanning_intrinsic_track = {0, 1, 3};
......
...@@ -16,9 +16,9 @@ NGGridPlacement::NGGridPlacement( ...@@ -16,9 +16,9 @@ NGGridPlacement::NGGridPlacement(
const GridTrackSizingDirection major_direction, const GridTrackSizingDirection major_direction,
const ComputedStyle& grid_style, const ComputedStyle& grid_style,
wtf_size_t minor_max_end_line, wtf_size_t minor_max_end_line,
NGGridBlockTrackCollection& row_collection, NGGridBlockTrackCollection* row_collection,
NGGridBlockTrackCollection& column_collection, NGGridBlockTrackCollection* column_collection,
Vector<NGGridLayoutAlgorithm::GridItemData>& items) Vector<NGGridLayoutAlgorithm::GridItemData>* items)
: row_auto_repeat_(row_auto_repeat), : row_auto_repeat_(row_auto_repeat),
column_auto_repeat_(column_auto_repeat), column_auto_repeat_(column_auto_repeat),
row_explicit_start_(row_explicit_start), row_explicit_start_(row_explicit_start),
...@@ -30,9 +30,10 @@ NGGridPlacement::NGGridPlacement( ...@@ -30,9 +30,10 @@ NGGridPlacement::NGGridPlacement(
minor_max_end_line_(minor_max_end_line), minor_max_end_line_(minor_max_end_line),
row_collection_(row_collection), row_collection_(row_collection),
column_collection_(column_collection), column_collection_(column_collection),
items_(items) items_(items) {
DCHECK(row_collection_);
{ DCHECK(column_collection_);
DCHECK(items_);
placement_cursor_major = ExplicitStart(major_direction_); placement_cursor_major = ExplicitStart(major_direction_);
placement_cursor_minor = ExplicitStart(minor_direction_); placement_cursor_minor = ExplicitStart(minor_direction_);
} }
...@@ -60,10 +61,10 @@ void NGGridPlacement::RunAutoPlacementAlgorithm() { ...@@ -60,10 +61,10 @@ void NGGridPlacement::RunAutoPlacementAlgorithm() {
DCHECK(grid_item); DCHECK(grid_item);
switch (grid_item->AutoPlacement(major_direction_)) { switch (grid_item->AutoPlacement(major_direction_)) {
case NGGridLayoutAlgorithm::AutoPlacementType::kBoth: case NGGridLayoutAlgorithm::AutoPlacementType::kBoth:
PlaceAutoBothAxisGridItem(*grid_item); PlaceAutoBothAxisGridItem(grid_item);
break; break;
case NGGridLayoutAlgorithm::AutoPlacementType::kMajor: case NGGridLayoutAlgorithm::AutoPlacementType::kMajor:
PlaceAutoMajorAxisGridItem(*grid_item); PlaceAutoMajorAxisGridItem(grid_item);
break; break;
case NGGridLayoutAlgorithm::AutoPlacementType::kMinor: case NGGridLayoutAlgorithm::AutoPlacementType::kMinor:
case NGGridLayoutAlgorithm::AutoPlacementType::kNotNeeded: case NGGridLayoutAlgorithm::AutoPlacementType::kNotNeeded:
...@@ -73,11 +74,11 @@ void NGGridPlacement::RunAutoPlacementAlgorithm() { ...@@ -73,11 +74,11 @@ void NGGridPlacement::RunAutoPlacementAlgorithm() {
} }
bool NGGridPlacement::PlaceNonAutoGridItems() { bool NGGridPlacement::PlaceNonAutoGridItems() {
for (NGGridLayoutAlgorithm::GridItemData& grid_item : items_) { for (NGGridLayoutAlgorithm::GridItemData& grid_item : *items_) {
bool has_definite_major_placement = bool has_definite_major_placement =
PlaceGridItem(major_direction_, grid_item); PlaceGridItem(major_direction_, &grid_item);
bool has_definite_minor_placement = bool has_definite_minor_placement =
PlaceGridItem(minor_direction_, grid_item); PlaceGridItem(minor_direction_, &grid_item);
// If the item has definite positions on both axis then no auto placement is // If the item has definite positions on both axis then no auto placement is
// needed. // needed.
...@@ -131,104 +132,107 @@ void NGGridPlacement::PlaceGridItemsLockedToMajorAxis() { ...@@ -131,104 +132,107 @@ void NGGridPlacement::PlaceGridItemsLockedToMajorAxis() {
// Update placement and ensure track coverage. // Update placement and ensure track coverage.
UpdatePlacementAndEnsureTrackCoverage( UpdatePlacementAndEnsureTrackCoverage(
GridSpan::TranslatedDefiniteGridSpan(minor_start, minor_end), GridSpan::TranslatedDefiniteGridSpan(minor_start, minor_end),
minor_direction_, *grid_item); minor_direction_, grid_item);
} }
} }
void NGGridPlacement::PlaceAutoMajorAxisGridItem( void NGGridPlacement::PlaceAutoMajorAxisGridItem(
NGGridLayoutAlgorithm::GridItemData& grid_item) { NGGridLayoutAlgorithm::GridItemData* grid_item) {
wtf_size_t major_span_size = GridPositionsResolver::SpanSizeForAutoPlacedItem( wtf_size_t major_span_size =
grid_item.node.Style(), major_direction_); GridPositionsResolver::SpanSizeForAutoPlacedItem(
switch (packing_behavior_) { grid_item->node.Style(), major_direction_);
case PackingBehavior::kSparse: switch (packing_behavior_) {
// Set the minor position of the cursor to the grid item’s minor starting case PackingBehavior::kSparse:
// line. If this is less than the previous column position of the cursor, // Set the minor position of the cursor to the grid item’s minor
// increment the major position by 1. // starting line. If this is less than the previous column position of
if (grid_item.StartLine(minor_direction_) < placement_cursor_minor) { // the cursor, increment the major position by 1.
placement_cursor_major++; if (grid_item->StartLine(minor_direction_) < placement_cursor_minor) {
} placement_cursor_major++;
break; }
case PackingBehavior::kDense: break;
placement_cursor_major = ExplicitStart(major_direction_); case PackingBehavior::kDense:
break; placement_cursor_major = ExplicitStart(major_direction_);
} break;
}
placement_cursor_minor = grid_item.StartLine(minor_direction_);
// Increment the cursor’s major position until a value is found where the grid
// item does not overlap any occupied grid cells
while (DoesItemOverlap(placement_cursor_major,
placement_cursor_major + major_span_size,
grid_item.StartLine(minor_direction_),
grid_item.EndLine(minor_direction_))) {
placement_cursor_major++;
}
// Update item and track placement.
UpdatePlacementAndEnsureTrackCoverage(
GridSpan::TranslatedDefiniteGridSpan(
placement_cursor_major, placement_cursor_major + major_span_size),
major_direction_, grid_item);
}
void NGGridPlacement::PlaceAutoBothAxisGridItem( placement_cursor_minor = grid_item->StartLine(minor_direction_);
NGGridLayoutAlgorithm::GridItemData& grid_item) { // Increment the cursor’s major position until a value is found where the
if (packing_behavior_ == PackingBehavior::kDense) { // grid item does not overlap any occupied grid cells
// Set the cursor’s major and minor positions to start-most row and column while (DoesItemOverlap(placement_cursor_major,
// lines in the implicit grid. placement_cursor_major + major_span_size,
placement_cursor_major = ExplicitStart(major_direction_); grid_item->StartLine(minor_direction_),
placement_cursor_minor = ExplicitStart(minor_direction_); grid_item->EndLine(minor_direction_))) {
}
wtf_size_t major_span_size = GridPositionsResolver::SpanSizeForAutoPlacedItem(
grid_item.node.Style(), major_direction_);
wtf_size_t minor_span_size = GridPositionsResolver::SpanSizeForAutoPlacedItem(
grid_item.node.Style(), minor_direction_);
// Check to see if there would be overlap if this item was placed at the
// cursor. If overlap exists, increment minor position until no conflict
// exists or the item would overflow the minor axis.
while (DoesItemOverlap(
placement_cursor_major, placement_cursor_major + major_span_size,
placement_cursor_minor, placement_cursor_minor + minor_span_size)) {
placement_cursor_minor++;
if (placement_cursor_minor + minor_span_size > ending_minor_line_) {
// If the cursor overflows the minor axis, increment cursor on the major
// axis and start from the beginning.
placement_cursor_major++; placement_cursor_major++;
placement_cursor_minor = starting_minor_line_;
} }
// Update item and track placement.
UpdatePlacementAndEnsureTrackCoverage(
GridSpan::TranslatedDefiniteGridSpan(
placement_cursor_major, placement_cursor_major + major_span_size),
major_direction_, grid_item);
} }
UpdatePlacementAndEnsureTrackCoverage( void NGGridPlacement::PlaceAutoBothAxisGridItem(
GridSpan::TranslatedDefiniteGridSpan( NGGridLayoutAlgorithm::GridItemData* grid_item) {
placement_cursor_major, placement_cursor_major + major_span_size), if (packing_behavior_ == PackingBehavior::kDense) {
major_direction_, grid_item); // Set the cursor’s major and minor positions to start-most row and column
UpdatePlacementAndEnsureTrackCoverage( // lines in the implicit grid.
GridSpan::TranslatedDefiniteGridSpan( placement_cursor_major = ExplicitStart(major_direction_);
placement_cursor_minor, placement_cursor_minor + minor_span_size), placement_cursor_minor = ExplicitStart(minor_direction_);
minor_direction_, grid_item); }
} wtf_size_t major_span_size =
GridPositionsResolver::SpanSizeForAutoPlacedItem(
grid_item->node.Style(), major_direction_);
wtf_size_t minor_span_size =
GridPositionsResolver::SpanSizeForAutoPlacedItem(
grid_item->node.Style(), minor_direction_);
// Check to see if there would be overlap if this item was placed at the
// cursor. If overlap exists, increment minor position until no conflict
// exists or the item would overflow the minor axis.
while (DoesItemOverlap(
placement_cursor_major, placement_cursor_major + major_span_size,
placement_cursor_minor, placement_cursor_minor + minor_span_size)) {
placement_cursor_minor++;
if (placement_cursor_minor + minor_span_size > ending_minor_line_) {
// If the cursor overflows the minor axis, increment cursor on the major
// axis and start from the beginning.
placement_cursor_major++;
placement_cursor_minor = starting_minor_line_;
}
}
bool NGGridPlacement::PlaceGridItem( UpdatePlacementAndEnsureTrackCoverage(
GridTrackSizingDirection direction, GridSpan::TranslatedDefiniteGridSpan(
NGGridLayoutAlgorithm::NGGridLayoutAlgorithm::GridItemData& grid_item) { placement_cursor_major, placement_cursor_major + major_span_size),
GridSpan span = GridPositionsResolver::ResolveGridPositionsFromStyle( major_direction_, grid_item);
grid_style_, grid_item.node.Style(), direction, AutoRepeat(direction)); UpdatePlacementAndEnsureTrackCoverage(
// Indefinite positions are resolved with the auto placement algorithm. GridSpan::TranslatedDefiniteGridSpan(
if (span.IsIndefinite()) placement_cursor_minor, placement_cursor_minor + minor_span_size),
return false; minor_direction_, grid_item);
}
span.Translate(ExplicitStart(direction)); bool NGGridPlacement::PlaceGridItem(
UpdatePlacementAndEnsureTrackCoverage(span, direction, grid_item); GridTrackSizingDirection direction,
return true; NGGridLayoutAlgorithm::NGGridLayoutAlgorithm::GridItemData* grid_item) {
} GridSpan span = GridPositionsResolver::ResolveGridPositionsFromStyle(
grid_style_, grid_item->node.Style(), direction, AutoRepeat(direction));
// Indefinite positions are resolved with the auto placement algorithm.
if (span.IsIndefinite())
return false;
void NGGridPlacement::UpdatePlacementAndEnsureTrackCoverage( span.Translate(ExplicitStart(direction));
GridSpan span, UpdatePlacementAndEnsureTrackCoverage(span, direction, grid_item);
GridTrackSizingDirection track_direction, return true;
NGGridLayoutAlgorithm::NGGridLayoutAlgorithm::GridItemData& grid_item) { }
grid_item.SetSpan(span, track_direction);
BlockCollection(track_direction) void NGGridPlacement::UpdatePlacementAndEnsureTrackCoverage(
.EnsureTrackCoverage(span.StartLine(), span.IntegerSpan()); GridSpan span,
} GridTrackSizingDirection track_direction,
NGGridLayoutAlgorithm::NGGridLayoutAlgorithm::GridItemData* grid_item) {
grid_item->SetSpan(span, track_direction);
BlockCollection(track_direction)
.EnsureTrackCoverage(span.StartLine(), span.IntegerSpan());
}
bool NGGridPlacement::DoesItemOverlap(wtf_size_t major_start, bool NGGridPlacement::DoesItemOverlap(wtf_size_t major_start,
wtf_size_t major_end, wtf_size_t major_end,
...@@ -238,7 +242,7 @@ bool NGGridPlacement::DoesItemOverlap(wtf_size_t major_start, ...@@ -238,7 +242,7 @@ bool NGGridPlacement::DoesItemOverlap(wtf_size_t major_start,
DCHECK_LE(minor_start, minor_end); DCHECK_LE(minor_start, minor_end);
// TODO(janewman): Implement smarter collision detection, iterating over all // TODO(janewman): Implement smarter collision detection, iterating over all
// items is not ideal and has large performance implications. // items is not ideal and has large performance implications.
for (const NGGridLayoutAlgorithm::GridItemData& grid_item : items_) { for (const NGGridLayoutAlgorithm::GridItemData& grid_item : *items_) {
if (grid_item.Span(major_direction_).IsIndefinite()) if (grid_item.Span(major_direction_).IsIndefinite())
continue; continue;
// Only test against definite positions. // Only test against definite positions.
...@@ -287,9 +291,9 @@ NGGridBlockTrackCollection& NGGridPlacement::BlockCollection( ...@@ -287,9 +291,9 @@ NGGridBlockTrackCollection& NGGridPlacement::BlockCollection(
GridTrackSizingDirection direction) { GridTrackSizingDirection direction) {
switch (direction) { switch (direction) {
case kForRows: case kForRows:
return row_collection_; return *row_collection_;
case kForColumns: case kForColumns:
return column_collection_; return *column_collection_;
} }
} }
......
...@@ -27,9 +27,9 @@ class CORE_EXPORT NGGridPlacement { ...@@ -27,9 +27,9 @@ class CORE_EXPORT NGGridPlacement {
const GridTrackSizingDirection major_direction, const GridTrackSizingDirection major_direction,
const ComputedStyle& grid_style, const ComputedStyle& grid_style,
wtf_size_t minor_max_end_line, wtf_size_t minor_max_end_line,
NGGridBlockTrackCollection& row_collection, NGGridBlockTrackCollection* row_collection,
NGGridBlockTrackCollection& column_collection, NGGridBlockTrackCollection* column_collection,
Vector<NGGridLayoutAlgorithm::GridItemData>& items); Vector<NGGridLayoutAlgorithm::GridItemData>* items);
void RunAutoPlacementAlgorithm(); void RunAutoPlacementAlgorithm();
private: private:
...@@ -42,21 +42,21 @@ class CORE_EXPORT NGGridPlacement { ...@@ -42,21 +42,21 @@ class CORE_EXPORT NGGridPlacement {
// Place item that has a definite position on the minor axis but need auto // Place item that has a definite position on the minor axis but need auto
// placement on the major axis. // placement on the major axis.
void PlaceAutoMajorAxisGridItem( void PlaceAutoMajorAxisGridItem(
NGGridLayoutAlgorithm::GridItemData& item_data); NGGridLayoutAlgorithm::GridItemData* item_data);
// Place items that need automatic placement on both the major and minor axis. // Place items that need automatic placement on both the major and minor axis.
void PlaceAutoBothAxisGridItem( void PlaceAutoBothAxisGridItem(
NGGridLayoutAlgorithm::GridItemData& item_data); NGGridLayoutAlgorithm::GridItemData* item_data);
// Places a grid item if it has a definite position in the given direction, // Places a grid item if it has a definite position in the given direction,
// returns true if item was able to be positioned, false if item needs auto // returns true if item was able to be positioned, false if item needs auto
// positioning in the given direction. // positioning in the given direction.
bool PlaceGridItem( bool PlaceGridItem(
GridTrackSizingDirection grid_direction, GridTrackSizingDirection grid_direction,
NGGridLayoutAlgorithm::NGGridLayoutAlgorithm::GridItemData& item_data); NGGridLayoutAlgorithm::NGGridLayoutAlgorithm::GridItemData* item_data);
void UpdatePlacementAndEnsureTrackCoverage( void UpdatePlacementAndEnsureTrackCoverage(
GridSpan span, GridSpan span,
GridTrackSizingDirection track_direction, GridTrackSizingDirection track_direction,
NGGridLayoutAlgorithm::NGGridLayoutAlgorithm::GridItemData& item_data); NGGridLayoutAlgorithm::NGGridLayoutAlgorithm::GridItemData* item_data);
// Returns true if the given placement would overlap with a placed item. // Returns true if the given placement would overlap with a placed item.
bool DoesItemOverlap(wtf_size_t major_start, bool DoesItemOverlap(wtf_size_t major_start,
...@@ -83,9 +83,9 @@ class CORE_EXPORT NGGridPlacement { ...@@ -83,9 +83,9 @@ class CORE_EXPORT NGGridPlacement {
// major line. // major line.
wtf_size_t minor_max_end_line_ = 0; wtf_size_t minor_max_end_line_ = 0;
NGGridBlockTrackCollection& row_collection_; NGGridBlockTrackCollection* row_collection_;
NGGridBlockTrackCollection& column_collection_; NGGridBlockTrackCollection* column_collection_;
Vector<NGGridLayoutAlgorithm::GridItemData>& items_; Vector<NGGridLayoutAlgorithm::GridItemData>* items_;
wtf_size_t starting_minor_line_ = 0; wtf_size_t starting_minor_line_ = 0;
wtf_size_t ending_minor_line_ = 0; wtf_size_t ending_minor_line_ = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment