Skip to content
This repository was archived by the owner on Jun 24, 2022. It is now read-only.

Commit 7bf83cd

Browse files
[LFC Display] Simplify display tree building
https://bugs.webkit.org/show_bug.cgi?id=218152 Reviewed by Zalan Bujtas. Rather than tracking container/current child display boxes in various places in the code, wrap it up in a small InsertionPosition struct and TreeBuilder::insert() which handles the setFirstChild/setNextSibling logic. * display/DisplayTreeBuilder.cpp: (WebCore::Display::TreeBuilder::build const): (WebCore::Display::TreeBuilder::insert const): (WebCore::Display::TreeBuilder::buildInlineDisplayTree const): (WebCore::Display::TreeBuilder::recursiveBuildDisplayTree const): * display/DisplayTreeBuilder.h: git-svn-id: http://svn.webkit.org/repository/webkit/trunk@268953 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent f46f524 commit 7bf83cd

File tree

3 files changed

+53
-30
lines changed

3 files changed

+53
-30
lines changed

Source/WebCore/ChangeLog

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1+
2020-10-24 Simon Fraser <[email protected]>
2+
3+
[LFC Display] Simplify display tree building
4+
https://bugs.webkit.org/show_bug.cgi?id=218152
5+
6+
Reviewed by Zalan Bujtas.
7+
8+
Rather than tracking container/current child display boxes in various places in the code,
9+
wrap it up in a small InsertionPosition struct and TreeBuilder::insert() which handles
10+
the setFirstChild/setNextSibling logic.
11+
12+
* display/DisplayTreeBuilder.cpp:
13+
(WebCore::Display::TreeBuilder::build const):
14+
(WebCore::Display::TreeBuilder::insert const):
15+
(WebCore::Display::TreeBuilder::buildInlineDisplayTree const):
16+
(WebCore::Display::TreeBuilder::recursiveBuildDisplayTree const):
17+
* display/DisplayTreeBuilder.h:
18+
119
2020-10-24 Jer Noble <[email protected]>
220

321
[BigSur] Appending a new WebM init segment between Cluster elements throws an error

Source/WebCore/display/DisplayTreeBuilder.cpp

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,30 @@ std::unique_ptr<Tree> TreeBuilder::build(const Layout::LayoutState& layoutState)
6969

7070
auto borderBoxRect = LayoutRect { Layout::BoxGeometry::borderBoxRect(geometry) };
7171
auto offset = toLayoutSize(borderBoxRect.location());
72-
recursiveBuildDisplayTree(layoutState, offset, *rootLayoutBox.firstChild(), *rootDisplayContainerBox);
72+
auto insertionPosition = InsertionPosition { *rootDisplayContainerBox };
73+
74+
recursiveBuildDisplayTree(layoutState, offset, *rootLayoutBox.firstChild(), insertionPosition);
7375

7476
LOG_WITH_STREAM(FormattingContextLayout, stream << "Display tree:\n" << displayTreeAsText(*rootDisplayContainerBox));
7577

7678
return makeUnique<Tree>(WTFMove(rootDisplayContainerBox));
7779
}
7880

79-
void TreeBuilder::buildInlineDisplayTree(const Layout::LayoutState& layoutState, LayoutSize offsetFromRoot, const Layout::ContainerBox& inlineFormattingRoot, ContainerBox& parentDisplayBox) const
81+
void TreeBuilder::insert(std::unique_ptr<Box>&& box, InsertionPosition& insertionPosition) const
8082
{
81-
auto& inlineFormattingState = layoutState.establishedInlineFormattingState(inlineFormattingRoot);
83+
if (insertionPosition.currentChild) {
84+
auto boxPtr = box.get();
85+
insertionPosition.currentChild->setNextSibling(WTFMove(box));
86+
insertionPosition.currentChild = boxPtr;
87+
} else {
88+
insertionPosition.currentChild = box.get();
89+
insertionPosition.container.setFirstChild(WTFMove(box));
90+
}
91+
}
8292

