Title: [274700] trunk/Source/WebCore
Revision
274700
Author
[email protected]
Date
2021-03-18 21:21:36 -0700 (Thu, 18 Mar 2021)

Log Message

Add a fast path for subdivideAndResolveStyle()
https://bugs.webkit.org/show_bug.cgi?id=223480

Reviewed by Myles Maxfield.

Most of the time, InlineTextBox::paint() will be painting text runs with no marked text,
so optimize subdivideAndResolveStyle() for this case.

This removes 1.6% of the time in painting in the MotionMark Design subtest.

* rendering/MarkedTextStyle.cpp:
(WebCore::subdivideAndResolveStyle):
(WebCore::coalesceAdjacentMarkedTexts): No need to do any work if there are zero or one
ranges.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (274699 => 274700)


--- trunk/Source/WebCore/ChangeLog	2021-03-19 04:20:11 UTC (rev 274699)
+++ trunk/Source/WebCore/ChangeLog	2021-03-19 04:21:36 UTC (rev 274700)
@@ -1,3 +1,20 @@
+2021-03-18  Simon Fraser  <[email protected]>
+
+        Add a fast path for subdivideAndResolveStyle()
+        https://bugs.webkit.org/show_bug.cgi?id=223480
+
+        Reviewed by Myles Maxfield.
+
+        Most of the time, InlineTextBox::paint() will be painting text runs with no marked text,
+        so optimize subdivideAndResolveStyle() for this case.
+
+        This removes 1.6% of the time in painting in the MotionMark Design subtest.
+
+        * rendering/MarkedTextStyle.cpp:
+        (WebCore::subdivideAndResolveStyle):
+        (WebCore::coalesceAdjacentMarkedTexts): No need to do any work if there are zero or one
+        ranges.
+
 2021-03-18  Aditya Keerthi  <[email protected]>
 
         [iOS] Update strings and icons in the file upload panel

Modified: trunk/Source/WebCore/rendering/MarkedTextStyle.cpp (274699 => 274700)


--- trunk/Source/WebCore/rendering/MarkedTextStyle.cpp	2021-03-19 04:20:11 UTC (rev 274699)
+++ trunk/Source/WebCore/rendering/MarkedTextStyle.cpp	2021-03-19 04:21:36 UTC (rev 274700)
@@ -120,16 +120,23 @@
     if (textsToSubdivide.isEmpty())
         return { };
 
+    Vector<StyledMarkedText> frontmostMarkedTexts;
+
+    auto& lineStyle = isFirstLine ? renderer.firstLineStyle() : renderer.style();
+    auto baseStyle = computeStyleForUnmarkedMarkedText(renderer, lineStyle, isFirstLine, paintInfo);
+
+    if (textsToSubdivide.size() == 1 && textsToSubdivide[0].type == MarkedText::Unmarked) {
+        StyledMarkedText styledMarkedText = textsToSubdivide[0];
+        styledMarkedText.style = WTFMove(baseStyle);
+        return { styledMarkedText };
+    }
+
     auto markedTexts = subdivide(textsToSubdivide);
     ASSERT(!markedTexts.isEmpty());
     if (UNLIKELY(markedTexts.isEmpty()))
         return { };
 
-    auto& lineStyle = isFirstLine ? renderer.firstLineStyle() : renderer.style();
-    auto baseStyle = computeStyleForUnmarkedMarkedText(renderer, lineStyle, isFirstLine, paintInfo);
-
     // Compute frontmost overlapping styled marked texts.
-    Vector<StyledMarkedText> frontmostMarkedTexts;
     frontmostMarkedTexts.reserveInitialCapacity(markedTexts.size());
     frontmostMarkedTexts.uncheckedAppend(resolveStyleForMarkedText(markedTexts[0], baseStyle, renderer, lineStyle, paintInfo));
     for (auto it = markedTexts.begin() + 1, end = markedTexts.end(); it != end; ++it) {
@@ -147,8 +154,8 @@
 
 Vector<StyledMarkedText> coalesceAdjacentMarkedTexts(const Vector<StyledMarkedText>& textsToCoalesce, MarkedTextStylesEqualityFunction areMarkedTextStylesEqual)
 {
-    if (textsToCoalesce.isEmpty())
-        return { };
+    if (textsToCoalesce.size() <= 1)
+        return textsToCoalesce;
 
     auto areAdjacentMarkedTextsWithSameStyle = [&] (const StyledMarkedText& a, const StyledMarkedText& b) {
         return a.endOffset == b.startOffset && areMarkedTextStylesEqual(a.style, b.style);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to