⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286099 in webkit


Ignore:
Timestamp:
Nov 21, 2021, 8:51:11 AM (5 years ago)
Author:
Alan Bujtas
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.

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286096 r286099  
     12021-11-21  Alan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Introduce canCacheMeasuredWidthOnInlineTextItem
     4        https://bugs.webkit.org/show_bug.cgi?id=233399
     5
     6        Reviewed by Antti Koivisto.
     7
     8        This patch is in preparation for decoupling simplified text measuring and measured width caching.
     9        (Caching should solely be position and (maybe) context dependent.)
     10
     11        * layout/formattingContexts/inline/InlineItemsBuilder.cpp:
     12        (WebCore::Layout::canCacheMeasuredWidthOnInlineTextItem const):
     13        (WebCore::Layout::InlineItemsBuilder::handleTextContent):
     14        * layout/formattingContexts/inline/text/TextUtil.cpp:
     15        (WebCore::Layout::TextUtil::canUseSimplifiedTextMeasuringForFirstLine): Deleted.
     16        * layout/formattingContexts/inline/text/TextUtil.h:
     17        * layout/integration/LayoutIntegrationBoxTree.cpp:
     18        (WebCore::LayoutIntegration::BoxTree::buildTree): whitespace is not part of the first-line style set.
     19
    1202021-11-20  Alan Bujtas  <zalan@apple.com>
    221
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp

    r285807 r286099  
    350350}
    351351
     352static inline bool canCacheMeasuredWidthOnInlineTextItem(const InlineTextBox& inlineTextBox)
     353{
     354    // FIXME: Disable width caching for position dependent content only.
     355    if (!inlineTextBox.canUseSimplifiedContentMeasuring())
     356        return false;
     357    return inlineTextBox.style().fontCascade() == inlineTextBox.firstLineStyle().fontCascade();
     358}
     359
    352360void InlineItemsBuilder::handleTextContent(const InlineTextBox& inlineTextBox, InlineItems& inlineItems)
    353361{
     
    369377    unsigned currentPosition = 0;
    370378
    371     auto inlineItemWidth = [&](auto startPosition, auto length) -> std::optional<InlineLayoutUnit> {
    372         if (hasSeenBidiContent()) {
    373             // Delay content measuring until bidi split.
    374             return { };
    375         }
    376         if (!inlineTextBox.canUseSimplifiedContentMeasuring()
    377             || !TextUtil::canUseSimplifiedTextMeasuringForFirstLine(inlineTextBox.style(), inlineTextBox.firstLineStyle()))
     379    auto textWidth = [&](auto startPosition, auto length) -> std::optional<InlineLayoutUnit> {
     380        // Delay content measuring until after bidi split.
     381        if (hasSeenBidiContent() || !canCacheMeasuredWidthOnInlineTextItem(inlineTextBox))
    378382            return { };
    379383        return TextUtil::width(inlineTextBox, fontCascade, startPosition, startPosition + length, { });
     
    401405            auto appendWhitespaceItem = [&] (auto startPosition, auto itemLength) {
    402406                auto simpleSingleWhitespaceContent = inlineTextBox.canUseSimplifiedContentMeasuring() && (itemLength == 1 || whitespaceContentIsTreatedAsSingleSpace);
    403                 auto width = simpleSingleWhitespaceContent ? std::make_optional(InlineLayoutUnit { fontCascade.spaceWidth() }) : inlineItemWidth(startPosition, itemLength);
     407                auto width = simpleSingleWhitespaceContent ? std::make_optional(InlineLayoutUnit { fontCascade.spaceWidth() }) : textWidth(startPosition, itemLength);
    404408                inlineItems.append(InlineTextItem::createWhitespaceItem(inlineTextBox, startPosition, itemLength, UBIDI_DEFAULT_LTR, whitespaceContent->isWordSeparator, width));
    405409            };
     
    435439            ASSERT_IMPLIES(style.hyphens() == Hyphens::None, !hasTrailingSoftHyphen);
    436440            auto inlineItemLength = endPosition - startPosition;
    437             inlineItems.append(InlineTextItem::createNonWhitespaceItem(inlineTextBox, startPosition, inlineItemLength, UBIDI_DEFAULT_LTR, hasTrailingSoftHyphen, inlineItemWidth(startPosition, inlineItemLength)));
     441            inlineItems.append(InlineTextItem::createNonWhitespaceItem(inlineTextBox, startPosition, inlineItemLength, UBIDI_DEFAULT_LTR, hasTrailingSoftHyphen, textWidth(startPosition, inlineItemLength)));
    438442            currentPosition = endPosition;
    439443
  • trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp

    r285807 r286099  
    247247}
    248248
    249 bool TextUtil::canUseSimplifiedTextMeasuringForFirstLine(const RenderStyle& style, const RenderStyle& firstLineStyle)
    250 {
    251     return style.collapseWhiteSpace() == firstLineStyle.collapseWhiteSpace() && style.fontCascade() == firstLineStyle.fontCascade();
    252 }
    253 
    254249bool TextUtil::containsBidiText(StringView text)
    255250{
  • trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h

    r285807 r286099  
    6363    static bool shouldPreserveSpacesAndTabs(const Box&);
    6464    static bool shouldPreserveNewline(const Box&);
    65     static bool canUseSimplifiedTextMeasuringForFirstLine(const RenderStyle&, const RenderStyle& firstLineStyle);
    6665    static bool isWrappingAllowed(const RenderStyle&);
    6766    static bool containsBidiText(StringView);
  • trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp

    r285807 r286099  
    9393            auto& textRenderer = downcast<RenderText>(childRenderer);
    9494            auto style = RenderStyle::createAnonymousStyleWithDisplay(textRenderer.style(), DisplayType::Inline);
    95             auto canUseSimplifiedTextMeasuring = [&] {
    96                 if (!textRenderer.canUseSimplifiedTextMeasuring())
    97                     return false;
    98                 return !firstLineStyle || Layout::TextUtil::canUseSimplifiedTextMeasuringForFirstLine(style, *firstLineStyle);
    99             }();
    10095            auto text = style.textSecurity() == TextSecurity::None ? textRenderer.text() : RenderBlock::updateSecurityDiscCharacters(style, textRenderer.text());
    10196            auto containsBidiText = Layout::TextUtil::containsBidiText(text);
    10297            if (containsBidiText)
    10398                textRenderer.setContainsBidiText();
    104 
    105             return makeUnique<Layout::InlineTextBox>(text, canUseSimplifiedTextMeasuring, containsBidiText, WTFMove(style), WTFMove(firstLineStyle));
     99            auto useSimplifiedTextMeasuring = textRenderer.canUseSimplifiedTextMeasuring() && (!firstLineStyle || firstLineStyle->fontCascade() == style.fontCascade());
     100            return makeUnique<Layout::InlineTextBox>(text, useSimplifiedTextMeasuring, containsBidiText, WTFMove(style), WTFMove(firstLineStyle));
    106101        }
    107102
Note: See TracChangeset for help on using the changeset viewer.