@@ -69,18 +69,30 @@ std::unique_ptr<Tree> TreeBuilder::build(const Layout::LayoutState& layoutState)
69
69
70
70
auto borderBoxRect = LayoutRect { Layout::BoxGeometry::borderBoxRect (geometry) };
71
71
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);
73
75
74
76
LOG_WITH_STREAM (FormattingContextLayout, stream << " Display tree:\n " << displayTreeAsText (*rootDisplayContainerBox));
75
77
76
78
return makeUnique<Tree>(WTFMove (rootDisplayContainerBox));
77
79
}
78
80
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
80
82
{
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
+ }
82
92
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);
84
96
85
97
for (auto & run : inlineFormattingState.lineRuns ()) {
86
98
auto & lineGeometry = inlineFormattingState.lines ().at (run.lineIndex ());
@@ -94,53 +106,39 @@ void TreeBuilder::buildInlineDisplayTree(const Layout::LayoutState& layoutState,
94
106
95
107
auto style = Style { run.layoutBox ().style () };
96
108
auto textBox = makeUnique<TextBox>(snapRectToDevicePixels (runRect, m_pixelSnappingFactor), WTFMove (style), run);
97
- auto textBoxPtr = textBox.get ();
98
109
99
- if (previousSiblingBox)
100
- previousSiblingBox->setNextSibling (WTFMove (textBox));
101
- else
102
- parentDisplayBox.setFirstChild (WTFMove (textBox));
103
-
104
- previousSiblingBox = textBoxPtr;
110
+ insert (WTFMove (textBox), insertionPosition);
105
111
}
106
112
}
107
113
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
109
115
{
110
116
auto geometry = layoutState.geometryForBox (box);
111
117
auto displayBox = displayBoxForLayoutBox (geometry, box, offsetFromRoot);
112
118
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);
119
120
120
121
if (!is<Layout::ContainerBox>(box))
121
- return result ;
122
+ return ;
122
123
123
124
auto & layoutContainerBox = downcast<Layout::ContainerBox>(box);
124
125
if (!layoutContainerBox.hasChild ())
125
- return result ;
126
+ return ;
126
127
127
128
auto borderBoxRect = LayoutRect { Layout::BoxGeometry::borderBoxRect (geometry) };
128
129
offsetFromRoot += toLayoutSize (borderBoxRect.location ());
129
130
130
- auto & displayContainerBox = downcast<ContainerBox>(*result) ;
131
-
131
+ auto positionForChildren = InsertionPosition { downcast<ContainerBox>(*insertionPosition. currentChild ) } ;
132
+
132
133
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 ;
135
136
}
136
137
137
- Display::Box* currSiblingDisplayBox = nullptr ;
138
138
for (auto & child : Layout::childrenOfType<Layout::Box>(layoutContainerBox)) {
139
139
if (layoutState.hasBoxGeometry (child))
140
- currSiblingDisplayBox = recursiveBuildDisplayTree (layoutState, offsetFromRoot, child, displayContainerBox, currSiblingDisplayBox );
140
+ recursiveBuildDisplayTree (layoutState, offsetFromRoot, child, positionForChildren );
141
141
}
142
-
143
- return result;
144
142
}
145
143
146
144
std::unique_ptr<Box> TreeBuilder::displayBoxForRootBox (const Layout::BoxGeometry& geometry, const Layout::ContainerBox& rootBox) const
0 commit comments