Title: [286534] trunk/Source/WebCore
Revision
286534
Author
za...@apple.com
Date
2021-12-04 08:51:39 -0800 (Sat, 04 Dec 2021)

Log Message

[LFC][IFC] Compute isFirstBox/isLastBox for text content
https://bugs.webkit.org/show_bug.cgi?id=233850

Reviewed by Antti Koivisto.

This is in preparation for helping the iterator interface to compute renderer (layout box) boundaries for text content.

* layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
(WebCore::Layout::InlineDisplayContentBuilder::appendTextDisplayBox):
(WebCore::Layout::InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent):
* layout/formattingContexts/inline/InlineDisplayContentBuilder.h:
* layout/formattingContexts/inline/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::layoutInFlowContent):
(WebCore::Layout::InlineFormattingContext::lineLayoutForIntergration):
* layout/formattingContexts/inline/display/InlineDisplayBox.h:
(WebCore::InlineDisplay::Box::setIsFirstBox):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (286533 => 286534)


--- trunk/Source/WebCore/ChangeLog	2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/ChangeLog	2021-12-04 16:51:39 UTC (rev 286534)
@@ -1,3 +1,22 @@
+2021-12-04  Alan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] Compute isFirstBox/isLastBox for text content
+        https://bugs.webkit.org/show_bug.cgi?id=233850
+
+        Reviewed by Antti Koivisto.
+
+        This is in preparation for helping the iterator interface to compute renderer (layout box) boundaries for text content.
+
+        * layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
+        (WebCore::Layout::InlineDisplayContentBuilder::appendTextDisplayBox):
+        (WebCore::Layout::InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent):
+        * layout/formattingContexts/inline/InlineDisplayContentBuilder.h:
+        * layout/formattingContexts/inline/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::layoutInFlowContent):
+        (WebCore::Layout::InlineFormattingContext::lineLayoutForIntergration):
+        * layout/formattingContexts/inline/display/InlineDisplayBox.h:
+        (WebCore::InlineDisplay::Box::setIsFirstBox):
+
 2021-12-04  Antoine Quint  <grao...@webkit.org>
 
         CSS animation sorting may crash due to AnimationList copy upon CSS Animation removal

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp	2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp	2021-12-04 16:51:39 UTC (rev 286534)
@@ -123,7 +123,9 @@
         , textRunRect
         , inkOverflow()
         , lineRun.expansion()
-        , InlineDisplay::Box::Text { text->start, text->length, content, adjustedContentToRender(), text->needsHyphen } });
+        , InlineDisplay::Box::Text { text->start, text->length, content, adjustedContentToRender(), text->needsHyphen }
+        , true
+        , { } });
 }
 
 void InlineDisplayContentBuilder::appendSoftLineBreakDisplayBox(const Line::Run& lineRun, const InlineRect& softLineBreakRunRect, DisplayBoxes& boxes)
@@ -649,7 +651,25 @@
     }
 }
 
+void InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent(DisplayBoxes& boxes)
+{
+    HashMap<const Box*, size_t> lastDisplayBoxForInlineTextBoxIndexes;
+    ASSERT(boxes[0].isRootInlineBox());
+    for (size_t index = 1; index < boxes.size(); ++index) {
+        auto& displayBox = boxes[index];
+        // FIXME: Transition the inline box isFirst/isLast computation here as well.
+        if (!displayBox.isText())
+            continue;
+        auto& layoutBox = displayBox.layoutBox();
+        if (!lastDisplayBoxForInlineTextBoxIndexes.contains(&layoutBox))
+            displayBox.setIsFirstBox(true);
+        lastDisplayBoxForInlineTextBoxIndexes.set(&layoutBox, index);
+    }
+    for (auto lastDisplayBoxForInlineTextBoxIndex : lastDisplayBoxForInlineTextBoxIndexes)
+        boxes[lastDisplayBoxForInlineTextBoxIndex.value].setIsLastBox(true);
 }
+
 }
+}
 
 #endif

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h	2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h	2021-12-04 16:51:39 UTC (rev 286534)
@@ -43,6 +43,8 @@
 
     DisplayBoxes build(const LineBuilder::LineContent&, const LineBox&, const InlineRect& lineBoxLogicalRect, const size_t lineIndex);
 
+    static void computeIsFirstIsLastBoxForInlineContent(DisplayBoxes&);
+
 private:
     void processNonBidiContent(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, DisplayBoxes&);
     void processBidiContent(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, DisplayBoxes&);

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2021-12-04 16:51:39 UTC (rev 286534)
@@ -145,6 +145,7 @@
     auto& inlineItems = formattingState().inlineItems();
     lineLayout(inlineItems, { 0, inlineItems.size() }, constraints);
     computeStaticPositionForOutOfFlowContent(formattingState().outOfFlowBoxes());
+    InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent(formattingState().boxes());
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[End] -> inline formatting context -> formatting root(" << &root() << ")");
 }
 
@@ -155,6 +156,7 @@
     auto& inlineItems = formattingState().inlineItems();
     lineLayout(inlineItems, { 0, inlineItems.size() }, constraints);
     computeStaticPositionForOutOfFlowContent(formattingState().outOfFlowBoxes());
+    InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent(formattingState().boxes());
 }
 
 IntrinsicWidthConstraints InlineFormattingContext::computedIntrinsicWidthConstraintsForIntegration()

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h (286533 => 286534)


--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h	2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h	2021-12-04 16:51:39 UTC (rev 286534)
@@ -130,6 +130,7 @@
     bool isLastBox() const { return m_isLastWithinInlineLevelBox; }
 
     void setIsLastBox(bool isLastBox) { m_isLastWithinInlineLevelBox = isLastBox; }
+    void setIsFirstBox(bool isFirstBox) { m_isFirstWithinInlineLevelBox = isFirstBox; }
 
 private:
     const size_t m_lineIndex { 0 };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to