[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; }