Title: [293645] trunk/Source/WebCore
Revision
293645
Author
za...@apple.com
Date
2022-04-30 06:11:23 -0700 (Sat, 30 Apr 2022)

Log Message

[LFC][IFC] Introduce LineBuilder::PartialContent
https://bugs.webkit.org/show_bug.cgi?id=239886

Reviewed by Antti Koivisto.

This patch is in preparation for adding partial content support for intrinsic width computation.

1. Use a dedicated PartialContent structure to store partial overflowing information (output of current line breaking, input to next line).
2. Decouple partial overflowing width (see above) and the "let's not measure the wrapped content again on the next line as leading content" cached value.

* layout/formattingContexts/inline/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::lineLayout):
* layout/formattingContexts/inline/InlineLineBuilder.cpp:
(WebCore::Layout::LineBuilder::layoutInlineContent):
(WebCore::Layout::LineBuilder::initialize):
* layout/formattingContexts/inline/InlineLineBuilder.h:
(WebCore::Layout::LineBuilder::PartialContent::PartialContent):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (293644 => 293645)


--- trunk/Source/WebCore/ChangeLog	2022-04-30 13:01:57 UTC (rev 293644)
+++ trunk/Source/WebCore/ChangeLog	2022-04-30 13:11:23 UTC (rev 293645)
@@ -1,5 +1,25 @@
 2022-04-30  Alan Bujtas  <za...@apple.com>
 
+        [LFC][IFC] Introduce LineBuilder::PartialContent
+        https://bugs.webkit.org/show_bug.cgi?id=239886
+
+        Reviewed by Antti Koivisto.
+
+        This patch is in preparation for adding partial content support for intrinsic width computation.
+
+        1. Use a dedicated PartialContent structure to store partial overflowing information (output of current line breaking, input to next line).
+        2. Decouple partial overflowing width (see above) and the "let's not measure the wrapped content again on the next line as leading content" cached value.
+
+        * layout/formattingContexts/inline/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::lineLayout):
+        * layout/formattingContexts/inline/InlineLineBuilder.cpp:
+        (WebCore::Layout::LineBuilder::layoutInlineContent):
+        (WebCore::Layout::LineBuilder::initialize):
+        * layout/formattingContexts/inline/InlineLineBuilder.h:
+        (WebCore::Layout::LineBuilder::PartialContent::PartialContent):
+
+2022-04-30  Alan Bujtas  <za...@apple.com>
+
         [LFC][IFC] Do not wrap </span> to the next line when it is preceded by overflowing text
         https://bugs.webkit.org/show_bug.cgi?id=239879
         <rdar://problem/92497176>

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2022-04-30 13:01:57 UTC (rev 293644)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2022-04-30 13:11:23 UTC (rev 293645)
@@ -227,11 +227,11 @@
                 formattingState.setClearGapAfterLastLine(lineLogicalTop - lineLogicalRect.bottom());
             }
             // When the trailing content is partial, we need to reuse the last InlineTextItem.
-            auto lastInlineItemNeedsPartialLayout = lineContent.partialTrailingContentLength;
+            auto lastInlineItemNeedsPartialLayout = lineContent.partialOverflowingContent.has_value();
             if (lastInlineItemNeedsPartialLayout) {
                 auto lineLayoutHasAdvanced = !previousLine
                     || lineContentRange.end > previousLine->range.end
-                    || (previousLine->overflowContent && previousLine->overflowContent->partialContentLength > lineContent.partialTrailingContentLength);
+                    || (previousLine->partialOverflowingContent && previousLine->partialOverflowingContent->length > lineContent.partialOverflowingContent->length);
                 if (!lineLayoutHasAdvanced) {
                     ASSERT_NOT_REACHED();
                     // Move over to the next run if we are stuck on this partial content (when the overflow content length remains the same).
@@ -240,12 +240,7 @@
                 }
             }
             needsLayoutRange.start = lastInlineItemNeedsPartialLayout ? lineContentRange.end - 1 : lineContentRange.end;
