Title: [270224] trunk/Source/WebCore
Revision
270224
Author
[email protected]
Date
2020-11-28 21:10:49 -0800 (Sat, 28 Nov 2020)

Log Message

[LFC Display] Use a vector to maintain state during display tree building
https://bugs.webkit.org/show_bug.cgi?id=219314

Reviewed by Zalan Bujtas.

Over time more state will be required during tree building. Rather than using the stack
and passing lots of arguments to tree building functions, use a Vector<> to push state
when processing a ContainerBox's children, and pop afterwards.

The vector is declared as a std::unique_ptr<> to hide the state types from the header.

* display/DisplayTreeBuilder.cpp:
(WebCore::Display::TreeBuilder::TreeBuilder):
(WebCore::Display::TreeBuilder::build):
(WebCore::Display::TreeBuilder::pushStateForBoxDescendants):
(WebCore::Display::TreeBuilder::popState):
(WebCore::Display::TreeBuilder::currentState const):
(WebCore::Display::TreeBuilder::positioningContext const):
(WebCore::Display::TreeBuilder::buildInlineDisplayTree):
(WebCore::Display::TreeBuilder::recursiveBuildDisplayTree):
(WebCore::Display::TreeBuilder::buildInlineDisplayTree const): Deleted.
(WebCore::Display::TreeBuilder::recursiveBuildDisplayTree const): Deleted.
* display/DisplayTreeBuilder.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (270223 => 270224)


--- trunk/Source/WebCore/ChangeLog	2020-11-29 04:20:53 UTC (rev 270223)
+++ trunk/Source/WebCore/ChangeLog	2020-11-29 05:10:49 UTC (rev 270224)
@@ -1,5 +1,31 @@
 2020-11-28  Simon Fraser  <[email protected]>
 
+        [LFC Display] Use a vector to maintain state during display tree building
+        https://bugs.webkit.org/show_bug.cgi?id=219314
+
+        Reviewed by Zalan Bujtas.
+
+        Over time more state will be required during tree building. Rather than using the stack
+        and passing lots of arguments to tree building functions, use a Vector<> to push state
+        when processing a ContainerBox's children, and pop afterwards.
+
+        The vector is declared as a std::unique_ptr<> to hide the state types from the header.
+
+        * display/DisplayTreeBuilder.cpp:
+        (WebCore::Display::TreeBuilder::TreeBuilder):
+        (WebCore::Display::TreeBuilder::build):
+        (WebCore::Display::TreeBuilder::pushStateForBoxDescendants):
+        (WebCore::Display::TreeBuilder::popState):
+        (WebCore::Display::TreeBuilder::currentState const):
+        (WebCore::Display::TreeBuilder::positioningContext const):
+        (WebCore::Display::TreeBuilder::buildInlineDisplayTree):
+        (WebCore::Display::TreeBuilder::recursiveBuildDisplayTree):
+        (WebCore::Display::TreeBuilder::buildInlineDisplayTree const): Deleted.
+        (WebCore::Display::TreeBuilder::recursiveBuildDisplayTree const): Deleted.
+        * display/DisplayTreeBuilder.h:
+
+2020-11-28  Simon Fraser  <[email protected]>
+
         [LFC Display] Add basic transforms support.
         https://bugs.webkit.org/show_bug.cgi?id=219313
 

Modified: trunk/Source/WebCore/display/DisplayTreeBuilder.cpp (270223 => 270224)


--- trunk/Source/WebCore/display/DisplayTreeBuilder.cpp	2020-11-29 04:20:53 UTC (rev 270223)
+++ trunk/Source/WebCore/display/DisplayTreeBuilder.cpp	2020-11-29 05:10:49 UTC (rev 270224)
@@ -96,10 +96,15 @@
     ContainingBlockContext m_inFlowContainer;
 };
 
+struct BuildingState {
+    PositioningContext positioningContext;
+};
 
 TreeBuilder::TreeBuilder(float pixelSnappingFactor)
     : m_boxFactory(pixelSnappingFactor)
