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());