-            auto overflowContent = std::optional<LineBuilder::PreviousLine::OverflowContent> { };
-            if (lineContent.partialTrailingContentLength)
-                overflowContent = { lineContent.partialTrailingContentLength, lineContent.overflowLogicalWidth };
-            else if (lineContent.overflowLogicalWidth)
-                overflowContent = { { }, *lineContent.overflowLogicalWidth };
-            previousLine = LineBuilder::PreviousLine { lineContentRange, !lineContent.runs.isEmpty() && lineContent.runs.last().isLineBreak(), lineContent.inlineBaseDirection, overflowContent };
+            previousLine = LineBuilder::PreviousLine { lineContentRange, !lineContent.runs.isEmpty() && lineContent.runs.last().isLineBreak(), lineContent.inlineBaseDirection, lineContent.partialOverflowingContent, lineContent.trailingOverflowingContentWidth };
             continue;
         }
         // Floats prevented us placing any content on the line.

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp (293644 => 293645)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp	2022-04-30 13:01:57 UTC (rev 293644)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp	2022-04-30 13:11:23 UTC (rev 293645)
@@ -378,9 +378,10 @@
     };
 
     auto isLastLine = isLastLineWithInlineContent(committedRange, needsLayoutRange.end, committedContent.partialTrailingContentLength);
+    auto partialOverflowingContent = committedContent.partialTrailingContentLength ? std::make_optional<PartialContent>(committedContent.partialTrailingContentLength, committedContent.overflowLogicalWidth) : std::nullopt;
     return LineContent { committedRange
-        , committedContent.partialTrailingContentLength
-        , committedContent.overflowLogicalWidth
+        , partialOverflowingContent
+        , partialOverflowingContent ? std::nullopt : committedContent.overflowLogicalWidth
         , m_floats
         , m_contentIsConstrainedByFloat
         , m_lineMarginStart
@@ -459,13 +460,14 @@
     m_lineLogicalRect.expandHorizontally(-m_lineMarginStart);
     m_contentIsConstrainedByFloat = lineConstraints.isConstrainedByFloat;
 
-    if (previousLine && previousLine->overflowContent) {
-        if (previousLine->overflowContent->partialContentLength) {
+    if (previousLine) {
+        if (previousLine->partialOverflowingContent) {
             // Turn previous line's overflow content length into the next line's leading content partial length.
             // "sp[<-line break->]lit_content" -> overflow length: 11 -> leading partial content length: 11.
-            m_partialLeadingTextItem = downcast<InlineTextItem>(m_inlineItems[leadingInlineItemIndex]).right(previousLine->overflowContent->partialContentLength, previousLine->overflowContent->width);
-        } else
-            m_overflowingLogicalWidth = previousLine->overflowContent->width;
+            m_partialLeadingTextItem = downcast<InlineTextItem>(m_inlineItems[leadingInlineItemIndex]).right(previousLine->partialOverflowingContent->length, previousLine->partialOverflowingContent->width);
+            ASSERT(!previousLine->trailingOverflowingContentWidth);
+        }
+        m_overflowingLogicalWidth = previousLine->trailingOverflowingContentWidth;
     }
 }
 

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h (293644 => 293645)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h	2022-04-30 13:01:57 UTC (rev 293644)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h	2022-04-30 13:11:23 UTC (rev 293645)
@@ -50,21 +50,25 @@
         size_t start { 0 };
         size_t end { 0 };
     };
+    struct PartialContent {
+        PartialContent(size_t, std::optional<InlineLayoutUnit>);
+
+        size_t length { 0 };
+        std::optional<InlineLayoutUnit> width { };
+    };
     struct PreviousLine {
         InlineItemRange range;
         bool endsWithLineBreak { false };
         TextDirection inlineBaseDirection { TextDirection::LTR };
-        struct OverflowContent {
-            size_t partialContentLength { 0 };
-            std::optional<InlineLayoutUnit> width { };
-        };
-        std::optional<OverflowContent> overflowContent { };
+        std::optional<PartialContent> partialOverflowingContent { };
+        // Content width measured during line breaking (avoid double-measuring).
+        std::optional<InlineLayoutUnit> trailingOverflowingContentWidth;
     };
     using FloatList = Vector<const Box*>;
     struct LineContent {
         InlineItemRange inlineItemRange;
-        size_t partialTrailingContentLength { 0 };
-        std::optional<InlineLayoutUnit> overflowLogicalWidth;
+        std::optional<PartialContent> partialOverflowingContent { };
+        std::optional<InlineLayoutUnit> trailingOverflowingContentWidth;
         const FloatList& floats;
         bool hasIntrusiveFloat { false };
         InlineLayoutUnit lineMarginStart { 0 };
@@ -155,6 +159,12 @@
     bool m_contentIsConstrainedByFloat { false };
 };
 
+inline LineBuilder::PartialContent::PartialContent(size_t length, std::optional<InlineLayoutUnit> width)
+    : length(length)
+    , width(width)
+{
 }
+
 }
+}
 #endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to