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
...@@ -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
......
...@@ -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