[LFC][IFC] LineBuilder::InlineItemRun objects don't have vertical geometry
https://bugs.webkit.org/show_bug.cgi?id=204752
<rdar://problem/57560643>
Reviewed by Antti Koivisto.
Height and vertical position are computed when the InlineItemRun objects are merged and transformed into LineBuilder::Run objects.
* layout/inlineformatting/InlineLineBuilder.cpp:
(WebCore::Layout::LineBuilder::ContinousContent::append):
(WebCore::Layout::LineBuilder::ContinousContent::close):
(WebCore::Layout::LineBuilder::Run::Run):
(WebCore::Layout::LineBuilder::appendNonBreakableSpace):
(WebCore::Layout::LineBuilder::appendInlineContainerStart):
(WebCore::Layout::LineBuilder::appendInlineContainerEnd):
(WebCore::Layout::LineBuilder::appendTextContent):
(WebCore::Layout::LineBuilder::appendNonReplacedInlineBox):
(WebCore::Layout::LineBuilder::appendLineBreak):
(WebCore::Layout::LineBuilder::isVisuallyNonEmpty const):
(WebCore::Layout::LineBuilder::InlineItemRun::InlineItemRun):
(WebCore::Layout::LineBuilder::InlineItemRun::setCollapsesToZeroAdvanceWidth):
(WebCore::Layout::LineBuilder::InlineItemRun::removeTrailingLetterSpacing):
* layout/inlineformatting/InlineLineBuilder.h:
(WebCore::Layout::LineBuilder::InlineItemRun::logicalLeft const):
(WebCore::Layout::LineBuilder::InlineItemRun::logicalWidth const):
(WebCore::Layout::LineBuilder::InlineItemRun::logicalRect const): Deleted.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@253003 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index eea8dde..431d755 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,32 @@
+2019-12-02 Zalan Bujtas <zalan@apple.com>
+
+ [LFC][IFC] LineBuilder::InlineItemRun objects don't have vertical geometry
+ https://bugs.webkit.org/show_bug.cgi?id=204752
+ <rdar://problem/57560643>
+
+ Reviewed by Antti Koivisto.
+
+ Height and vertical position are computed when the InlineItemRun objects are merged and transformed into LineBuilder::Run objects.
+
+ * layout/inlineformatting/InlineLineBuilder.cpp:
+ (WebCore::Layout::LineBuilder::ContinousContent::append):
+ (WebCore::Layout::LineBuilder::ContinousContent::close):
+ (WebCore::Layout::LineBuilder::Run::Run):
+ (WebCore::Layout::LineBuilder::appendNonBreakableSpace):
+ (WebCore::Layout::LineBuilder::appendInlineContainerStart):
+ (WebCore::Layout::LineBuilder::appendInlineContainerEnd):
+ (WebCore::Layout::LineBuilder::appendTextContent):
+ (WebCore::Layout::LineBuilder::appendNonReplacedInlineBox):
+ (WebCore::Layout::LineBuilder::appendLineBreak):
+ (WebCore::Layout::LineBuilder::isVisuallyNonEmpty const):
+ (WebCore::Layout::LineBuilder::InlineItemRun::InlineItemRun):
+ (WebCore::Layout::LineBuilder::InlineItemRun::setCollapsesToZeroAdvanceWidth):
+ (WebCore::Layout::LineBuilder::InlineItemRun::removeTrailingLetterSpacing):
+ * layout/inlineformatting/InlineLineBuilder.h:
+ (WebCore::Layout::LineBuilder::InlineItemRun::logicalLeft const):
+ (WebCore::Layout::LineBuilder::InlineItemRun::logicalWidth const):
+ (WebCore::Layout::LineBuilder::InlineItemRun::logicalRect const): Deleted.
+
2019-12-02 Simon Fraser <simon.fraser@apple.com>
Remove the confusing Value struct used for calc results
diff --git a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
index 9d56077..b1f6a3f 100644
--- a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
+++ b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
@@ -74,7 +74,7 @@
ASSERT(inlineItemRun.isText());
m_expandedLength += inlineItemRun.textContext()->length();
- m_expandedWidth += inlineItemRun.logicalRect().width();
+ m_expandedWidth += inlineItemRun.logicalWidth();
if (m_textIsAlignJustify) {
m_hasTrailingExpansionOpportunity = inlineItemRun.hasExpansionOpportunity();
@@ -90,9 +90,6 @@
return { m_initialInlineRun };
// Expand the text content and set the expansion opportunities.
ASSERT(m_initialInlineRun.isText());
- auto logicalRect = m_initialInlineRun.logicalRect();
- logicalRect.expandHorizontally(m_expandedWidth);
-
auto textContext = *m_initialInlineRun.textContext();
auto length = textContext.length() + m_expandedLength;
textContext.expand(length);
@@ -104,13 +101,13 @@
++m_expansionOpportunityCount;
textContext.setExpansion({ expansionBehavior, { } });
}
- return { m_initialInlineRun, logicalRect, textContext, m_expansionOpportunityCount };
+ return { m_initialInlineRun, Display::Rect { 0, m_initialInlineRun.logicalLeft(), m_initialInlineRun.logicalWidth() + m_expandedWidth, { } }, textContext, m_expansionOpportunityCount };
}
LineBuilder::Run::Run(const InlineItemRun& inlineItemRun)
: m_layoutBox(&inlineItemRun.layoutBox())
, m_type(inlineItemRun.type())
- , m_logicalRect(inlineItemRun.logicalRect())
+ , m_logicalRect({ { }, inlineItemRun.logicalLeft(), inlineItemRun.logicalWidth(), { } })
, m_textContext(inlineItemRun.textContext())
, m_isCollapsedToVisuallyEmpty(inlineItemRun.isCollapsedToZeroAdvanceWidth())
{
@@ -456,22 +453,22 @@
m_lineBox.setIsConsideredNonEmpty();
}
-void LineBuilder::appendNonBreakableSpace(const InlineItem& inlineItem, const Display::Rect& logicalRect)
+void LineBuilder::appendNonBreakableSpace(const InlineItem& inlineItem, LayoutUnit logicalLeft, LayoutUnit logicalWidth)
{
- m_inlineItemRuns.append({ inlineItem, logicalRect });
- m_lineBox.expandHorizontally(logicalRect.width());
+ m_inlineItemRuns.append({ inlineItem, logicalLeft, logicalWidth });
+ m_lineBox.expandHorizontally(logicalWidth);
}
void LineBuilder::appendInlineContainerStart(const InlineItem& inlineItem, LayoutUnit logicalWidth)
{
// This is really just a placeholder to mark the start of the inline level container <span>.
- appendNonBreakableSpace(inlineItem, Display::Rect { 0, contentLogicalWidth(), logicalWidth, { } });
+ appendNonBreakableSpace(inlineItem, contentLogicalWidth(), logicalWidth);
}
void LineBuilder::appendInlineContainerEnd(const InlineItem& inlineItem, LayoutUnit logicalWidth)
{
// This is really just a placeholder to mark the end of the inline level container </span>.
- appendNonBreakableSpace(inlineItem, Display::Rect { 0, contentLogicalRight(), logicalWidth, { } });
+ appendNonBreakableSpace(inlineItem, contentLogicalRight(), logicalWidth);
}
void LineBuilder::appendTextContent(const InlineTextItem& inlineItem, LayoutUnit logicalWidth)
@@ -508,8 +505,7 @@
auto collapsedRun = inlineItem.isCollapsible() && inlineItem.length() > 1;
auto contentStart = inlineItem.start();
auto contentLength = collapsedRun ? 1 : inlineItem.length();
- auto lineRun = InlineItemRun { inlineItem, Display::Rect { 0, contentLogicalWidth(), logicalWidth, { } },
- Display::Run::TextContext { contentStart, contentLength, inlineItem.layoutBox().textContext()->content } };
+ auto lineRun = InlineItemRun { inlineItem, contentLogicalWidth(), logicalWidth, Display::Run::TextContext { contentStart, contentLength, inlineItem.layoutBox().textContext()->content } };
auto collapsesToZeroAdvanceWidth = willCollapseCompletely();
if (collapsesToZeroAdvanceWidth)
@@ -518,7 +514,7 @@
if (collapsedRun)
lineRun.setIsCollapsed();
- auto lineRunWidth = lineRun.logicalRect().width();
+ auto lineRunWidth = lineRun.logicalWidth();
// Trailing whitespace content is fully trimmable so as the trailing letter space.
auto isFullyTrimmable = !shouldPreserveTrailingContent(inlineItem);
auto isPartiallyTrimmable = !inlineItem.isWhitespace() && inlineItem.style().letterSpacing();
@@ -543,7 +539,7 @@
auto& layoutBox = inlineItem.layoutBox();
auto& boxGeometry = formattingContext().geometryForBox(layoutBox);
auto horizontalMargin = boxGeometry.horizontalMargin();
- m_inlineItemRuns.append({ inlineItem, Display::Rect { 0, contentLogicalWidth() + horizontalMargin.start, logicalWidth, { } } });
+ m_inlineItemRuns.append({ inlineItem, contentLogicalWidth() + horizontalMargin.start, logicalWidth });
m_lineBox.expandHorizontally(logicalWidth + horizontalMargin.start + horizontalMargin.end);
m_trimmableContent.clear();
}
@@ -557,7 +553,7 @@
void LineBuilder::appendLineBreak(const InlineItem& inlineItem)
{
- m_inlineItemRuns.append({ inlineItem, Display::Rect { 0, contentLogicalWidth(), { }, { } } });
+ m_inlineItemRuns.append({ inlineItem, contentLogicalWidth(), { } });
}
void LineBuilder::adjustBaselineAndLineHeight(const Run& run)
@@ -673,7 +669,7 @@
// Note that this does not check whether the inline container has content. It simply checks if the container itself is considered non-empty.
if (run.isContainerStart() || run.isContainerEnd()) {
- if (!run.logicalRect().width())
+ if (!run.logicalWidth())
return false;
// Margin does not make the container visually non-empty. Check if it has border or padding.
auto& boxGeometry = formattingContext().geometryForBox(run.layoutBox());
@@ -689,7 +685,7 @@
if (!run.layoutBox().establishesFormattingContext())
return true;
ASSERT(run.layoutBox().isInlineBlockBox());
- if (!run.logicalRect().width())
+ if (!run.logicalWidth())
return false;
if (m_skipAlignment || formattingContext().geometryForBox(run.layoutBox()).height())
return true;
@@ -731,9 +727,10 @@
m_lastRunIsFullyTrimmable = isFullyTrimmable == IsFullyTrimmable::Yes;
}
-LineBuilder::InlineItemRun::InlineItemRun(const InlineItem& inlineItem, const Display::Rect& logicalRect, WTF::Optional<Display::Run::TextContext> textContext)
+LineBuilder::InlineItemRun::InlineItemRun(const InlineItem& inlineItem, LayoutUnit logicalLeft, LayoutUnit logicalWidth, WTF::Optional<Display::Run::TextContext> textContext)
: m_inlineItem(inlineItem)
- , m_logicalRect(logicalRect)
+ , m_logicalLeft(logicalLeft)
+ , m_logicalWidth(logicalWidth)
, m_textContext(textContext)
{
}
@@ -741,13 +738,14 @@
void LineBuilder::InlineItemRun::setCollapsesToZeroAdvanceWidth()
{
m_collapsedToZeroAdvanceWidth = true;
- m_logicalRect.setWidth({ });
+ m_logicalWidth = { };
}
void LineBuilder::InlineItemRun::removeTrailingLetterSpacing()
{
ASSERT(m_inlineItem.style().letterSpacing());
- m_logicalRect.expandHorizontally(LayoutUnit { -m_inlineItem.style().letterSpacing() });
+ m_logicalWidth -= m_inlineItem.style().letterSpacing();
+ ASSERT(m_logicalWidth > 0);
}
}
diff --git a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h
index 60ea766..6ceea5a 100644
--- a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h
+++ b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h
@@ -130,7 +130,7 @@
LayoutUnit contentLogicalRight() const { return m_lineBox.logicalRight(); }
LayoutUnit baselineOffset() const { return m_lineBox.baselineOffset(); }
- void appendNonBreakableSpace(const InlineItem&, const Display::Rect& logicalRect);
+ void appendNonBreakableSpace(const InlineItem&, LayoutUnit logicalLeft, LayoutUnit logicalWidth);
void appendTextContent(const InlineTextItem&, LayoutUnit logicalWidth);
void appendNonReplacedInlineBox(const InlineItem&, LayoutUnit logicalWidth);
void appendReplacedInlineBox(const InlineItem&, LayoutUnit logicalWidth);
@@ -155,10 +155,11 @@
class InlineItemRun {
public:
- InlineItemRun(const InlineItem&, const Display::Rect&, WTF::Optional<Display::Run::TextContext> = WTF::nullopt);
+ InlineItemRun(const InlineItem&, LayoutUnit logicalLeft, LayoutUnit logicalWidth, WTF::Optional<Display::Run::TextContext> = WTF::nullopt);
const Box& layoutBox() const { return m_inlineItem.layoutBox(); }
- const Display::Rect& logicalRect() const { return m_logicalRect; }
+ LayoutUnit logicalLeft() const { return m_logicalLeft; }
+ LayoutUnit logicalWidth() const { return m_logicalWidth; }
const Optional<Display::Run::TextContext>& textContext() const { return m_textContext; }
bool isText() const { return m_inlineItem.isText(); }
@@ -182,7 +183,8 @@
private:
const InlineItem& m_inlineItem;
- Display::Rect m_logicalRect;
+ LayoutUnit m_logicalLeft;
+ LayoutUnit m_logicalWidth;
const Optional<Display::Run::TextContext> m_textContext;
bool m_isCollapsed { false };
bool m_collapsedToZeroAdvanceWidth { false };