Title: [252750] trunk/Source/WebCore
Revision
252750
Author
za...@apple.com
Date
2019-11-21 13:42:42 -0800 (Thu, 21 Nov 2019)

Log Message

[LFC][IFC] Cache trailing trimmable width.
https://bugs.webkit.org/show_bug.cgi?id=204466
<rdar://problem/57403888>

Reviewed by Antti Koivisto.

Line::trailingTrimmableWidth() is called every time we pass a run to the line breaker because their accumulated widths are part of the "available width context".

* layout/inlineformatting/InlineLine.cpp:
(WebCore::Layout::Line::removeTrailingTrimmableContent):
(WebCore::Layout::Line::appendTextContent):
(WebCore::Layout::Line::appendNonReplacedInlineBox):
(WebCore::Layout::Line::TrimmableContent::append):
(WebCore::Layout::Line::trailingTrimmableWidth const): Deleted.
* layout/inlineformatting/InlineLine.h:
(WebCore::Layout::Line::trailingTrimmableWidth const):
(WebCore::Layout::Line::TrimmableContent::width const):
(WebCore::Layout::Line::TrimmableContent::runs):
(WebCore::Layout::Line::TrimmableContent::isEmpty const):
(WebCore::Layout::Line::TrimmableContent::clear):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (252749 => 252750)


--- trunk/Source/WebCore/ChangeLog	2019-11-21 21:30:10 UTC (rev 252749)
+++ trunk/Source/WebCore/ChangeLog	2019-11-21 21:42:42 UTC (rev 252750)
@@ -1,3 +1,26 @@
+2019-11-21  Zalan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] Cache trailing trimmable width.
+        https://bugs.webkit.org/show_bug.cgi?id=204466
+        <rdar://problem/57403888>
+
+        Reviewed by Antti Koivisto.
+
+        Line::trailingTrimmableWidth() is called every time we pass a run to the line breaker because their accumulated widths are part of the "available width context".
+
+        * layout/inlineformatting/InlineLine.cpp:
+        (WebCore::Layout::Line::removeTrailingTrimmableContent):
+        (WebCore::Layout::Line::appendTextContent):
+        (WebCore::Layout::Line::appendNonReplacedInlineBox):
+        (WebCore::Layout::Line::TrimmableContent::append):
+        (WebCore::Layout::Line::trailingTrimmableWidth const): Deleted.
+        * layout/inlineformatting/InlineLine.h:
+        (WebCore::Layout::Line::trailingTrimmableWidth const):
+        (WebCore::Layout::Line::TrimmableContent::width const):
+        (WebCore::Layout::Line::TrimmableContent::runs):
+        (WebCore::Layout::Line::TrimmableContent::isEmpty const):
+        (WebCore::Layout::Line::TrimmableContent::clear):
+
 2019-11-21  Chris Fleizach  <cfleiz...@apple.com>
 
         AX: support more attributes for AXIsolatedTreeNode

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp (252749 => 252750)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-11-21 21:30:10 UTC (rev 252749)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-11-21 21:42:42 UTC (rev 252750)
@@ -426,16 +426,17 @@
 
 void Line::removeTrailingTrimmableContent()
 {
+    if (m_trimmableContent.isEmpty() || m_inlineItemRuns.isEmpty())
+        return;
+
     // Collapse trimmable trailing content
-    LayoutUnit trimmableWidth;
-    for (auto* trimmableRun : m_trimmableRuns) {
+    for (auto* trimmableRun : m_trimmableContent.runs()) {
         ASSERT(trimmableRun->isText());
         // FIXME: We might need to be able to differentiate between trimmed and collapsed runs.
-        trimmableWidth += trimmableRun->logicalRect().width();
         trimmableRun->setCollapsesToZeroAdvanceWidth();
     }
-    m_lineBox.shrinkHorizontally(trimmableWidth);
-    m_trimmableRuns.clear();
+    m_lineBox.shrinkHorizontally(m_trimmableContent.width());
+    m_trimmableContent.clear();
 }
 
 void Line::moveLogicalLeft(LayoutUnit delta)
@@ -453,14 +454,6 @@
     m_lineLogicalWidth -= delta;
 }
 
