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