Title: [286099] trunk/Source/WebCore
Revision
286099
Author
za...@apple.com
Date
2021-11-21 08:51:11 -0800 (Sun, 21 Nov 2021)

Log Message

[LFC][IFC] Introduce canCacheMeasuredWidthOnInlineTextItem
https://bugs.webkit.org/show_bug.cgi?id=233399

Reviewed by Antti Koivisto.

This patch is in preparation for decoupling simplified text measuring and measured width caching.
(Caching should solely be position and (maybe) context dependent.)

* layout/formattingContexts/inline/InlineItemsBuilder.cpp:
(WebCore::Layout::canCacheMeasuredWidthOnInlineTextItem const):
(WebCore::Layout::InlineItemsBuilder::handleTextContent):
* layout/formattingContexts/inline/text/TextUtil.cpp:
(WebCore::Layout::TextUtil::canUseSimplifiedTextMeasuringForFirstLine): Deleted.
* layout/formattingContexts/inline/text/TextUtil.h:
* layout/integration/LayoutIntegrationBoxTree.cpp:
(WebCore::LayoutIntegration::BoxTree::buildTree): whitespace is not part of the first-line style set.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (286098 => 286099)


--- trunk/Source/WebCore/ChangeLog	2021-11-21 00:03:54 UTC (rev 286098)
+++ trunk/Source/WebCore/ChangeLog	2021-11-21 16:51:11 UTC (rev 286099)
@@ -1,3 +1,22 @@
+2021-11-21  Alan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] Introduce canCacheMeasuredWidthOnInlineTextItem
+        https://bugs.webkit.org/show_bug.cgi?id=233399
+
+        Reviewed by Antti Koivisto.
+
+        This patch is in preparation for decoupling simplified text measuring and measured width caching.
+        (Caching should solely be position and (maybe) context dependent.)
+
+        * layout/formattingContexts/inline/InlineItemsBuilder.cpp:
+        (WebCore::Layout::canCacheMeasuredWidthOnInlineTextItem const):
+        (WebCore::Layout::InlineItemsBuilder::handleTextContent):
+        * layout/formattingContexts/inline/text/TextUtil.cpp:
+        (WebCore::Layout::TextUtil::canUseSimplifiedTextMeasuringForFirstLine): Deleted.
+        * layout/formattingContexts/inline/text/TextUtil.h:
+        * layout/integration/LayoutIntegrationBoxTree.cpp:
+        (WebCore::LayoutIntegration::BoxTree::buildTree): whitespace is not part of the first-line style set.
+
 2021-11-20  Alan Bujtas  <za...@apple.com>
 
         [IFC][Integration] Initialize layout box geometries for preferred width computation

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp (286098 => 286099)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2021-11-21 00:03:54 UTC (rev 286098)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2021-11-21 16:51:11 UTC (rev 286099)
@@ -349,6 +349,14 @@
     setBidiLevelForOpaqueInlineItems();
 }
 
