Title: [294128] trunk/Source/WebCore
Revision
294128
Author
za...@apple.com
Date
2022-05-12 17:31:33 -0700 (Thu, 12 May 2022)

Log Message

TextBoxPainter::paintForeground: painting text with no marking/decoration should be simple
https://bugs.webkit.org/show_bug.cgi?id=240319

Reviewed by Simon Fraser.

Let's have a fast codepath for regular, simple text painting.

* rendering/StyledMarkedText.cpp:
(WebCore::StyledMarkedText::computeStyleForUnmarkedMarkedText):
(WebCore::computeStyleForUnmarkedMarkedText): Deleted.
* rendering/StyledMarkedText.h:
(WebCore::StyledMarkedText::StyledMarkedText):
(WebCore::StyledMarkedText::style):
* rendering/TextBoxPainter.cpp:
(WebCore::TextBoxPainter::paintBackground):
(WebCore::TextBoxPainter::paintForegroundAndDecorations):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (294127 => 294128)


--- trunk/Source/WebCore/ChangeLog	2022-05-13 00:05:53 UTC (rev 294127)
+++ trunk/Source/WebCore/ChangeLog	2022-05-13 00:31:33 UTC (rev 294128)
@@ -1,3 +1,22 @@
+2022-05-12  Alan Bujtas  <za...@apple.com>
+
+        TextBoxPainter::paintForeground: painting text with no marking/decoration should be simple
+        https://bugs.webkit.org/show_bug.cgi?id=240319
+
+        Reviewed by Simon Fraser.
+
+        Let's have a fast codepath for regular, simple text painting.
+
+        * rendering/StyledMarkedText.cpp:
+        (WebCore::StyledMarkedText::computeStyleForUnmarkedMarkedText):
+        (WebCore::computeStyleForUnmarkedMarkedText): Deleted.
+        * rendering/StyledMarkedText.h:
+        (WebCore::StyledMarkedText::StyledMarkedText):
+        (WebCore::StyledMarkedText::style):
+        * rendering/TextBoxPainter.cpp:
+        (WebCore::TextBoxPainter::paintBackground):
+        (WebCore::TextBoxPainter::paintForegroundAndDecorations):
+
 2022-05-12  Sihui Liu  <sihui_...@apple.com>
 
         StorageMap::removeItem may fail to remove item from map

Modified: trunk/Source/WebCore/rendering/StyledMarkedText.cpp (294127 => 294128)


--- trunk/Source/WebCore/rendering/StyledMarkedText.cpp	2022-05-13 00:05:53 UTC (rev 294127)
+++ trunk/Source/WebCore/rendering/StyledMarkedText.cpp	2022-05-13 00:31:33 UTC (rev 294128)
@@ -110,7 +110,7 @@
     return styledMarkedText;
 }
 
-static StyledMarkedText::Style computeStyleForUnmarkedMarkedText(const RenderText& renderer, const RenderStyle& lineStyle, bool isFirstLine, const PaintInfo& paintInfo)
+StyledMarkedText::Style StyledMarkedText::computeStyleForUnmarkedMarkedText(const RenderText& renderer, const RenderStyle& lineStyle, bool isFirstLine, const PaintInfo& paintInfo)
 {
     StyledMarkedText::Style style;
     style.textDecorationStyles = TextDecorationPainter::stylesForRenderer(renderer, lineStyle.textDecorationsInEffect(), isFirstLine);

Modified: trunk/Source/WebCore/rendering/StyledMarkedText.h (294127 => 294128)


--- trunk/Source/WebCore/rendering/StyledMarkedText.h	2022-05-13 00:05:53 UTC (rev 294127)
+++ trunk/Source/WebCore/rendering/StyledMarkedText.h	2022-05-13 00:31:33 UTC (rev 294128)
@@ -36,11 +36,6 @@
 class RenderedDocumentMarker;
 
 struct StyledMarkedText : MarkedText {
-    StyledMarkedText(const MarkedText& marker)
-        : MarkedText { marker }
-    {
-    }
-
     struct Style {
         Color backgroundColor;
         TextPaintStyle textStyles;
@@ -49,6 +44,17 @@
         float alpha { 1 };
     };
 
+    StyledMarkedText(const MarkedText& marker)
+        : MarkedText { marker }
+    {
+    }
+
+    StyledMarkedText(const MarkedText& marker, Style style)
+        : MarkedText { marker }
+        , style(style)
+    {
+    }
+
     Style style;
 
     static Vector<StyledMarkedText> subdivideAndResolve(const Vector<MarkedText>&, const RenderText&, bool isFirstLine, const PaintInfo&);
@@ -55,6 +61,7 @@
     static Vector<StyledMarkedText> coalesceAdjacentWithEqualBackground(const Vector<StyledMarkedText>&);
     static Vector<StyledMarkedText> coalesceAdjacentWithEqualForeground(const Vector<StyledMarkedText>&);
     static Vector<StyledMarkedText> coalesceAdjacentWithEqualDecorations(const Vector<StyledMarkedText>&);
+    static Style computeStyleForUnmarkedMarkedText(const RenderText&, const RenderStyle&, bool isFirstLine, const PaintInfo&);
 };
 
 }