-LayoutUnit Line::trailingTrimmableWidth() const
-{
-    LayoutUnit trimmableWidth;
-    for (auto* trimmableRun : m_trimmableRuns)
-        trimmableWidth += trimmableRun->logicalRect().width();
-    return trimmableWidth;
-}
-
 void Line::append(const InlineItem& inlineItem, LayoutUnit logicalWidth)
 {
     if (inlineItem.isForcedLineBreak())
@@ -507,7 +500,7 @@
 {
     auto isTrimmable = !shouldPreserveTrailingContent(inlineItem);
     if (!isTrimmable)
-        m_trimmableRuns.clear();
+        m_trimmableContent.clear();
 
     auto willCollapseCompletely = [&] {
         // Empty run.
@@ -560,7 +553,7 @@
     if (collapsedRun)
         lineRun->setIsCollapsed();
     if (isTrimmable)
-        m_trimmableRuns.append(lineRun.get());
+        m_trimmableContent.append(*lineRun);
 
     m_lineBox.expandHorizontally(lineRun->logicalRect().width());
     m_inlineItemRuns.append(WTFMove(lineRun));
@@ -583,7 +576,7 @@
     m_inlineItemRuns.append(makeUnique<InlineItemRun>(inlineItem, logicalRect));
     m_lineBox.expandHorizontally(logicalWidth + horizontalMargin.start + horizontalMargin.end);
     m_lineBox.setIsConsideredNonEmpty();
-    m_trimmableRuns.clear();
+    m_trimmableContent.clear();
 }
 
 void Line::appendReplacedInlineBox(const InlineItem& inlineItem, LayoutUnit logicalWidth)
@@ -712,6 +705,13 @@
     return boxGeometry.marginBoxHeight();
 }
 
+void Line::TrimmableContent::append(InlineItemRun& inlineItemRun)
+{
+    ASSERT(inlineItemRun.logicalRect().width() >= 0);
+    m_width += inlineItemRun.logicalRect().width();
+    m_inlineItemRuns.append(&inlineItemRun);
+}
+
 LineBox::Baseline Line::halfLeadingMetrics(const FontMetrics& fontMetrics, LayoutUnit lineLogicalHeight)
 {
     auto ascent = fontMetrics.ascent();

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.h (252749 => 252750)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-11-21 21:30:10 UTC (rev 252749)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-11-21 21:42:42 UTC (rev 252750)
@@ -61,7 +61,7 @@
     bool hasContent() const { return !isVisuallyEmpty(); }
     LayoutUnit availableWidth() const { return logicalWidth() - contentLogicalWidth(); }
 
-    LayoutUnit trailingTrimmableWidth() const;
+    LayoutUnit trailingTrimmableWidth() const { return m_trimmableContent.width(); }
 
     const LineBox& lineBox() const { return m_lineBox; }
     void moveLogicalLeft(LayoutUnit);
@@ -152,7 +152,20 @@
 
     const InlineFormattingContext& m_inlineFormattingContext;
     Vector<std::unique_ptr<InlineItemRun>, 50> m_inlineItemRuns;
-    Vector<InlineItemRun*, 5> m_trimmableRuns;
+    struct TrimmableContent {
+        void append(InlineItemRun&);
+        void clear();
+
+        LayoutUnit width() const { return m_width; }
+        using TrimmableList = Vector<InlineItemRun*, 5>;
+        TrimmableList& runs() { return m_inlineItemRuns; }
+        bool isEmpty() const { return m_inlineItemRuns.isEmpty(); }
+
+    private:
+        TrimmableList m_inlineItemRuns;
+        LayoutUnit m_width;
+    };
+    TrimmableContent m_trimmableContent;
     Optional<LineBox::Baseline> m_initialStrut;
     LayoutUnit m_lineLogicalWidth;
     Optional<TextAlignMode> m_horizontalAlignment;
@@ -160,6 +173,12 @@
     LineBox m_lineBox;
 };
 
+inline void Line::TrimmableContent::clear()
+{
+    m_inlineItemRuns.clear();
+    m_width = { };
 }
+
 }
+}
 #endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to