+    , m_stateStack(makeUnique<Vector<BuildingState>>())
 {
+    m_stateStack->reserveInitialCapacity(32);
 }
 
 std::unique_ptr<Tree> TreeBuilder::build(const Layout::LayoutState& layoutState)
@@ -123,8 +128,10 @@
 
     auto insertionPosition = InsertionPosition { *rootDisplayContainerBox };
 
-    recursiveBuildDisplayTree(layoutState, *rootLayoutBox.firstChild(), { *rootDisplayContainerBox }, insertionPosition);
+    m_stateStack->append({ *rootDisplayContainerBox });
 
+    recursiveBuildDisplayTree(layoutState, *rootLayoutBox.firstChild(), insertionPosition);
+
 #if ENABLE(TREE_DEBUGGING)
     LOG_WITH_STREAM(FormattingContextLayout, stream << "Display tree:\n" << displayTreeAsText(*rootDisplayContainerBox));
 #endif
@@ -132,6 +139,28 @@
     return makeUnique<Tree>(WTFMove(rootDisplayContainerBox));
 }
 
+void TreeBuilder::pushStateForBoxDescendants(const Layout::ContainerBox& layoutContainerBox, const Layout::BoxGeometry& layoutGeometry, const ContainerBox& displayBox)
+{
+    auto& positioningContext = m_stateStack->last().positioningContext;
+    m_stateStack->append({ positioningContext.contextForDescendants(layoutContainerBox, layoutGeometry, displayBox) });
+}
+
+void TreeBuilder::popState()
+{
+    m_stateStack->removeLast();
+}
+
+const BuildingState& TreeBuilder::currentState() const
+{
+    ASSERT(m_stateStack && m_stateStack->size());
+    return m_stateStack->last();
+}
+
+const PositioningContext& TreeBuilder::positioningContext() const
+{
+    return currentState().positioningContext;
+}
+
 void TreeBuilder::insert(std::unique_ptr<Box>&& box, InsertionPosition& insertionPosition) const
 {
     if (insertionPosition.currentChild) {
@@ -144,7 +173,7 @@
     }
 }
 
-void TreeBuilder::buildInlineDisplayTree(const Layout::LayoutState& layoutState, const Layout::ContainerBox& inlineFormattingRoot, const PositioningContext& positioningContext, InsertionPosition& insertionPosition) const
+void TreeBuilder::buildInlineDisplayTree(const Layout::LayoutState& layoutState, const Layout::ContainerBox& inlineFormattingRoot, InsertionPosition& insertionPosition)
 {
     auto& inlineFormattingState = layoutState.establishedInlineFormattingState(inlineFormattingRoot);
 
@@ -151,28 +180,28 @@
     for (auto& run : inlineFormattingState.lineRuns()) {
         if (run.text()) {
             auto& lineGeometry = inlineFormattingState.lines().at(run.lineIndex());
-            auto textBox = m_boxFactory.displayBoxForTextRun(run, lineGeometry, positioningContext.inFlowContainingBlockContext());
+            auto textBox = m_boxFactory.displayBoxForTextRun(run, lineGeometry, positioningContext().inFlowContainingBlockContext());
             insert(WTFMove(textBox), insertionPosition);
             continue;
         }
 
         if (is<Layout::ContainerBox>(run.layoutBox())) {
-            recursiveBuildDisplayTree(layoutState, run.layoutBox(), positioningContext, insertionPosition);
+            recursiveBuildDisplayTree(layoutState, run.layoutBox(), insertionPosition);
             continue;
         }
 
         auto geometry = layoutState.geometryForBox(run.layoutBox());
-        auto displayBox = m_boxFactory.displayBoxForLayoutBox(run.layoutBox(), geometry, positioningContext.inFlowContainingBlockContext());
+        auto displayBox = m_boxFactory.displayBoxForLayoutBox(run.layoutBox(), geometry, positioningContext().inFlowContainingBlockContext());
         insert(WTFMove(displayBox), insertionPosition);
     }
 }
 
