Changeset 286099 in webkit
- Timestamp:
- Nov 21, 2021, 8:51:11 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
-
ChangeLog (modified) (1 diff)
-
layout/formattingContexts/inline/InlineItemsBuilder.cpp (modified) (4 diffs)
-
layout/formattingContexts/inline/text/TextUtil.cpp (modified) (1 diff)
-
layout/formattingContexts/inline/text/TextUtil.h (modified) (1 diff)
-
layout/integration/LayoutIntegrationBoxTree.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r286096 r286099 1 2021-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 1 20 2021-11-20 Alan Bujtas <zalan@apple.com> 2 21 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp
r285807 r286099 350 350 } 351 351 352 static 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 352 360 void InlineItemsBuilder::handleTextContent(const InlineTextBox& inlineTextBox, InlineItems& inlineItems) 353 361 { … … 369 377 unsigned currentPosition = 0; 370 378 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)) 378 382 return { }; 379 383 return TextUtil::width(inlineTextBox, fontCascade, startPosition, startPosition + length, { }); … … 401 405 auto appendWhitespaceItem = [&] (auto startPosition, auto itemLength) { 402 406 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); 404 408 inlineItems.append(InlineTextItem::createWhitespaceItem(inlineTextBox, startPosition, itemLength, UBIDI_DEFAULT_LTR, whitespaceContent->isWordSeparator, width)); 405 409 }; … … 435 439 ASSERT_IMPLIES(style.hyphens() == Hyphens::None, !hasTrailingSoftHyphen); 436 440 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))); 438 442 currentPosition = endPosition; 439 443 -
trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp
r285807 r286099 247 247 } 248 248 249 bool TextUtil::canUseSimplifiedTextMeasuringForFirstLine(const RenderStyle& style, const RenderStyle& firstLineStyle)250 {251 return style.collapseWhiteSpace() == firstLineStyle.collapseWhiteSpace() && style.fontCascade() == firstLineStyle.fontCascade();252 }253 254 249 bool TextUtil::containsBidiText(StringView text) 255 250 { -
trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h
r285807 r286099 63 63 static bool shouldPreserveSpacesAndTabs(const Box&); 64 64 static bool shouldPreserveNewline(const Box&); 65 static bool canUseSimplifiedTextMeasuringForFirstLine(const RenderStyle&, const RenderStyle& firstLineStyle);66 65 static bool isWrappingAllowed(const RenderStyle&); 67 66 static bool containsBidiText(StringView); -
trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp
r285807 r286099 93 93 auto& textRenderer = downcast<RenderText>(childRenderer); 94 94 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 }();100 95 auto text = style.textSecurity() == TextSecurity::None ? textRenderer.text() : RenderBlock::updateSecurityDiscCharacters(style, textRenderer.text()); 101 96 auto containsBidiText = Layout::TextUtil::containsBidiText(text); 102 97 if (containsBidiText) 103 98 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)); 106 101 } 107 102
Note:
See TracChangeset
for help on using the changeset viewer.