[LFC][IFC] Optimize LineCandidateContent for the most common type of content
https://bugs.webkit.org/show_bug.cgi?id=206371
<rdar://problem/58656853>

Reviewed by Antti Koivisto.

Optimize LineCandidateContent and the caller for the most common type of content (text) and also reduce the RunList vector initial size.
We normally pass one or 2 inline items to the LineBreaker in there.

* layout/inlineformatting/InlineLineBreaker.h:
* layout/inlineformatting/LineLayoutContext.cpp:
(WebCore::Layout::LineCandidateContent::appendLineBreak):
(WebCore::Layout::LineCandidateContent::appendFloat):
(WebCore::Layout::LineCandidateContent::appendInlineContent):
(WebCore::Layout::LineLayoutContext::inlineItemWidth const):
(WebCore::Layout::LineLayoutContext::nextContentForLine):
(WebCore::Layout::LineLayoutContext::tryAddingFloatItems):
(WebCore::Layout::LineCandidateContent::append): Deleted.
(WebCore::Layout::inlineItemWidth): Deleted.
* layout/inlineformatting/LineLayoutContext.h:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@254721 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index a713d01..0661d9e 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,26 @@
+2020-01-16  Zalan Bujtas  <zalan@apple.com>
+
+        [LFC][IFC] Optimize LineCandidateContent for the most common type of content
+        https://bugs.webkit.org/show_bug.cgi?id=206371
+        <rdar://problem/58656853>
+
+        Reviewed by Antti Koivisto.
+
+        Optimize LineCandidateContent and the caller for the most common type of content (text) and also reduce the RunList vector initial size.
+        We normally pass one or 2 inline items to the LineBreaker in there.
+
+        * layout/inlineformatting/InlineLineBreaker.h:
+        * layout/inlineformatting/LineLayoutContext.cpp:
+        (WebCore::Layout::LineCandidateContent::appendLineBreak):
+        (WebCore::Layout::LineCandidateContent::appendFloat):
+        (WebCore::Layout::LineCandidateContent::appendInlineContent):
+        (WebCore::Layout::LineLayoutContext::inlineItemWidth const):
+        (WebCore::Layout::LineLayoutContext::nextContentForLine):
+        (WebCore::Layout::LineLayoutContext::tryAddingFloatItems):
+        (WebCore::Layout::LineCandidateContent::append): Deleted.
+        (WebCore::Layout::inlineItemWidth): Deleted.
+        * layout/inlineformatting/LineLayoutContext.h:
+
 2020-01-16  Fujii Hironori  <Hironori.Fujii@sony.com>
 
         Unreviewed, rolling out r254678.
diff --git a/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h b/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h
index 50b9112..bedc030 100644
--- a/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h
+++ b/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h
@@ -74,7 +74,7 @@
         const InlineItem& inlineItem;
         InlineLayoutUnit logicalWidth { 0 };
     };
-    using RunList = Vector<Run, 30>;
+    using RunList = Vector<Run, 3>;
 
     struct LineStatus {
         InlineLayoutUnit availableWidth { 0 };
diff --git a/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp b/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp
index 0604a4d..65d636b 100644
--- a/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp
+++ b/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp
@@ -178,7 +178,9 @@
 }
 
 struct LineCandidateContent {
-    void append(const InlineItem&, Optional<InlineLayoutUnit> logicalWidth = WTF::nullopt);
+    void appendInlineContent(const InlineItem&, InlineLayoutUnit logicalWidth);
+    void appendLineBreak(const InlineItem& inlineItem) { setTrailingLineBreak(inlineItem); }
+    void appendFloat(const InlineItem& inlineItem) { m_floats.append(makeWeakPtr(inlineItem)); }
 
     bool hasIntrusiveFloats() const { return !m_floats.isEmpty(); }
     const LineBreaker::RunList& inlineRuns() const { return m_inlineRuns; }
@@ -198,15 +200,10 @@
     const InlineItem* m_trailingLineBreak { nullptr };
 };
 
-void LineCandidateContent::append(const InlineItem& inlineItem, Optional<InlineLayoutUnit> logicalWidth)
+void LineCandidateContent::appendInlineContent(const InlineItem& inlineItem, InlineLayoutUnit logicalWidth)
 {
-    ASSERT(!trailingLineBreak());
-    if (inlineItem.isLineBreak())
-        return setTrailingLineBreak(inlineItem);
-    if (inlineItem.isFloat())
-        return m_floats.append(makeWeakPtr(inlineItem));
-    m_inlineContentLogicalWidth += *logicalWidth;
-    m_inlineRuns.append({ inlineItem, *logicalWidth });
+    m_inlineContentLogicalWidth += logicalWidth;
+    m_inlineRuns.append({ inlineItem, logicalWidth });
 }
 
 void LineCandidateContent::reset()
