Title: [282386] trunk/Source/WebCore
Revision
282386
Author
[email protected]
Date
2021-09-14 06:19:06 -0700 (Tue, 14 Sep 2021)

Log Message

[LFC][IFC] InlineDisplayContentBuilder should not operate on the global inline run list
https://bugs.webkit.org/show_bug.cgi?id=230232

Reviewed by Antti Koivisto.

InlineDisplayContentBuilder builds one line worth of runs. It should not have access to the global (all runs in the formatting context) run list.

* layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
(WebCore::Layout::InlineDisplayContentBuilder::build):
(WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent):
(WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes):
(WebCore::Layout::InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns):
* layout/formattingContexts/inline/InlineDisplayContentBuilder.h:
* layout/formattingContexts/inline/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::computeGeometryForLineContent):
* layout/formattingContexts/inline/InlineFormattingState.h:
(WebCore::Layout::InlineFormattingState::addRuns):
(WebCore::Layout::InlineFormattingState::addRun): Deleted.
* layout/formattingContexts/inline/InlineLineRun.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (282385 => 282386)


--- trunk/Source/WebCore/ChangeLog	2021-09-14 10:13:23 UTC (rev 282385)
+++ trunk/Source/WebCore/ChangeLog	2021-09-14 13:19:06 UTC (rev 282386)
@@ -1,3 +1,25 @@
+2021-09-14  Alan Bujtas  <[email protected]>
+
+        [LFC][IFC] InlineDisplayContentBuilder should not operate on the global inline run list
+        https://bugs.webkit.org/show_bug.cgi?id=230232
+
+        Reviewed by Antti Koivisto.
+
+        InlineDisplayContentBuilder builds one line worth of runs. It should not have access to the global (all runs in the formatting context) run list.
+
+        * layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
+        (WebCore::Layout::InlineDisplayContentBuilder::build):
+        (WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent):
+        (WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes):
+        (WebCore::Layout::InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns):
+        * layout/formattingContexts/inline/InlineDisplayContentBuilder.h:
+        * layout/formattingContexts/inline/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::computeGeometryForLineContent):
+        * layout/formattingContexts/inline/InlineFormattingState.h:
+        (WebCore::Layout::InlineFormattingState::addRuns):
+        (WebCore::Layout::InlineFormattingState::addRun): Deleted.
+        * layout/formattingContexts/inline/InlineLineRun.h:
+
 2021-09-14  Xabier Rodriguez Calvar  <[email protected]>
 
         [GStreamer] Enable H265 codec

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp (282385 => 282386)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp	2021-09-14 10:13:23 UTC (rev 282385)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp	2021-09-14 13:19:06 UTC (rev 282386)
@@ -42,19 +42,23 @@
 {
 }
 
-void InlineDisplayContentBuilder::build(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex)
+InlineRuns InlineDisplayContentBuilder::build(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex)
 {
-    auto& formattingState = this->formattingState();
+    InlineRuns runs;
+    runs.reserveInitialCapacity(lineContent.runs.size() + lineBox.nonRootInlineLevelBoxes().size() + 1);
+
     // Every line starts with a root run, even the empty ones.
     auto rootInlineBoxRect = lineBox.logicalRectForRootInlineBox();
     rootInlineBoxRect.moveBy(lineBoxLogicalTopLeft);
-    formattingState.addRun({ lineIndex, Run::Type::RootInlineBox, root(), rootInlineBoxRect, rootInlineBoxRect, { }, { },  lineBox.rootInlineBox().hasContent()});
-    createRunsAndUpdateGeometryForLineSpanningInlineBoxes(lineBox, lineBoxLogicalTopLeft, lineIndex);
-    createRunsAndUpdateGeometryForLineContent(lineContent, lineBox, lineBoxLogicalTopLeft, lineIndex);
-    collectInkOverflowForInlineBoxRuns(lineBox);
+    runs.append({ lineIndex, Run::Type::RootInlineBox, root(), rootInlineBoxRect, rootInlineBoxRect, { }, { },  lineBox.rootInlineBox().hasContent()});
+
+    createRunsAndUpdateGeometryForLineSpanningInlineBoxes(lineBox, lineBoxLogicalTopLeft, lineIndex, runs);
+    createRunsAndUpdateGeometryForLineContent(lineContent, lineBox, lineBoxLogicalTopLeft, lineIndex, runs);
+    collectInkOverflowForInlineBoxRuns(lineBox, runs);
+    return runs;
 }
 
