Commit 364fe1c6 authored by Ana SollanoKim's avatar Ana SollanoKim Committed by Chromium LUCI CQ

[GridNG] Refactor item set indices and grid lines for out of flow items

1. Previously, we were storing the set indices of each item directly in
GridItemData. This is not necessary as they can be computed on demand.
`CacheItemSetIndices` was renamed to `ComputeItemSetIndices` and was
changed to return `ItemSetIndices` instead.

2. `ResolveOutOfFlowItemGridLines` was moved to `NGGridPlacement`
addressing a TODO. Now the variables `automatic_repetitions` and
`explicit_start` can be directly obtained from the placement instance.

This change does not add nor remove any functionality.

Bug: 1045599
Change-Id: Ib0d3898f9979788cb4e9f7311ab9ad7a1c03504f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2626356
Commit-Queue: Ana Sollano Kim <ansollan@microsoft.com>
Reviewed-by: default avatarEthan Jimenez <ethavar@microsoft.com>
Reviewed-by: default avatarChristian Biesinger <cbiesinger@chromium.org>
Reviewed-by: default avatarKurt Catti-Schmidt <kschmi@microsoft.com>
Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarJacques Newman <janewman@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#845846}
parent 4fe1d718
...@@ -36,6 +36,11 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -36,6 +36,11 @@ class CORE_EXPORT NGGridLayoutAlgorithm
kForMaxContentMaximums kForMaxContentMaximums
}; };
struct ItemSetIndices {
wtf_size_t begin;
wtf_size_t end;
};
struct GridItemData { struct GridItemData {
explicit GridItemData(const NGBlockNode node) : node(node) {} explicit GridItemData(const NGBlockNode node) : node(node) {}
...@@ -59,6 +64,13 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -59,6 +64,13 @@ class CORE_EXPORT NGGridLayoutAlgorithm
bool IsSpanningIntrinsicTrack( bool IsSpanningIntrinsicTrack(
GridTrackSizingDirection track_direction) const; GridTrackSizingDirection track_direction) const;
// For this item and track direction, computes and stores the pair of
// indices "begin" and "end" such that the item spans every set from the
// respective collection's |sets_| with an index in the range [begin, end).
ItemSetIndices SetIndices(
const NGGridLayoutAlgorithmTrackCollection& track_collection,
NGGridPlacement* grid_placement = nullptr);
const NGBlockNode node; const NGBlockNode node;
GridArea resolved_position; GridArea resolved_position;
...@@ -66,13 +78,6 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -66,13 +78,6 @@ class CORE_EXPORT NGGridLayoutAlgorithm
LayoutUnit inline_size; LayoutUnit inline_size;
MinMaxSizes min_max_sizes; MinMaxSizes min_max_sizes;
// These fields are used to determine the sets this item spans in the
// respective track collection; see |CacheItemSetIndices|.
wtf_size_t columns_begin_set_index;
wtf_size_t columns_end_set_index;
wtf_size_t rows_begin_set_index;
wtf_size_t rows_end_set_index;
AxisEdge inline_axis_alignment; AxisEdge inline_axis_alignment;
AxisEdge block_axis_alignment; AxisEdge block_axis_alignment;
...@@ -83,6 +88,12 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -83,6 +88,12 @@ class CORE_EXPORT NGGridLayoutAlgorithm
TrackSpanProperties column_span_properties; TrackSpanProperties column_span_properties;
TrackSpanProperties row_span_properties; TrackSpanProperties row_span_properties;
// These fields are used to determine the sets this item spans in the
// respective track collection; see |SetIndices|. We use optional since some
// scenarios don't require to compute the indices at all.
base::Optional<ItemSetIndices> column_set_indices;
base::Optional<ItemSetIndices> row_set_indices;
}; };
explicit NGGridLayoutAlgorithm(const NGLayoutAlgorithmParams& params); explicit NGGridLayoutAlgorithm(const NGLayoutAlgorithmParams& params);
...@@ -132,13 +143,6 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -132,13 +143,6 @@ class CORE_EXPORT NGGridLayoutAlgorithm
Vector<GridItemData>& grid_items_; Vector<GridItemData>& grid_items_;
}; };
// Returns an iterator for every |NGGridSet| contained within an item's span
// in the relevant track collection.
static NGGridLayoutAlgorithmTrackCollection::SetIterator
GetSetIteratorForItem(const GridItemData& item,
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.
LayoutUnit ContributionSizeForGridItem( LayoutUnit ContributionSizeForGridItem(
...@@ -175,18 +179,6 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -175,18 +179,6 @@ class CORE_EXPORT NGGridLayoutAlgorithm
const Vector<GridItemData>& grid_items, const Vector<GridItemData>& grid_items,
NGGridBlockTrackCollection* track_collection) const; NGGridBlockTrackCollection* track_collection) const;
// 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
// collection's |sets_| with an index in the range [begin, end).
void CacheItemSetIndices(
const NGGridLayoutAlgorithmTrackCollection& track_collection,
Vector<GridItemData>* items) const;
// Helper function to resolve start and end lines of out of flow items.
void ResolveOutOfFlowItemGridLines(
const GridItemData& out_of_flow_item,
const NGGridLayoutAlgorithmTrackCollection& track_collection,
wtf_size_t* start_line,
wtf_size_t* end_line) const;
// For every grid item, caches properties of the track sizing functions it // For every grid item, caches properties of the track sizing functions it
// spans (i.e. whether an item spans intrinsic or flexible tracks). // spans (i.e. whether an item spans intrinsic or flexible tracks).
void CacheGridItemsTrackSpanProperties( void CacheGridItemsTrackSpanProperties(
...@@ -221,10 +213,11 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -221,10 +213,11 @@ class CORE_EXPORT NGGridLayoutAlgorithm
// Lays out and computes inline and block offsets for grid items. // Lays out and computes inline and block offsets for grid items.
void PlaceItems( void PlaceItems(
const Vector<GridItemData>& grid_items,
const NGGridLayoutAlgorithmTrackCollection& column_track_collection, const NGGridLayoutAlgorithmTrackCollection& column_track_collection,
const NGGridLayoutAlgorithmTrackCollection& row_track_collection, const NGGridLayoutAlgorithmTrackCollection& row_track_collection,
Vector<GridItemData>* grid_items,
Vector<GridItemData>* out_of_flow_items, Vector<GridItemData>* out_of_flow_items,
NGGridPlacement* grid_placement,
LayoutUnit* intrinsic_block_size, LayoutUnit* intrinsic_block_size,
LayoutUnit* block_size); LayoutUnit* block_size);
...@@ -236,21 +229,18 @@ class CORE_EXPORT NGGridLayoutAlgorithm ...@@ -236,21 +229,18 @@ class CORE_EXPORT NGGridLayoutAlgorithm
void PlaceGridItems(const Vector<GridItemData>& grid_items, void PlaceGridItems(const Vector<GridItemData>& grid_items,
const Vector<LayoutUnit>& column_set_offsets, const Vector<LayoutUnit>& column_set_offsets,
const Vector<LayoutUnit>& row_set_offsets, const Vector<LayoutUnit>& row_set_offsets,
LayoutUnit intrinsic_block_size, LayoutUnit block_size,
LayoutUnit column_grid_gap, LayoutUnit column_grid_gap,
LayoutUnit row_grid_gap); LayoutUnit row_grid_gap);
// Computes the static position, grid area and its offset of out of flow // Computes the static position, grid area and its offset of out of flow
// elements in the grid. // elements in the grid.
void PlaceOutOfFlowItems( void PlaceOutOfFlowItems(const Vector<GridItemData>& out_of_flow_items,
const Vector<LayoutUnit>& column_set_offsets, const Vector<LayoutUnit>& column_set_offsets,
const Vector<LayoutUnit>& row_set_offsets, const Vector<LayoutUnit>& row_set_offsets,
const NGGridLayoutAlgorithmTrackCollection& column_track_collection, LayoutUnit block_size,
const NGGridLayoutAlgorithmTrackCollection& row_track_collection, LayoutUnit column_grid_gap,
LayoutUnit block_size, LayoutUnit row_grid_gap);
LayoutUnit column_grid_gap,
LayoutUnit row_grid_gap,
Vector<GridItemData>* out_of_flow_items);
// Helper method that computes the offset and size of an item. // Helper method that computes the offset and size of an item.
void ComputeOffsetAndSize( void ComputeOffsetAndSize(
......
...@@ -54,12 +54,6 @@ class NGGridLayoutAlgorithmTest ...@@ -54,12 +54,6 @@ class NGGridLayoutAlgorithmTest
&grid_items_, &algorithm_column_track_collection_, &grid_items_, &algorithm_column_track_collection_,
&algorithm_row_track_collection_, &grid_placement); &algorithm_row_track_collection_, &grid_placement);
// Cache set indices.
algorithm.CacheItemSetIndices(algorithm_column_track_collection_,
&grid_items_);
algorithm.CacheItemSetIndices(algorithm_row_track_collection_,
&grid_items_);
// Create a vector of grid item indices using |NGGridChildIterator| order. // Create a vector of grid item indices using |NGGridChildIterator| order.
Vector<wtf_size_t> reordered_item_indices(grid_items_.size()); Vector<wtf_size_t> reordered_item_indices(grid_items_.size());
for (wtf_size_t i = 0; i < grid_items_.size(); ++i) for (wtf_size_t i = 0; i < grid_items_.size(); ++i)
......
...@@ -328,4 +328,46 @@ bool NGGridPlacement::HasSparsePacking() const { ...@@ -328,4 +328,46 @@ bool NGGridPlacement::HasSparsePacking() const {
return packing_behavior_ == PackingBehavior::kSparse; return packing_behavior_ == PackingBehavior::kSparse;
} }
void NGGridPlacement::ResolveOutOfFlowItemGridLines(
const NGGridLayoutAlgorithmTrackCollection& track_collection,
const ComputedStyle& out_of_flow_item_style,
wtf_size_t* start_line,
wtf_size_t* end_line) const {
DCHECK(start_line);
DCHECK(end_line);
const GridTrackSizingDirection track_direction = track_collection.Direction();
GridSpan span = GridPositionsResolver::ResolveGridPositionsFromStyle(
grid_style_, out_of_flow_item_style, track_direction,
AutoRepeatTrackCount(track_direction));
if (span.IsIndefinite()) {
*start_line = kNotFound;
*end_line = kNotFound;
return;
}
if (span.UntranslatedStartLine() > -1) {
// TODO(ansollan): Handle out of flow positioned items with negative
// indexes.
span.Translate(StartOffset(track_direction));
}
*start_line = span.StartLine();
*end_line = span.EndLine();
bool is_start_line_auto =
(track_direction == kForColumns)
? out_of_flow_item_style.GridColumnStart().IsAuto()
: out_of_flow_item_style.GridRowStart().IsAuto();
if (is_start_line_auto || !track_collection.IsTrackWithinBounds(*start_line))
*start_line = kNotFound;
bool is_end_line_auto = (track_direction == kForColumns)
? out_of_flow_item_style.GridColumnEnd().IsAuto()
: out_of_flow_item_style.GridRowEnd().IsAuto();
if (is_end_line_auto || !track_collection.IsTrackWithinBounds(*end_line - 1))
*end_line = kNotFound;
}
} // namespace blink } // namespace blink
...@@ -28,6 +28,13 @@ class CORE_EXPORT NGGridPlacement { ...@@ -28,6 +28,13 @@ class CORE_EXPORT NGGridPlacement {
const wtf_size_t row_auto_repetitions); const wtf_size_t row_auto_repetitions);
void RunAutoPlacementAlgorithm(Vector<GridItemData>* grid_items); void RunAutoPlacementAlgorithm(Vector<GridItemData>* grid_items);
// Helper function to resolve start and end lines of out of flow items.
void ResolveOutOfFlowItemGridLines(
const NGGridLayoutAlgorithmTrackCollection& track_collection,
const ComputedStyle& out_of_flow_item_style,
wtf_size_t* start_line,
wtf_size_t* end_line) const;
wtf_size_t AutoRepetitions(GridTrackSizingDirection track_direction) const; wtf_size_t AutoRepetitions(GridTrackSizingDirection track_direction) const;
private: private:
......
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