-void TreeBuilder::recursiveBuildDisplayTree(const Layout::LayoutState& layoutState, const Layout::Box& layoutBox, const PositioningContext& positioningContext, InsertionPosition& insertionPosition) const
+void TreeBuilder::recursiveBuildDisplayTree(const Layout::LayoutState& layoutState, const Layout::Box& layoutBox, InsertionPosition& insertionPosition)
 {
     auto geometry = layoutState.geometryForBox(layoutBox);
     std::unique_ptr<Box> displayBox;
 
-    auto& containingBlockContext = positioningContext.containingBlockContextForLayoutBox(layoutBox);
+    auto& containingBlockContext = positioningContext().containingBlockContextForLayoutBox(layoutBox);
     if (layoutBox.isBodyBox())
         displayBox = m_boxFactory.displayBoxForBodyBox(layoutBox, geometry, containingBlockContext, m_rootBackgroundPropgation);
     else
@@ -190,13 +219,13 @@
     ContainerBox& currentBox = downcast<ContainerBox>(*insertionPosition.currentChild);
     auto insertionPositionForChildren = InsertionPosition { currentBox };
 
-    auto positioningContextForDescendants = positioningContext.contextForDescendants(layoutContainerBox, geometry, currentBox);
+    pushStateForBoxDescendants(layoutContainerBox, geometry, currentBox);
 
     enum class DescendantBoxInclusion { AllBoxes, OutOfFlowOnly };
     auto boxInclusion = DescendantBoxInclusion::AllBoxes;
 
     if (layoutContainerBox.establishesInlineFormattingContext()) {
-        buildInlineDisplayTree(layoutState, downcast<Layout::ContainerBox>(layoutContainerBox), positioningContextForDescendants, insertionPositionForChildren);
+        buildInlineDisplayTree(layoutState, downcast<Layout::ContainerBox>(layoutContainerBox), insertionPositionForChildren);
         boxInclusion = DescendantBoxInclusion::OutOfFlowOnly;
     }
 
@@ -210,8 +239,10 @@
 
     for (auto& child : Layout::childrenOfType<Layout::Box>(layoutContainerBox)) {
         if (includeBox(boxInclusion, child) && layoutState.hasBoxGeometry(child))
-            recursiveBuildDisplayTree(layoutState, child, positioningContextForDescendants, insertionPositionForChildren);
+            recursiveBuildDisplayTree(layoutState, child, insertionPositionForChildren);
     }
+
+    popState();
 }
 
 #if ENABLE(TREE_DEBUGGING)

Modified: trunk/Source/WebCore/display/DisplayTreeBuilder.h (270223 => 270224)


--- trunk/Source/WebCore/display/DisplayTreeBuilder.h	2020-11-29 04:20:53 UTC (rev 270223)
+++ trunk/Source/WebCore/display/DisplayTreeBuilder.h	2020-11-29 05:10:49 UTC (rev 270224)
@@ -51,6 +51,7 @@
 class ContainerBox;
 class PositioningContext;
 class Tree;
+struct BuildingState;
 
 class TreeBuilder {
 public:
@@ -64,14 +65,21 @@
         Box* currentChild { nullptr };
     };
 
-    void recursiveBuildDisplayTree(const Layout::LayoutState&, const Layout::Box&, const PositioningContext&, InsertionPosition&) const;
+    void recursiveBuildDisplayTree(const Layout::LayoutState&, const Layout::Box&, InsertionPosition&);
+    void buildInlineDisplayTree(const Layout::LayoutState&, const Layout::ContainerBox&, InsertionPosition&);
 
-    void buildInlineDisplayTree(const Layout::LayoutState&, const Layout::ContainerBox&, const PositioningContext&, InsertionPosition&) const;
-
     void insert(std::unique_ptr<Box>&&, InsertionPosition&) const;
 
+    void pushStateForBoxDescendants(const Layout::ContainerBox&, const Layout::BoxGeometry&, const ContainerBox&);
+    void popState();
+    
+    const BuildingState& currentState() const;
+    const PositioningContext& positioningContext() const;
+
     BoxFactory m_boxFactory;
     RootBackgroundPropagation m_rootBackgroundPropgation { RootBackgroundPropagation::None };
+    
+    std::unique_ptr<Vector<BuildingState>> m_stateStack;
 };
 
 #if ENABLE(TREE_DEBUGGING)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to