blob: c779c7d96bbdd672310f54bba01f0af6fa509629 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_PLACEMENT_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_PLACEMENT_H_
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h"
#include "third_party/blink/renderer/core/layout/ng/grid/ng_grid_track_collection.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
// This class encapsulates the Grid Item Placement Algorithm described by
// https://drafts.csswg.org/css-grid/#auto-placement-algo
class CORE_EXPORT NGGridPlacement {
STACK_ALLOCATED();
public:
enum class PackingBehavior { kSparse, kDense };
using GridItems = NGGridLayoutAlgorithm::GridItems;
using GridItemData = NGGridLayoutAlgorithm::GridItemData;
using AutoPlacementType = NGGridLayoutAlgorithm::AutoPlacementType;
NGGridPlacement(const ComputedStyle& grid_style,
const wtf_size_t column_auto_repetitions,
const wtf_size_t row_auto_repetitions);
void RunAutoPlacementAlgorithm(GridItems* 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 StartOffset(GridTrackSizingDirection track_direction) const;
private:
struct AutoPlacementCursor {
wtf_size_t major_position{0};
wtf_size_t minor_position{0};
};
// Compute the track start offset from the grid items positioned at negative
// indices.
wtf_size_t DetermineTrackStartOffset(
const GridItems& grid_items,
GridTrackSizingDirection track_direction) const;
// Place non auto-positioned elements from |grid_items|; returns true if any
// item needs to resolve an automatic position. Otherwise, false.
bool PlaceNonAutoGridItems(GridItems* grid_items);
// Place elements from |grid_items| that have a definite position on the major
// axis but need auto-placement on the minor axis.
void PlaceGridItemsLockedToMajorAxis(GridItems* grid_items);
// Place an item that has a definite position on the minor axis but need
// auto-placement on the major axis.
void PlaceAutoMajorAxisGridItem(GridItemData* grid_item,
AutoPlacementCursor* placement_cursor,
const GridItems& grid_items);
// Place an item that needs auto-placement on both the major and minor axis.
void PlaceAutoBothAxisGridItem(GridItemData* grid_item,
AutoPlacementCursor* placement_cursor,
const GridItems& grid_items);
// Places a grid item; returns true if it has a definite position in the given
// direction, false if the item needs auto-placement.
bool PlaceGridItem(GridItemData* grid_item,
GridTrackSizingDirection track_direction) const;
// Returns true if the given placement would overlap with a placed item.
bool DoesItemOverlap(wtf_size_t major_start,
wtf_size_t major_end,
wtf_size_t minor_start,
wtf_size_t minor_end,
const GridItems& grid_items) const;
wtf_size_t AutoRepeatTrackCount(
GridTrackSizingDirection track_direction) const;
bool HasSparsePacking() const;
// Used to resolve positions using |GridPositionsResolver|.
const ComputedStyle& grid_style_;
const PackingBehavior packing_behavior_;
const GridTrackSizingDirection major_direction_;
const GridTrackSizingDirection minor_direction_;
const wtf_size_t column_auto_repeat_track_count_;
const wtf_size_t row_auto_repeat_track_count_;
const wtf_size_t column_auto_repetitions_;
const wtf_size_t row_auto_repetitions_;
wtf_size_t minor_max_end_line_;
wtf_size_t column_start_offset_;
wtf_size_t row_start_offset_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_PLACEMENT_H_