@@ -217,11 +214,8 @@
     m_trailingLineBreak = nullptr;
 }
 
-static InlineLayoutUnit inlineItemWidth(const FormattingContext& formattingContext, const InlineItem& inlineItem, InlineLayoutUnit contentLogicalLeft)
+InlineLayoutUnit LineLayoutContext::inlineItemWidth(const InlineItem& inlineItem, InlineLayoutUnit contentLogicalLeft) const
 {
-    if (inlineItem.isLineBreak())
-        return 0;
-
     if (is<InlineTextItem>(inlineItem)) {
         auto& inlineTextItem = downcast<InlineTextItem>(inlineItem);
         if (auto contentWidth = inlineTextItem.width())
@@ -230,8 +224,11 @@
         return TextUtil::width(inlineTextItem, inlineTextItem.start(), end, contentLogicalLeft);
     }
 
+    if (inlineItem.isLineBreak())
+        return 0;
+
     auto& layoutBox = inlineItem.layoutBox();
-    auto& boxGeometry = formattingContext.geometryForBox(layoutBox);
+    auto& boxGeometry = m_inlineFormattingContext.geometryForBox(layoutBox);
 
     if (layoutBox.isFloatingPositioned())
         return boxGeometry.marginBoxWidth();
@@ -358,23 +355,31 @@
         // Handle leading partial content first (split text from the previous line).
         // Construct a partial leading inline item.
         m_partialLeadingTextItem = downcast<InlineTextItem>(*m_inlineItems[inlineItemIndex]).right(*partialLeadingContentLength);
-        auto itemWidth = inlineItemWidth(formattingContext(), *m_partialLeadingTextItem, currentLogicalRight);
-        candidateContent.append(*m_partialLeadingTextItem, itemWidth);
+        auto itemWidth = inlineItemWidth(*m_partialLeadingTextItem, currentLogicalRight);
+        candidateContent.appendInlineContent(*m_partialLeadingTextItem, itemWidth);
         currentLogicalRight += itemWidth;
         ++inlineItemIndex;
     }
 
     for (auto index = inlineItemIndex; index < softWrapOpportunityIndex; ++index) {
         auto& inlineItem = *m_inlineItems[index];
+        if (inlineItem.isText() || inlineItem.isContainerStart() || inlineItem.isContainerEnd()) {
+            auto inlineItenmWidth = inlineItemWidth(inlineItem, currentLogicalRight);
+            candidateContent.appendInlineContent(inlineItem, inlineItenmWidth);
+            currentLogicalRight += inlineItenmWidth;
+            continue;
+        }
         if (inlineItem.isFloat()) {
             // Floats are not part of the line context.
             // FIXME: Check if their width should be added to currentLogicalRight.
-            candidateContent.append(inlineItem);
+            candidateContent.appendFloat(inlineItem);
             continue;
         }
-        auto inlineItenmWidth = inlineItemWidth(formattingContext(), inlineItem, currentLogicalRight);
-        candidateContent.append(inlineItem, inlineItenmWidth);
-        currentLogicalRight += inlineItenmWidth;
+        if (inlineItem.isLineBreak()) {
+            candidateContent.appendLineBreak(inlineItem);
+            continue;
+        }
+        ASSERT_NOT_REACHED();
     }
 }
 
@@ -382,7 +387,7 @@
 {
     size_t committedFloatItemCount = 0;
     for (auto& floatItem : floats) {
-        auto logicalWidth = inlineItemWidth(formattingContext(), *floatItem, { });
+        auto logicalWidth = inlineItemWidth(*floatItem, { });
 
         auto lineIsConsideredEmpty = line.isVisuallyEmpty() && !line.hasIntrusiveFloat();
         if (LineBreaker().shouldWrapFloatBox(logicalWidth, line.availableWidth() + line.trailingCollapsibleWidth(), lineIsConsideredEmpty))
diff --git a/Source/WebCore/layout/inlineformatting/LineLayoutContext.h b/Source/WebCore/layout/inlineformatting/LineLayoutContext.h
index f4029853..d0df8e6 100644
--- a/Source/WebCore/layout/inlineformatting/LineLayoutContext.h
+++ b/Source/WebCore/layout/inlineformatting/LineLayoutContext.h
@@ -66,6 +66,8 @@
     void commitContent(LineBuilder&, const LineBreaker::RunList&, Optional<LineBreaker::Result::PartialTrailingContent>);
     LineContent close(LineBuilder&, unsigned leadingInlineItemIndex, unsigned committedInlineItemCount, Optional<LineContent::PartialContent>);
 
+    InlineLayoutUnit inlineItemWidth(const InlineItem&, InlineLayoutUnit contentLogicalLeft) const;
+
     const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; }
     const Container& root() const { return m_formattingContextRoot; }