83-
Box* previousSiblingBox = nullptr;
93+
void TreeBuilder::buildInlineDisplayTree(const Layout::LayoutState& layoutState, LayoutSize offsetFromRoot, const Layout::ContainerBox& inlineFormattingRoot, InsertionPosition& insertionPosition) const
94+
{
95+
auto& inlineFormattingState = layoutState.establishedInlineFormattingState(inlineFormattingRoot);
8496

8597
for (auto& run : inlineFormattingState.lineRuns()) {
8698
auto& lineGeometry = inlineFormattingState.lines().at(run.lineIndex());
@@ -94,53 +106,39 @@ void TreeBuilder::buildInlineDisplayTree(const Layout::LayoutState& layoutState,
94106

95107
auto style = Style { run.layoutBox().style() };
96108
auto textBox = makeUnique<TextBox>(snapRectToDevicePixels(runRect, m_pixelSnappingFactor), WTFMove(style), run);
97-
auto textBoxPtr = textBox.get();
98109

99-
if (previousSiblingBox)
100-
previousSiblingBox->setNextSibling(WTFMove(textBox));
101-
else
102-
parentDisplayBox.setFirstChild(WTFMove(textBox));
103-
104-
previousSiblingBox = textBoxPtr;
110+
insert(WTFMove(textBox), insertionPosition);
105111
}
106112
}
107113

108-
Box* TreeBuilder::recursiveBuildDisplayTree(const Layout::LayoutState& layoutState, LayoutSize offsetFromRoot, const Layout::Box& box, ContainerBox& parentDisplayBox, Box* previousSiblingBox) const
114+
void TreeBuilder::recursiveBuildDisplayTree(const Layout::LayoutState& layoutState, LayoutSize offsetFromRoot, const Layout::Box& box, InsertionPosition& insertionPosition) const
109115
{
110116
auto geometry = layoutState.geometryForBox(box);
111117
auto displayBox = displayBoxForLayoutBox(geometry, box, offsetFromRoot);
112118

113-
Box* result = displayBox.get();
114-
115-
if (previousSiblingBox)
116-
previousSiblingBox->setNextSibling(WTFMove(displayBox));
117-
else
118-
parentDisplayBox.setFirstChild(WTFMove(displayBox));
119+
insert(WTFMove(displayBox), insertionPosition);
119120

120121
if (!is<Layout::ContainerBox>(box))
121-
return result;
122+
return;
122123

123124
auto& layoutContainerBox = downcast<Layout::ContainerBox>(box);
124125
if (!layoutContainerBox.hasChild())
125-
return result;
126+
return;
126127

127128
auto borderBoxRect = LayoutRect { Layout::BoxGeometry::borderBoxRect(geometry) };
128129
offsetFromRoot += toLayoutSize(borderBoxRect.location());
129130

130-
auto& displayContainerBox = downcast<ContainerBox>(*result);
131-
131+
auto positionForChildren = InsertionPosition { downcast<ContainerBox>(*insertionPosition.currentChild) };
132+
132133
if (layoutContainerBox.establishesInlineFormattingContext()) {
133-
buildInlineDisplayTree(layoutState, offsetFromRoot, downcast<Layout::ContainerBox>(layoutContainerBox), displayContainerBox);
134-
return result;
134+
buildInlineDisplayTree(layoutState, offsetFromRoot, downcast<Layout::ContainerBox>(layoutContainerBox), positionForChildren);
135+
return;
135136
}
136137

137-
Display::Box* currSiblingDisplayBox = nullptr;
138138
for (auto& child : Layout::childrenOfType<Layout::Box>(layoutContainerBox)) {
139139
if (layoutState.hasBoxGeometry(child))
140-
currSiblingDisplayBox = recursiveBuildDisplayTree(layoutState, offsetFromRoot, child, displayContainerBox, currSiblingDisplayBox);
140+
recursiveBuildDisplayTree(layoutState, offsetFromRoot, child, positionForChildren);
141141
}
142-
143-
return result;
144142
}
145143

146144
std::unique_ptr<Box> TreeBuilder::displayBoxForRootBox(const Layout::BoxGeometry& geometry, const Layout::ContainerBox& rootBox) const

Source/WebCore/display/DisplayTreeBuilder.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,19 @@ class TreeBuilder {
5757
std::unique_ptr<Tree> build(const Layout::LayoutState&) const;
5858

5959
private:
60+
struct InsertionPosition {
61+
Display::ContainerBox& container;
62+
Display::Box* currentChild { nullptr };
63+
};
64+
6065
std::unique_ptr<Box> displayBoxForRootBox(const Layout::BoxGeometry&, const Layout::ContainerBox&) const;
6166
std::unique_ptr<Box> displayBoxForLayoutBox(const Layout::BoxGeometry&, const Layout::Box&, LayoutSize offsetFromRoot) const;
6267

63-
Box* recursiveBuildDisplayTree(const Layout::LayoutState&, LayoutSize offsetFromRoot, const Layout::Box&, Display::ContainerBox& parentDisplayBox, Display::Box* previousSiblingBox = nullptr) const;
68+
void recursiveBuildDisplayTree(const Layout::LayoutState&, LayoutSize offsetFromRoot, const Layout::Box&, InsertionPosition&) const;
6469

65-
void buildInlineDisplayTree(const Layout::LayoutState&, LayoutSize offsetFromRoot, const Layout::ContainerBox&, Display::ContainerBox& parentDisplayBox) const;
70+
void buildInlineDisplayTree(const Layout::LayoutState&, LayoutSize offsetFromRoot, const Layout::ContainerBox&, InsertionPosition&) const;
71+
72+
void insert(std::unique_ptr<Box>&&, InsertionPosition&) const;
6673

6774
float m_pixelSnappingFactor { 1 };
6875
};

0 commit comments

Comments
 (0)