Modified: trunk/Source/WebCore/rendering/TextBoxPainter.cpp (294127 => 294128)


--- trunk/Source/WebCore/rendering/TextBoxPainter.cpp	2022-05-13 00:05:53 UTC (rev 294127)
+++ trunk/Source/WebCore/rendering/TextBoxPainter.cpp	2022-05-13 00:31:33 UTC (rev 294128)
@@ -171,7 +171,29 @@
 
 void TextBoxPainter::paintForegroundAndDecorations()
 {
-    bool shouldPaintSelectionForeground = m_haveSelection && !m_useCustomUnderlines;
+    auto shouldPaintSelectionForeground = m_haveSelection && !m_useCustomUnderlines;
+    auto hasTextDecoration = !m_style.textDecorationsInEffect().isEmpty();
+    auto hasHighlightDecoration = m_document.hasHighlight() && !MarkedText::collectForHighlights(m_renderer, m_selectableRange, MarkedText::PaintPhase::Decoration).isEmpty();
+    auto hasDecoration = hasTextDecoration || hasHighlightDecoration;
+
+    auto contentMayNeedStyledMarkedText = [&] {
+        if (hasDecoration)
+            return true;
+        if (shouldPaintSelectionForeground)
+            return true;
+        if (m_document.markers().hasMarkers())
+            return true;
+        if (m_document.hasHighlight())
+            return true;
+        return false;
+    };
+    if (!contentMayNeedStyledMarkedText()) {
+        auto& lineStyle = m_isFirstLine ? m_renderer.firstLineStyle() : m_renderer.style();
+        paintForeground({ MarkedText { m_selectableRange.clamp(textBox().start()), m_selectableRange.clamp(textBox().end()), MarkedText::Unmarked },
+            StyledMarkedText::computeStyleForUnmarkedMarkedText(m_renderer, lineStyle, m_isFirstLine, m_paintInfo) });
+        return;
+    }
+
     Vector<MarkedText> markedTexts;
     if (m_paintInfo.phase != PaintPhase::Selection) {
         // The marked texts for the gaps between document markers and selection are implicitly created by subdividing the entire line.
@@ -208,10 +230,7 @@
         });
     }
 
-    auto textDecorations = m_style.textDecorationsInEffect();
-    bool highlightDecorations = !MarkedText::collectForHighlights(m_renderer, m_selectableRange, MarkedText::PaintPhase::Decoration).isEmpty();
-    bool lineDecorations = !textDecorations.isEmpty();
-    if ((lineDecorations || highlightDecorations) && m_paintInfo.phase != PaintPhase::Selection) {
+    if (hasDecoration && m_paintInfo.phase != PaintPhase::Selection) {
         TextRun textRun = textBox().createTextRun();
         unsigned length = m_selectableRange.truncation.value_or(textRun.length());
         unsigned selectionStart = 0;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to