Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-land Masonry cleanup #7496

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
25 changes: 16 additions & 9 deletions Source/WebCore/rendering/GridMasonryLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,16 @@ void GridMasonryLayout::performMasonryPlacement(unsigned gridAxisTracks, GridTra
resizeAndResetRunningPositions();

// 2.4 Masonry Layout Algorithm
addItemsToFirstTrack(m_firstTrackItems);
addItemsToFirstTrack();

// the insertIntoGridAndLayoutItem() will modify the m_autoFlowNextCursor, so m_autoFlowNextCursor needs to be reset.
m_autoFlowNextCursor = 0;

if (m_renderGrid.style().masonryAutoFlow().placementOrder == MasonryAutoFlowPlacementOrder::Ordered)
placeItemsUsingOrderModifiedDocumentOrder();
else {
placeItemsWithDefiniteGridAxisPosition(m_itemsWithDefiniteGridAxisPosition);
placeItemsWithIndefiniteGridAxisPosition(m_itemsWithIndefiniteGridAxisPosition);
placeItemsWithDefiniteGridAxisPosition();
placeItemsWithIndefiniteGridAxisPosition();
}
}

Expand Down Expand Up @@ -101,10 +104,14 @@ void GridMasonryLayout::resizeAndResetRunningPositions()
m_runningPositions.fill(LayoutUnit());
}

void GridMasonryLayout::addItemsToFirstTrack(const HashMap<RenderBox*, GridArea>& firstTrackItems)
void GridMasonryLayout::addItemsToFirstTrack()
{
for (auto& [item, gridArea] : firstTrackItems)
for (auto& [item, gridArea] : m_firstTrackItems) {
ASSERT(item);
if (!item)
continue;
insertIntoGridAndLayoutItem(*item, gridArea);
}
}

void GridMasonryLayout::placeItemsUsingOrderModifiedDocumentOrder()
Expand All @@ -121,9 +128,9 @@ void GridMasonryLayout::placeItemsUsingOrderModifiedDocumentOrder()
}
}

void GridMasonryLayout::placeItemsWithDefiniteGridAxisPosition(const Vector<RenderBox*>& itemsWithDefiniteGridAxisPosition)
void GridMasonryLayout::placeItemsWithDefiniteGridAxisPosition()
{
for (auto* item : itemsWithDefiniteGridAxisPosition) {
for (auto* item : m_itemsWithDefiniteGridAxisPosition) {
ASSERT(item);
if (!item)
continue;
Expand All @@ -146,9 +153,9 @@ GridArea GridMasonryLayout::gridAreaForDefiniteGridAxisItem(const RenderBox& chi
return masonryGridAreaFromGridAxisSpan(itemSpan);
}

void GridMasonryLayout::placeItemsWithIndefiniteGridAxisPosition(const Vector<RenderBox*>& itemsWithIndefinitePosition)
void GridMasonryLayout::placeItemsWithIndefiniteGridAxisPosition()
{
for (auto* item : itemsWithIndefinitePosition) {
for (auto* item : m_itemsWithIndefiniteGridAxisPosition) {
ASSERT(item);
if (!item)
continue;
Expand Down
11 changes: 8 additions & 3 deletions Source/WebCore/rendering/GridMasonryLayout.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,18 @@ class GridMasonryLayout {
void performMasonryPlacement(unsigned gridAxisTracks, GridTrackSizingDirection masonryAxisDirection);
LayoutUnit offsetForChild(const RenderBox&) const;
LayoutUnit gridContentSize() const { return m_gridContentSize; };

private:
GridSpan gridAxisPositionUsingPackAutoFlow(const RenderBox& item) const;
GridSpan gridAxisPositionUsingNextAutoFlow(const RenderBox& item);
GridArea gridAreaForIndefiniteGridAxisItem(const RenderBox& item);
GridArea gridAreaForDefiniteGridAxisItem(const RenderBox&) const;

void collectMasonryItems();
void addItemsToFirstTrack(const HashMap<RenderBox*, GridArea>& firstTrackItems);
void addItemsToFirstTrack();
void placeItemsUsingOrderModifiedDocumentOrder();
void placeItemsWithDefiniteGridAxisPosition(const Vector<RenderBox*>& itemsWithDefinitePosition);
void placeItemsWithIndefiniteGridAxisPosition(const Vector<RenderBox*>& itemsWithIndefinitePosition);
void placeItemsWithDefiniteGridAxisPosition();
void placeItemsWithIndefiniteGridAxisPosition();
void setItemGridAxisContainingBlockToGridArea(RenderBox&);
void insertIntoGridAndLayoutItem(RenderBox&, const GridArea&);

Expand Down Expand Up @@ -85,8 +86,12 @@ class GridMasonryLayout {

GridTrackSizingDirection m_masonryAxisDirection;
const GridSpan m_masonryAxisSpan = GridSpan::masonryAxisTranslatedDefiniteGridSpan();

// These values are based on best estimate. They may need to be updated based
// on common behavior seen on websites.
const unsigned m_masonryDefiniteItemsQuarterCapacity = 4;
const unsigned m_masonryIndefiniteItemsHalfCapacity = 2;

unsigned m_autoFlowNextCursor;
};

Expand Down