Skip to content

Commit

Permalink
[IFC] Cache canUseSimplifiedTextMeasuring on RenderText
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=260426

Reviewed by Antti Koivisto.

1. Computing canUseSimplifiedTextMeasuring is an expensive operation (it may iterate through all the glyphs of the text content)
2. We used to cache this information on RenderText (see 260675@main) and now it's computed at BoxTree building.
3. Due to eager (IFC integration) invalidation, we destroy BoxTree in cases where we still keep associated RenderText renderers alive.

~10% progression on PerformanceTests/Layout/line-layout-preferred-width-break-all.html

* PerformanceTests/Layout/line-layout.html:
* Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp:
(WebCore::LayoutIntegration::BoxTree::createLayoutBox):
* Source/WebCore/rendering/RenderText.cpp:
(WebCore::RenderText::setRenderedText):
* Source/WebCore/rendering/RenderText.h:
(WebCore::RenderText::setCanUseSimplifiedTextMeasuring):
(WebCore::RenderText::canUseSimplifiedTextMeasuring const):

Canonical link: https://commits.webkit.org/267081@main
  • Loading branch information
alanbaradlay committed Aug 21, 2023
1 parent cf8be61 commit 8f6d89b
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,12 @@ UniqueRef<Layout::Box> BoxTree::createLayoutBox(RenderObject& renderer)
? (isCombinedText ? textRenderer.originalText() : textRenderer.text())
: RenderBlock::updateSecurityDiscCharacters(style, isCombinedText ? textRenderer.originalText() : textRenderer.text());
auto canUseSimpleFontCodePath = textRenderer.canUseSimpleFontCodePath();
auto canUseSimplifiedTextMeasuring = canUseSimpleFontCodePath && Layout::TextUtil::canUseSimplifiedTextMeasuring(text, style, firstLineStyle.get());
return makeUniqueRef<Layout::InlineTextBox>(text, isCombinedText, canUseSimplifiedTextMeasuring, canUseSimpleFontCodePath, WTFMove(style), WTFMove(firstLineStyle));
auto canUseSimplifiedTextMeasuring = textRenderer.canUseSimplifiedTextMeasuring();
if (!canUseSimplifiedTextMeasuring) {
canUseSimplifiedTextMeasuring = canUseSimpleFontCodePath && Layout::TextUtil::canUseSimplifiedTextMeasuring(text, style, firstLineStyle.get());
textRenderer.setCanUseSimplifiedTextMeasuring(*canUseSimplifiedTextMeasuring);
}
return makeUniqueRef<Layout::InlineTextBox>(text, isCombinedText, *canUseSimplifiedTextMeasuring, canUseSimpleFontCodePath, WTFMove(style), WTFMove(firstLineStyle));
}

auto& renderElement = downcast<RenderElement>(renderer);
Expand Down
6 changes: 5 additions & 1 deletion Source/WebCore/rendering/RenderText.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ struct SameSizeAsRenderText : public RenderObject {
float widths[2];
std::optional<float> minWidth;
std::optional<float> maxWidth;
std::optional<bool> canUseSimplifiedTextMeasuring;
String text;
};

Expand Down Expand Up @@ -328,6 +329,8 @@ void RenderText::styleDidChange(StyleDifference diff, const RenderStyle* oldStyl
const RenderStyle& newStyle = style();
if (!oldStyle)
initiateFontLoadingByAccessingGlyphDataIfApplicable(m_text, newStyle.fontCascade());
if (oldStyle && oldStyle->fontCascade() != newStyle.fontCascade())
m_canUseSimplifiedTextMeasuring = { };

bool needsResetText = false;
if (!oldStyle) {
Expand Down Expand Up @@ -1583,7 +1586,8 @@ void RenderText::setRenderedText(const String& newText)

m_containsOnlyASCII = text().containsOnlyASCII();
m_canUseSimpleFontCodePath = computeCanUseSimpleFontCodePath();

m_canUseSimplifiedTextMeasuring = { };

if (m_text != originalText) {
originalTextMap().set(this, originalText);
m_originalTextDiffersFromRendered = true;
Expand Down
4 changes: 4 additions & 0 deletions Source/WebCore/rendering/RenderText.h
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,9 @@ class RenderText : public RenderObject {

void resetMinMaxWidth();

void setCanUseSimplifiedTextMeasuring(bool canUseSimplifiedTextMeasuring) { m_canUseSimplifiedTextMeasuring = canUseSimplifiedTextMeasuring; }
std::optional<bool> canUseSimplifiedTextMeasuring() const { return m_canUseSimplifiedTextMeasuring; }

protected:
virtual void computePreferredLogicalWidths(float leadWidth, bool forcedMinMaxWidthComputation = false);
void willBeDestroyed() override;
Expand Down Expand Up @@ -252,6 +255,7 @@ class RenderText : public RenderObject {
#endif
std::optional<float> m_minWidth;
std::optional<float> m_maxWidth;
std::optional<bool> m_canUseSimplifiedTextMeasuring { };
float m_beginMinWidth { 0 };
float m_endMinWidth { 0 };

Expand Down

0 comments on commit 8f6d89b

Please sign in to comment.