-void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex)
+void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns& runs)
 {
     auto& formattingState = this->formattingState();
     // Create the inline runs on the current line. This is mostly text and atomic inline runs.
@@ -86,7 +90,7 @@
             auto adjustedContentToRender = [&] {
                 return text->needsHyphen ? makeString(content.substring(text->start, text->length), style.hyphenString()) : String();
             };
-            formattingState.addRun({ lineIndex
+            runs.append({ lineIndex
                 , Run::Type::Text
                 , layoutBox
                 , textRunRect
@@ -101,7 +105,7 @@
 
             ASSERT(lineRun.textContent() && is<InlineTextBox>(layoutBox));
             auto& text = lineRun.textContent();
-            formattingState.addRun({ lineIndex
+            runs.append({ lineIndex
                 , Run::Type::SoftLineBreak
                 , layoutBox
                 , softLineBreakRunRect
@@ -114,7 +118,7 @@
             // Only hard linebreaks have associated layout boxes.
             auto lineBreakBoxRect = lineBox.logicalRectForLineBreakBox(layoutBox);
             lineBreakBoxRect.moveBy(lineBoxLogicalTopLeft);
-            formattingState.addRun({ lineIndex, Run::Type::LineBreakBox, layoutBox, lineBreakBoxRect, lineBreakBoxRect, lineRun.expansion(), { } });
+            runs.append({ lineIndex, Run::Type::LineBreakBox, layoutBox, lineBreakBoxRect, lineBreakBoxRect, lineRun.expansion(), { } });
 
             auto& boxGeometry = formattingState.boxGeometry(layoutBox);
             boxGeometry.setLogicalTopLeft(toLayoutPoint(lineBreakBoxRect.topLeft()));
@@ -127,7 +131,7 @@
             auto logicalBorderBox = lineBox.logicalBorderBoxForAtomicInlineLevelBox(layoutBox, boxGeometry);
             logicalBorderBox.moveBy(lineBoxLogicalTopLeft);
             // FIXME: Add ink overflow support for atomic inline level boxes (e.g. box shadow).
-            formattingState.addRun({ lineIndex, Run::Type::AtomicInlineLevelBox, layoutBox, logicalBorderBox, logicalBorderBox, lineRun.expansion(), { } });
+            runs.append({ lineIndex, Run::Type::AtomicInlineLevelBox, layoutBox, logicalBorderBox, logicalBorderBox, lineRun.expansion(), { } });
 
             auto borderBoxLogicalTopLeft = logicalBorderBox.topLeft();
             // Note that inline boxes are relative to the line and their top position can be negative.
@@ -141,7 +145,7 @@
                     return;
                 }
                 RELEASE_ASSERT(m_inlineBoxRunIndexMap.contains(&parentInlineBox));
-                formattingState.runs()[m_inlineBoxRunIndexMap.get(&parentInlineBox)].adjustInkOverflow(logicalBorderBox);
+                runs[m_inlineBoxRunIndexMap.get(&parentInlineBox)].adjustInkOverflow(logicalBorderBox);
             };
             adjustParentInlineBoxInkOverflow();
             break;
@@ -153,8 +157,8 @@
             inlineBoxBorderBox.moveBy(lineBoxLogicalTopLeft);
             if (lineBox.hasContent()) {
                 // FIXME: It's expected to not have any runs on empty lines. We should reconsider this.
-                m_inlineBoxRunIndexMap.add(&layoutBox, formattingState.runs().size());
-                formattingState.addRun({ lineIndex, Run::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, inlineBoxBorderBox, { }, { }, lineBox.inlineLevelBoxForLayoutBox(layoutBox).hasContent() });
+                m_inlineBoxRunIndexMap.add(&layoutBox, runs.size());
+                runs.append({ lineIndex, Run::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, inlineBoxBorderBox, { }, { }, lineBox.inlineLevelBoxForLayoutBox(layoutBox).hasContent() });
             }
 
             auto inlineBoxSize = LayoutSize { LayoutUnit::fromFloatCeil(inlineBoxBorderBox.width()), LayoutUnit::fromFloatCeil(inlineBoxBorderBox.height()) };
@@ -173,7 +177,7 @@
     }
 }
 
-void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex)
+void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns& runs)
 {
     if (!lineBox.hasContent()) {
         // When a spanning inline box (e.g. <div>text<span><br></span></div>) lands on an empty line
@@ -192,8 +196,8 @@
         auto inlineBoxBorderBox = lineBox.logicalBorderBoxForInlineBox(layoutBox, boxGeometry);
         inlineBoxBorderBox.moveBy(lineBoxLogicalTopLeft);
 
-        m_inlineBoxRunIndexMap.add(&layoutBox, formattingState.runs().size());
-        formattingState.addRun({ lineIndex, Run::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, inlineBoxBorderBox, { }, { }, inlineLevelBox.hasContent(), true });
+        m_inlineBoxRunIndexMap.add(&layoutBox, runs.size());
+        runs.append({ lineIndex, Run::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, inlineBoxBorderBox, { }, { }, inlineLevelBox.hasContent(), true });
 
         auto inlineBoxSize = LayoutSize { LayoutUnit::fromFloatCeil(inlineBoxBorderBox.width()), LayoutUnit::fromFloatCeil(inlineBoxBorderBox.height()) };
         auto logicalRect = Rect { LayoutPoint { inlineBoxBorderBox.topLeft() }, inlineBoxSize };
@@ -207,7 +211,7 @@
     }
 }
 
-void InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns(const LineBox& lineBox)
+void InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns(const LineBox& lineBox, InlineRuns& runs)
 {
     if (m_inlineBoxRunIndexMap.isEmpty() || !lineBox.hasContent()) {
         // This line has no inline box (only root, but we don't collect ink overflow for the root inline box atm)
@@ -214,7 +218,6 @@
         return;
     }
 
-    auto& formattingState = this->formattingState();
     auto& nonRootInlineLevelBoxes = lineBox.nonRootInlineLevelBoxes();
     // Visit the inline boxes and propagate ink overflow to their parents -except to the root inline box.
     // (e.g. <span style="font-size: 10px;">Small font size<span style="font-size: 300px;">Larger font size. This overflows the top most span.</span></span>).
@@ -226,8 +229,8 @@
         if (&parentInlineBox == &root())
             continue;
         RELEASE_ASSERT(m_inlineBoxRunIndexMap.contains(&inlineBox) && m_inlineBoxRunIndexMap.contains(&parentInlineBox));
-        auto& inkOverflow = formattingState.runs()[m_inlineBoxRunIndexMap.get(&inlineBox)].inkOverflow();
-        auto& parentInlineBoxRun = formattingState.runs()[m_inlineBoxRunIndexMap.get(&parentInlineBox)];
+        auto& inkOverflow = runs[m_inlineBoxRunIndexMap.get(&inlineBox)].inkOverflow();
+        auto& parentInlineBoxRun = runs[m_inlineBoxRunIndexMap.get(&parentInlineBox)];
         parentInlineBoxRun.adjustInkOverflow(inkOverflow);
     }
 }

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h (282385 => 282386)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h	2021-09-14 10:13:23 UTC (rev 282385)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h	2021-09-14 13:19:06 UTC (rev 282386)
@@ -41,12 +41,12 @@
 public:
     InlineDisplayContentBuilder(const ContainerBox& formattingContextRoot, InlineFormattingState&);
 
-    void build(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex);
+    InlineRuns build(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex);
 
 private:
-    void createRunsAndUpdateGeometryForLineContent(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex);
-    void createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex);
-    void collectInkOverflowForInlineBoxRuns(const LineBox&);
+    void createRunsAndUpdateGeometryForLineContent(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns&);
+    void createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns&);
+    void collectInkOverflowForInlineBoxRuns(const LineBox&, InlineRuns&);
 
     const ContainerBox& root() const { return m_formattingContextRoot; }
     InlineFormattingState& formattingState() const { return m_formattingState; } 

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp (282385 => 282386)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2021-09-14 10:13:23 UTC (rev 282385)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2021-09-14 13:19:06 UTC (rev 282386)
@@ -570,15 +570,15 @@
 InlineRect InlineFormattingContext::computeGeometryForLineContent(const LineBuilder::LineContent& lineContent)
 {
     auto& formattingState = this->formattingState();
+    auto lineBoxAndGeometry = LineBoxBuilder(*this).build(lineContent);
+    auto lineBoxLogicalRect = lineBoxAndGeometry.lineGeometry.lineBoxLogicalRect();
+
+    auto inlineContentBuilder = InlineDisplayContentBuilder { root(), formattingState };
     auto currentLineIndex = formattingState.lines().size();
-
-    auto lineBoxAndGeometry = LineBoxBuilder(*this).build(lineContent);
+    formattingState.addRuns(inlineContentBuilder.build(lineContent, lineBoxAndGeometry.lineBox, lineBoxLogicalRect.topLeft(), currentLineIndex));
     formattingState.addLineBox(WTFMove(lineBoxAndGeometry.lineBox));
     formattingState.addLine(lineBoxAndGeometry.lineGeometry);
 
-    auto lineBoxLogicalRect = lineBoxAndGeometry.lineGeometry.lineBoxLogicalRect();
-
-    InlineDisplayContentBuilder(root(), formattingState).build(lineContent, formattingState.lineBoxes().last(), lineBoxLogicalRect.topLeft(), currentLineIndex);
     return lineBoxLogicalRect;
 }
 

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingState.h (282385 => 282386)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingState.h	2021-09-14 10:13:23 UTC (rev 282385)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingState.h	2021-09-14 13:19:06 UTC (rev 282386)
@@ -62,7 +62,7 @@
 
     const InlineRuns& runs() const { return m_runs; }
     InlineRuns& runs() { return m_runs; }
-    void addRun(Run&& run) { m_runs.append(WTFMove(run)); }
+    void addRuns(InlineRuns&& runs) { m_runs.appendVector(WTFMove(runs)); }
 
     void setClearGapAfterLastLine(InlineLayoutUnit verticalGap);
     InlineLayoutUnit clearGapAfterLastLine() const { return m_clearGapAfterLastLine; }

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineRun.h (282385 => 282386)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineRun.h	2021-09-14 10:13:23 UTC (rev 282385)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineRun.h	2021-09-14 13:19:06 UTC (rev 282386)
@@ -114,8 +114,8 @@
     size_t lineIndex() const { return m_lineIndex; }
 
 private:
-    const size_t m_lineIndex;
-    const Type m_type;
+    const size_t m_lineIndex { 0 };
+    const Type m_type { Type::GenericInlineLevelBox };
     WeakPtr<const Layout::Box> m_layoutBox;
     InlineRect m_logicalRect;
     InlineRect m_inkOverflow;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to