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