+static inline bool canCacheMeasuredWidthOnInlineTextItem(const InlineTextBox& inlineTextBox)
+{
+    // FIXME: Disable width caching for position dependent content only.
+    if (!inlineTextBox.canUseSimplifiedContentMeasuring())
+        return false;
+    return inlineTextBox.style().fontCascade() == inlineTextBox.firstLineStyle().fontCascade();
+}
+
 void InlineItemsBuilder::handleTextContent(const InlineTextBox& inlineTextBox, InlineItems& inlineItems)
 {
     auto text = inlineTextBox.content();
@@ -368,14 +376,10 @@
     auto lineBreakIterator = LazyLineBreakIterator { text, style.computedLocale(), TextUtil::lineBreakIteratorMode(style.lineBreak()) };
     unsigned currentPosition = 0;
 
-    auto inlineItemWidth = [&](auto startPosition, auto length) -> std::optional<InlineLayoutUnit> {
-        if (hasSeenBidiContent()) {
-            // Delay content measuring until bidi split.
+    auto textWidth = [&](auto startPosition, auto length) -> std::optional<InlineLayoutUnit> {
+        // Delay content measuring until after bidi split.
+        if (hasSeenBidiContent() || !canCacheMeasuredWidthOnInlineTextItem(inlineTextBox))
             return { };
-        }
-        if (!inlineTextBox.canUseSimplifiedContentMeasuring()
-            || !TextUtil::canUseSimplifiedTextMeasuringForFirstLine(inlineTextBox.style(), inlineTextBox.firstLineStyle()))
-            return { };
         return TextUtil::width(inlineTextBox, fontCascade, startPosition, startPosition + length, { });
     };
 
@@ -400,7 +404,7 @@
             ASSERT(whitespaceContent->length);
             auto appendWhitespaceItem = [&] (auto startPosition, auto itemLength) {
                 auto simpleSingleWhitespaceContent = inlineTextBox.canUseSimplifiedContentMeasuring() && (itemLength == 1 || whitespaceContentIsTreatedAsSingleSpace);
-                auto width = simpleSingleWhitespaceContent ? std::make_optional(InlineLayoutUnit { fontCascade.spaceWidth() }) : inlineItemWidth(startPosition, itemLength);
+                auto width = simpleSingleWhitespaceContent ? std::make_optional(InlineLayoutUnit { fontCascade.spaceWidth() }) : textWidth(startPosition, itemLength);
                 inlineItems.append(InlineTextItem::createWhitespaceItem(inlineTextBox, startPosition, itemLength, UBIDI_DEFAULT_LTR, whitespaceContent->isWordSeparator, width));
             };
             if (style.whiteSpace() == WhiteSpace::BreakSpaces) {
@@ -434,7 +438,7 @@
             }
             ASSERT_IMPLIES(style.hyphens() == Hyphens::None, !hasTrailingSoftHyphen);
             auto inlineItemLength = endPosition - startPosition;
-            inlineItems.append(InlineTextItem::createNonWhitespaceItem(inlineTextBox, startPosition, inlineItemLength, UBIDI_DEFAULT_LTR, hasTrailingSoftHyphen, inlineItemWidth(startPosition, inlineItemLength)));
+            inlineItems.append(InlineTextItem::createNonWhitespaceItem(inlineTextBox, startPosition, inlineItemLength, UBIDI_DEFAULT_LTR, hasTrailingSoftHyphen, textWidth(startPosition, inlineItemLength)));
             currentPosition = endPosition;
 
             return true;

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp (286098 => 286099)


--- trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp	2021-11-21 00:03:54 UTC (rev 286098)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp	2021-11-21 16:51:11 UTC (rev 286099)
@@ -246,11 +246,6 @@
     return LineBreakIteratorMode::Default;
 }
 
-bool TextUtil::canUseSimplifiedTextMeasuringForFirstLine(const RenderStyle& style, const RenderStyle& firstLineStyle)
-{
-    return style.collapseWhiteSpace() == firstLineStyle.collapseWhiteSpace() && style.fontCascade() == firstLineStyle.fontCascade();
-}
-
 bool TextUtil::containsBidiText(StringView text)
 {
     if (text.is8Bit())

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h (286098 => 286099)


--- trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h	2021-11-21 00:03:54 UTC (rev 286098)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h	2021-11-21 16:51:11 UTC (rev 286099)
@@ -62,7 +62,6 @@
 
     static bool shouldPreserveSpacesAndTabs(const Box&);
     static bool shouldPreserveNewline(const Box&);
-    static bool canUseSimplifiedTextMeasuringForFirstLine(const RenderStyle&, const RenderStyle& firstLineStyle);
     static bool isWrappingAllowed(const RenderStyle&);
     static bool containsBidiText(StringView);
 };

Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp (286098 => 286099)


--- trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp	2021-11-21 00:03:54 UTC (rev 286098)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp	2021-11-21 16:51:11 UTC (rev 286099)
@@ -92,17 +92,12 @@
         if (is<RenderText>(childRenderer)) {
             auto& textRenderer = downcast<RenderText>(childRenderer);
             auto style = RenderStyle::createAnonymousStyleWithDisplay(textRenderer.style(), DisplayType::Inline);
-            auto canUseSimplifiedTextMeasuring = [&] {
-                if (!textRenderer.canUseSimplifiedTextMeasuring())
-                    return false;
-                return !firstLineStyle || Layout::TextUtil::canUseSimplifiedTextMeasuringForFirstLine(style, *firstLineStyle);
-            }();
             auto text = style.textSecurity() == TextSecurity::None ? textRenderer.text() : RenderBlock::updateSecurityDiscCharacters(style, textRenderer.text());
             auto containsBidiText = Layout::TextUtil::containsBidiText(text);
             if (containsBidiText)
                 textRenderer.setContainsBidiText();
-
-            return makeUnique<Layout::InlineTextBox>(text, canUseSimplifiedTextMeasuring, containsBidiText, WTFMove(style), WTFMove(firstLineStyle));
+            auto useSimplifiedTextMeasuring = textRenderer.canUseSimplifiedTextMeasuring() && (!firstLineStyle || firstLineStyle->fontCascade() == style.fontCascade());
+            return makeUnique<Layout::InlineTextBox>(text, useSimplifiedTextMeasuring, containsBidiText, WTFMove(style), WTFMove(firstLineStyle));
         }
 
         auto style = RenderStyle::clone(childRenderer.style());
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to