Diff
Modified: trunk/Source/WebCore/ChangeLog (273973 => 273974)
--- trunk/Source/WebCore/ChangeLog 2021-03-05 16:33:15 UTC (rev 273973)
+++ trunk/Source/WebCore/ChangeLog 2021-03-05 17:16:10 UTC (rev 273974)
@@ -1,3 +1,32 @@
+2021-03-05 Zalan Bujtas <[email protected]>
+
+ [LFC][IFC] Transition LineBox::InlineLevelBoxList from a list of std::unique_ptr<InlineLevelBox> to a list of InlineLevelBox objects
+ https://bugs.webkit.org/show_bug.cgi?id=222761
+
+ Reviewed by Antti Koivisto.
+
+ * layout/inlineformatting/InlineFormattingContext.cpp:
+ (WebCore::Layout::InlineFormattingContext::computeGeometryForLineContent):
+ * layout/inlineformatting/InlineFormattingContextGeometry.cpp:
+ (WebCore::Layout::LineBoxBuilder::constructAndAlignInlineLevelBoxes):
+ (WebCore::Layout::LineBoxBuilder::computeLineBoxHeightAndAlignInlineLevelBoxesVertically):
+ * layout/inlineformatting/InlineFormattingContextQuirks.cpp:
+ (WebCore::Layout::InlineFormattingContext::Quirks::inlineLevelBoxAffectsLineBox const):
+ * layout/inlineformatting/InlineLineBox.cpp:
+ (WebCore::Layout::LineBox::addInlineLevelBox):
+ * layout/inlineformatting/InlineLineBox.h:
+ (WebCore::Layout::LineBox::nonRootInlineLevelBoxes):
+ (WebCore::Layout::LineBox::inlineLevelBoxForLayoutBox):
+ (WebCore::Layout::LineBox::InlineLevelBox::createAtomicInlineLevelBox):
+ (WebCore::Layout::LineBox::InlineLevelBox::createInlineBox):
+ (WebCore::Layout::LineBox::InlineLevelBox::createLineBreakBox):
+ (WebCore::Layout::LineBox::InlineLevelBox::createGenericInlineLevelBox):
+ * layout/integration/LayoutIntegrationInlineContentBuilder.cpp:
+ (WebCore::LayoutIntegration::InlineContentBuilder::computeLineLevelVisualAdjustmentsForRuns const):
+ (WebCore::LayoutIntegration::InlineContentBuilder::createDisplayNonRootInlineBoxes const):
+ * layout/layouttree/LayoutTreeBuilder.cpp:
+ (WebCore::Layout::showInlineTreeAndRuns):
+
2021-03-05 Chris Dumez <[email protected]>
Unreviewed Windows build fix after r273966.
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp (273973 => 273974)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2021-03-05 16:33:15 UTC (rev 273973)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2021-03-05 17:16:10 UTC (rev 273974)
@@ -555,9 +555,9 @@
// Grab the inline boxes (even those that don't have associated layout boxes on the current line due to line wrapping)
// and update their geometries.
for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
- if (!inlineLevelBox->isInlineBox())
+ if (!inlineLevelBox.isInlineBox())
continue;
- auto& layoutBox = inlineLevelBox->layoutBox();
+ auto& layoutBox = inlineLevelBox.layoutBox();
auto& boxGeometry = formattingState.boxGeometry(layoutBox);
// Inline boxes may or may not be wrapped and have runs on multiple lines (e.g. <span>first line<br>second line<br>third line</span>)
auto inlineBoxBorderBox = lineBox.logicalBorderBoxForInlineBox(layoutBox, boxGeometry);
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextGeometry.cpp (273973 => 273974)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextGeometry.cpp 2021-03-05 16:33:15 UTC (rev 273973)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextGeometry.cpp 2021-03-05 17:16:10 UTC (rev 273974)
@@ -267,8 +267,8 @@
// Construct the missing LineBox::InlineBoxes starting with the topmost layout box.
for (auto* layoutBox : WTF::makeReversedRange(layoutBoxesWithoutInlineBoxes)) {
auto inlineBox = LineBox::InlineLevelBox::createInlineBox(*layoutBox, rootInlineBox.logicalLeft(), lineBox.contentLogicalWidth());
- setVerticalGeometryForInlineBox(*inlineBox);
- simplifiedAlignVerticallyIfApplicable(*inlineBox, { });
+ setVerticalGeometryForInlineBox(inlineBox);
+ simplifiedAlignVerticallyIfApplicable(inlineBox, { });
lineBox.addInlineLevelBox(WTFMove(inlineBox));
}
};
@@ -320,9 +320,9 @@
ascent = marginBoxHeight;
logicalLeft += std::max(0_lu, inlineLevelBoxGeometry.marginStart());
auto atomicInlineLevelBox = LineBox::InlineLevelBox::createAtomicInlineLevelBox(layoutBox, logicalLeft, { inlineLevelBoxGeometry.borderBoxWidth(), marginBoxHeight });
- atomicInlineLevelBox->setBaseline(ascent);
- atomicInlineLevelBox->setLayoutBounds(LineBox::InlineLevelBox::LayoutBounds { ascent, marginBoxHeight - ascent });
- simplifiedAlignVerticallyIfApplicable(*atomicInlineLevelBox, inlineLevelBoxGeometry);
+ atomicInlineLevelBox.setBaseline(ascent);
+ atomicInlineLevelBox.setLayoutBounds(LineBox::InlineLevelBox::LayoutBounds { ascent, marginBoxHeight - ascent });
+ simplifiedAlignVerticallyIfApplicable(atomicInlineLevelBox, inlineLevelBoxGeometry);
lineBox.addInlineLevelBox(WTFMove(atomicInlineLevelBox));
continue;
}
@@ -336,8 +336,8 @@
logicalLeft += marginStart;
initialLogicalWidth -= marginStart;
auto inlineBox = LineBox::InlineLevelBox::createInlineBox(layoutBox, logicalLeft, initialLogicalWidth);
- setVerticalGeometryForInlineBox(*inlineBox);
- simplifiedAlignVerticallyIfApplicable(*inlineBox, { });
+ setVerticalGeometryForInlineBox(inlineBox);
+ simplifiedAlignVerticallyIfApplicable(inlineBox, { });
lineBox.addInlineLevelBox(WTFMove(inlineBox));
continue;
}
@@ -359,8 +359,8 @@
}
if (run.isHardLineBreak()) {
auto lineBreakBox = LineBox::InlineLevelBox::createLineBreakBox(layoutBox, logicalLeft);
- setVerticalGeometryForInlineBox(*lineBreakBox);
- simplifiedAlignVerticallyIfApplicable(*lineBreakBox, { });
+ setVerticalGeometryForInlineBox(lineBreakBox);
+ simplifiedAlignVerticallyIfApplicable(lineBreakBox, { });
lineBox.addInlineLevelBox(WTFMove(lineBreakBox));
continue;
}
@@ -398,7 +398,7 @@
InlineLayoutUnit top { 0 };
InlineLayoutUnit bottom { 0 };
};
- HashMap<LineBox::InlineLevelBox*, AbsoluteTopAndBottom> inlineLevelBoxAbsoluteTopAndBottomMap;
+ HashMap<const LineBox::InlineLevelBox*, AbsoluteTopAndBottom> inlineLevelBoxAbsoluteTopAndBottomMap;
auto minimumLogicalTop = Optional<InlineLayoutUnit> { };
auto maximumLogicalBottom = Optional<InlineLayoutUnit> { };
@@ -411,9 +411,9 @@
Vector<LineBox::InlineLevelBox*> lineBoxRelativeInlineLevelBoxes;
for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
- auto& layoutBox = inlineLevelBox->layoutBox();
- if (inlineLevelBox->hasLineBoxRelativeAlignment()) {
- lineBoxRelativeInlineLevelBoxes.append(inlineLevelBox.get());
+ auto& layoutBox = inlineLevelBox.layoutBox();
+ if (inlineLevelBox.hasLineBoxRelativeAlignment()) {
+ lineBoxRelativeInlineLevelBoxes.append(&inlineLevelBox);
continue;
}
auto& parentInlineBox = lineBox.inlineLevelBoxForLayoutBox(layoutBox.parent());
@@ -421,25 +421,25 @@
// Note that this logical top is not the final logical top of the inline level box.
// This is the logical top in the context of the layout bounds geometry which may be very different from the inline box's normal geometry.
auto logicalTop = InlineLayoutUnit { };
- switch (inlineLevelBox->verticalAlign()) {
+ switch (inlineLevelBox.verticalAlign()) {
case VerticalAlign::Baseline: {
- auto logicalTopOffsetFromParentBaseline = inlineLevelBox->layoutBounds().ascent;
+ auto logicalTopOffsetFromParentBaseline = inlineLevelBox.layoutBounds().ascent;
logicalTop = parentInlineBox.layoutBounds().ascent - logicalTopOffsetFromParentBaseline;
break;
}
case VerticalAlign::Middle: {
- auto logicalTopOffsetFromParentBaseline = inlineLevelBox->layoutBounds().height() / 2 + parentInlineBox.style().fontMetrics().xHeight() / 2;
+ auto logicalTopOffsetFromParentBaseline = inlineLevelBox.layoutBounds().height() / 2 + parentInlineBox.style().fontMetrics().xHeight() / 2;
logicalTop = parentInlineBox.layoutBounds().ascent - logicalTopOffsetFromParentBaseline;
break;
}
case VerticalAlign::BaselineMiddle: {
- auto logicalTopOffsetFromParentBaseline = inlineLevelBox->layoutBounds().height() / 2;
+ auto logicalTopOffsetFromParentBaseline = inlineLevelBox.layoutBounds().height() / 2;
logicalTop = parentInlineBox.layoutBounds().ascent - logicalTopOffsetFromParentBaseline;
break;
}
case VerticalAlign::Length: {
- auto& style = inlineLevelBox->style();
- auto logicalTopOffsetFromParentBaseline = floatValueForLength(style.verticalAlignLength(), style.computedLineHeight()) + inlineLevelBox->layoutBounds().ascent;
+ auto& style = inlineLevelBox.style();
+ auto logicalTopOffsetFromParentBaseline = floatValueForLength(style.verticalAlignLength(), style.computedLineHeight()) + inlineLevelBox.layoutBounds().ascent;
logicalTop = parentInlineBox.layoutBounds().ascent - logicalTopOffsetFromParentBaseline;
break;
}
@@ -452,7 +452,7 @@
// Note that text-bottom aligns with the inline box's font metrics bottom (descent) and not the layout bounds bottom.
auto parentInlineBoxLayoutBounds = parentInlineBox.layoutBounds();
auto parentInlineBoxLogicalBottom = parentInlineBoxLayoutBounds.height() - parentInlineBoxLayoutBounds.descent + parentInlineBox.descent().valueOr(InlineLayoutUnit());
- logicalTop = parentInlineBoxLogicalBottom - inlineLevelBox->layoutBounds().height();
+ logicalTop = parentInlineBoxLogicalBottom - inlineLevelBox.layoutBounds().height();
break;
}
default:
@@ -461,10 +461,10 @@
}
auto parentInlineBoxAbsoluteTopAndBottom = inlineLevelBoxAbsoluteTopAndBottomMap.get(&parentInlineBox);
auto absoluteLogicalTop = parentInlineBoxAbsoluteTopAndBottom.top + logicalTop;
- auto absoluteLogicalBottom = absoluteLogicalTop + inlineLevelBox->layoutBounds().height();
- inlineLevelBoxAbsoluteTopAndBottomMap.add(inlineLevelBox.get(), AbsoluteTopAndBottom { absoluteLogicalTop, absoluteLogicalBottom });
+ auto absoluteLogicalBottom = absoluteLogicalTop + inlineLevelBox.layoutBounds().height();
+ inlineLevelBoxAbsoluteTopAndBottomMap.add(&inlineLevelBox, AbsoluteTopAndBottom { absoluteLogicalTop, absoluteLogicalBottom });
// Stretch the min/max absolute values if applicable.
- if (quirks.inlineLevelBoxAffectsLineBox(*inlineLevelBox, lineBox)) {
+ if (quirks.inlineLevelBoxAffectsLineBox(inlineLevelBox, lineBox)) {
minimumLogicalTop = std::min(minimumLogicalTop.valueOr(absoluteLogicalTop), absoluteLogicalTop);
maximumLogicalBottom = std::max(maximumLogicalBottom.valueOr(absoluteLogicalBottom), absoluteLogicalBottom);
}
@@ -483,7 +483,7 @@
computeLineBoxLogicalHeight();
auto computeRootInlineBoxVerticalPosition = [&] {
- HashMap<LineBox::InlineLevelBox*, InlineLayoutUnit> inlineLevelBoxAbsoluteBaselineOffsetMap;
+ HashMap<const LineBox::InlineLevelBox*, InlineLayoutUnit> inlineLevelBoxAbsoluteBaselineOffsetMap;
inlineLevelBoxAbsoluteBaselineOffsetMap.add(&rootInlineBox, InlineLayoutUnit { });
auto maximumTopOffsetFromRootInlineBoxBaseline = Optional<InlineLayoutUnit> { };
@@ -492,37 +492,37 @@
for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
auto absoluteBaselineOffset = InlineLayoutUnit { };
- if (!inlineLevelBox->hasLineBoxRelativeAlignment()) {
- auto& layoutBox = inlineLevelBox->layoutBox();
+ if (!inlineLevelBox.hasLineBoxRelativeAlignment()) {
+ auto& layoutBox = inlineLevelBox.layoutBox();
auto& parentInlineBox = lineBox.inlineLevelBoxForLayoutBox(layoutBox.parent());
auto baselineOffsetFromParentBaseline = InlineLayoutUnit { };
- switch (inlineLevelBox->verticalAlign()) {
+ switch (inlineLevelBox.verticalAlign()) {
case VerticalAlign::Baseline:
baselineOffsetFromParentBaseline = { };
break;
case VerticalAlign::Middle: {
- auto logicalTopOffsetFromParentBaseline = (inlineLevelBox->layoutBounds().height() / 2 + parentInlineBox.style().fontMetrics().xHeight() / 2);
- baselineOffsetFromParentBaseline = logicalTopOffsetFromParentBaseline - inlineLevelBox->baseline();
+ auto logicalTopOffsetFromParentBaseline = (inlineLevelBox.layoutBounds().height() / 2 + parentInlineBox.style().fontMetrics().xHeight() / 2);
+ baselineOffsetFromParentBaseline = logicalTopOffsetFromParentBaseline - inlineLevelBox.baseline();
break;
}
case VerticalAlign::BaselineMiddle: {
- auto logicalTopOffsetFromParentBaseline = inlineLevelBox->layoutBounds().height() / 2;
- baselineOffsetFromParentBaseline = logicalTopOffsetFromParentBaseline - inlineLevelBox->baseline();
+ auto logicalTopOffsetFromParentBaseline = inlineLevelBox.layoutBounds().height() / 2;
+ baselineOffsetFromParentBaseline = logicalTopOffsetFromParentBaseline - inlineLevelBox.baseline();
break;
}
case VerticalAlign::Length: {
- auto& style = inlineLevelBox->style();
+ auto& style = inlineLevelBox.style();
auto verticalAlignOffset = floatValueForLength(style.verticalAlignLength(), style.computedLineHeight());
- auto logicalTopOffsetFromParentBaseline = verticalAlignOffset + inlineLevelBox->baseline();
- baselineOffsetFromParentBaseline = logicalTopOffsetFromParentBaseline - inlineLevelBox->baseline();
+ auto logicalTopOffsetFromParentBaseline = verticalAlignOffset + inlineLevelBox.baseline();
+ baselineOffsetFromParentBaseline = logicalTopOffsetFromParentBaseline - inlineLevelBox.baseline();
break;
}
case VerticalAlign::TextTop:
- baselineOffsetFromParentBaseline = parentInlineBox.baseline() - inlineLevelBox->layoutBounds().ascent;
+ baselineOffsetFromParentBaseline = parentInlineBox.baseline() - inlineLevelBox.layoutBounds().ascent;
break;
case VerticalAlign::TextBottom:
- baselineOffsetFromParentBaseline = inlineLevelBox->layoutBounds().descent - *parentInlineBox.descent();
+ baselineOffsetFromParentBaseline = inlineLevelBox.layoutBounds().descent - *parentInlineBox.descent();
break;
default:
ASSERT_NOT_IMPLEMENTED_YET();
@@ -530,13 +530,13 @@
}
absoluteBaselineOffset = inlineLevelBoxAbsoluteBaselineOffsetMap.get(&parentInlineBox) + baselineOffsetFromParentBaseline;
} else {
- switch (inlineLevelBox->verticalAlign()) {
+ switch (inlineLevelBox.verticalAlign()) {
case VerticalAlign::Top: {
- absoluteBaselineOffset = rootInlineBox.layoutBounds().ascent - inlineLevelBox->layoutBounds().ascent;
+ absoluteBaselineOffset = rootInlineBox.layoutBounds().ascent - inlineLevelBox.layoutBounds().ascent;
break;
}
case VerticalAlign::Bottom: {
- absoluteBaselineOffset = inlineLevelBox->layoutBounds().descent - rootInlineBox.layoutBounds().descent;
+ absoluteBaselineOffset = inlineLevelBox.layoutBounds().descent - rootInlineBox.layoutBounds().descent;
break;
}
default:
@@ -544,16 +544,16 @@
break;
}
}
- inlineLevelBoxAbsoluteBaselineOffsetMap.add(inlineLevelBox.get(), absoluteBaselineOffset);
- auto affectsRootInlineBoxVerticalPosition = quirks.inlineLevelBoxAffectsLineBox(*inlineLevelBox, lineBox);
+ inlineLevelBoxAbsoluteBaselineOffsetMap.add(&inlineLevelBox, absoluteBaselineOffset);
+ auto affectsRootInlineBoxVerticalPosition = quirks.inlineLevelBoxAffectsLineBox(inlineLevelBox, lineBox);
if (affectsRootInlineBoxVerticalPosition) {
- auto topOffsetFromRootInlineBoxBaseline = absoluteBaselineOffset + inlineLevelBox->layoutBounds().ascent;
+ auto topOffsetFromRootInlineBoxBaseline = absoluteBaselineOffset + inlineLevelBox.layoutBounds().ascent;
if (maximumTopOffsetFromRootInlineBoxBaseline)
maximumTopOffsetFromRootInlineBoxBaseline = std::max(*maximumTopOffsetFromRootInlineBoxBaseline, topOffsetFromRootInlineBoxBaseline);
else {
// We are is quirk mode and the root inline box has no content. The root inline box's baseline is anchored at 0.
// However negative ascent (e.g negative top margin) can "push" the root inline box upwards and have a negative value.
- maximumTopOffsetFromRootInlineBoxBaseline = inlineLevelBox->layoutBounds().ascent >= 0
+ maximumTopOffsetFromRootInlineBoxBaseline = inlineLevelBox.layoutBounds().ascent >= 0
? std::max(0.0f, topOffsetFromRootInlineBoxBaseline)
: topOffsetFromRootInlineBoxBaseline;
}
@@ -566,50 +566,50 @@
auto alignInlineLevelBoxes = [&] {
for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
- auto& layoutBox = inlineLevelBox->layoutBox();
+ auto& layoutBox = inlineLevelBox.layoutBox();
auto& parentInlineBox = lineBox.inlineLevelBoxForLayoutBox(layoutBox.parent());
auto logicalTop = InlineLayoutUnit { };
- switch (inlineLevelBox->verticalAlign()) {
+ switch (inlineLevelBox.verticalAlign()) {
case VerticalAlign::Baseline:
- logicalTop = parentInlineBox.baseline() - inlineLevelBox->baseline();
+ logicalTop = parentInlineBox.baseline() - inlineLevelBox.baseline();
break;
case VerticalAlign::Middle: {
- auto logicalTopOffsetFromParentBaseline = (inlineLevelBox->logicalHeight() / 2 + parentInlineBox.style().fontMetrics().xHeight() / 2);
+ auto logicalTopOffsetFromParentBaseline = (inlineLevelBox.logicalHeight() / 2 + parentInlineBox.style().fontMetrics().xHeight() / 2);
logicalTop = parentInlineBox.baseline() - logicalTopOffsetFromParentBaseline;
break;
}
case VerticalAlign::BaselineMiddle: {
- auto logicalTopOffsetFromParentBaseline = inlineLevelBox->logicalHeight() / 2;
+ auto logicalTopOffsetFromParentBaseline = inlineLevelBox.logicalHeight() / 2;
logicalTop = parentInlineBox.baseline() - logicalTopOffsetFromParentBaseline;
break;
}
case VerticalAlign::Length: {
- auto& style = inlineLevelBox->style();
+ auto& style = inlineLevelBox.style();
auto verticalAlignOffset = floatValueForLength(style.verticalAlignLength(), style.computedLineHeight());
- auto logicalTopOffsetFromParentBaseline = verticalAlignOffset + inlineLevelBox->baseline();
+ auto logicalTopOffsetFromParentBaseline = verticalAlignOffset + inlineLevelBox.baseline();
logicalTop = parentInlineBox.baseline() - logicalTopOffsetFromParentBaseline;
break;
}
// Note that (text)top/bottom align their layout bounds.
case VerticalAlign::TextTop:
- logicalTop = inlineLevelBox->layoutBounds().ascent - inlineLevelBox->baseline();
+ logicalTop = inlineLevelBox.layoutBounds().ascent - inlineLevelBox.baseline();
break;
case VerticalAlign::TextBottom:
- logicalTop = parentInlineBox.logicalHeight() - inlineLevelBox->layoutBounds().descent - inlineLevelBox->baseline();
+ logicalTop = parentInlineBox.logicalHeight() - inlineLevelBox.layoutBounds().descent - inlineLevelBox.baseline();
break;
case VerticalAlign::Top:
// Note that this logical top is not relative to the parent inline box.
- logicalTop = inlineLevelBox->layoutBounds().ascent - inlineLevelBox->baseline();
+ logicalTop = inlineLevelBox.layoutBounds().ascent - inlineLevelBox.baseline();
break;
case VerticalAlign::Bottom:
// Note that this logical top is not relative to the parent inline box.
- logicalTop = lineBox.logicalHeight() - inlineLevelBox->layoutBounds().descent - inlineLevelBox->baseline();
+ logicalTop = lineBox.logicalHeight() - inlineLevelBox.layoutBounds().descent - inlineLevelBox.baseline();
break;
default:
ASSERT_NOT_IMPLEMENTED_YET();
break;
}
- inlineLevelBox->setLogicalTop(logicalTop);
+ inlineLevelBox.setLogicalTop(logicalTop);
}
};
alignInlineLevelBoxes();
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp (273973 => 273974)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp 2021-03-05 16:33:15 UTC (rev 273973)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp 2021-03-05 17:16:10 UTC (rev 273974)
@@ -62,7 +62,7 @@
return true;
for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
// Filter out empty inline boxes e.g. <div><span></span><span></span><br></div>
- if (inlineLevelBox->isInlineBox() && inlineLevelBox->hasContent())
+ if (inlineLevelBox.isInlineBox() && inlineLevelBox.hasContent())
return false;
}
return true;
@@ -82,9 +82,9 @@
if (!lineBox.hasInlineBox())
return false;
for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
- if (!inlineLevelBox->isInlineBox())
+ if (!inlineLevelBox.isInlineBox())
continue;
- if (inlineLevelBox->hasContent())
+ if (inlineLevelBox.hasContent())
return true;
}
return false;
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.cpp (273973 => 273974)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.cpp 2021-03-05 16:33:15 UTC (rev 273973)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.cpp 2021-03-05 17:16:10 UTC (rev 273974)
@@ -92,10 +92,10 @@
m_nonRootInlineLevelBoxMap.reserveInitialCapacity(numberOfRuns);
}
-void LineBox::addInlineLevelBox(std::unique_ptr<InlineLevelBox>&& inlineLevelBox)
+void LineBox::addInlineLevelBox(InlineLevelBox&& inlineLevelBox)
{
- m_boxTypes.add(inlineLevelBox->type());
- m_nonRootInlineLevelBoxMap.set(&inlineLevelBox->layoutBox(), inlineLevelBox.get());
+ m_boxTypes.add(inlineLevelBox.type());
+ m_nonRootInlineLevelBoxMap.set(&inlineLevelBox.layoutBox(), m_nonRootInlineLevelBoxList.size());
m_nonRootInlineLevelBoxList.append(WTFMove(inlineLevelBox));
}
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h (273973 => 273974)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h 2021-03-05 16:33:15 UTC (rev 273973)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h 2021-03-05 17:16:10 UTC (rev 273974)
@@ -60,12 +60,11 @@
WTF_MAKE_FAST_ALLOCATED;
public:
struct InlineLevelBox {
- WTF_MAKE_ISO_ALLOCATED_INLINE(InlineLevelBox);
public:
- static std::unique_ptr<LineBox::InlineLevelBox> createInlineBox(const Box&, InlineLayoutUnit logicalLeft, InlineLayoutUnit logicalWidth);
- static std::unique_ptr<LineBox::InlineLevelBox> createAtomicInlineLevelBox(const Box&, InlineLayoutUnit logicalLeft, InlineLayoutSize);
- static std::unique_ptr<LineBox::InlineLevelBox> createLineBreakBox(const Box&, InlineLayoutUnit logicalLeft);
- static std::unique_ptr<LineBox::InlineLevelBox> createGenericInlineLevelBox(const Box&, InlineLayoutUnit logicalLeft);
+ static LineBox::InlineLevelBox createInlineBox(const Box&, InlineLayoutUnit logicalLeft, InlineLayoutUnit logicalWidth);
+ static LineBox::InlineLevelBox createAtomicInlineLevelBox(const Box&, InlineLayoutUnit logicalLeft, InlineLayoutSize);
+ static LineBox::InlineLevelBox createLineBreakBox(const Box&, InlineLayoutUnit logicalLeft);
+ static LineBox::InlineLevelBox createGenericInlineLevelBox(const Box&, InlineLayoutUnit logicalLeft);
InlineLayoutUnit baseline() const { return m_baseline; }
Optional<InlineLayoutUnit> descent() const { return m_descent; }
@@ -158,7 +157,7 @@
InlineRect logicalBorderBoxForInlineBox(const Box&, const BoxGeometry&) const;
const InlineLevelBox& rootInlineBox() const { return m_rootInlineBox; }
- using InlineLevelBoxList = Vector<std::unique_ptr<InlineLevelBox>>;
+ using InlineLevelBoxList = Vector<InlineLevelBox>;
const InlineLevelBoxList& nonRootInlineLevelBoxes() const { return m_nonRootInlineLevelBoxList; }
InlineLayoutUnit alignmentBaseline() const { return m_rootInlineBox.logicalTop() + m_rootInlineBox.baseline(); }
@@ -168,11 +167,12 @@
void setLogicalHeight(InlineLayoutUnit logicalHeight) { m_logicalRect.setHeight(logicalHeight); }
- void addInlineLevelBox(std::unique_ptr<InlineLevelBox>&&);
+ void addInlineLevelBox(InlineLevelBox&&);
+ InlineLevelBoxList& nonRootInlineLevelBoxes() { return m_nonRootInlineLevelBoxList; }
InlineLevelBox& rootInlineBox() { return m_rootInlineBox; }
- InlineLevelBox& inlineLevelBoxForLayoutBox(const Box& layoutBox) { return &layoutBox == &m_rootInlineBox.layoutBox() ? m_rootInlineBox : *m_nonRootInlineLevelBoxMap.get(&layoutBox); }
+ InlineLevelBox& inlineLevelBoxForLayoutBox(const Box& layoutBox) { return &layoutBox == &m_rootInlineBox.layoutBox() ? m_rootInlineBox : m_nonRootInlineLevelBoxList[m_nonRootInlineLevelBoxMap.get(&layoutBox)]; }
InlineRect logicalRectForInlineLevelBox(const Box& layoutBox) const;
void setHasContent(bool hasContent) { m_hasContent = hasContent; }
@@ -186,27 +186,27 @@
InlineLevelBox m_rootInlineBox;
InlineLevelBoxList m_nonRootInlineLevelBoxList;
- HashMap<const Box*, InlineLevelBox*> m_nonRootInlineLevelBoxMap;
+ HashMap<const Box*, size_t> m_nonRootInlineLevelBoxMap;
};
-inline std::unique_ptr<LineBox::InlineLevelBox> LineBox::InlineLevelBox::createAtomicInlineLevelBox(const Box& layoutBox, InlineLayoutUnit logicalLeft, InlineLayoutSize logicalSize)
+inline LineBox::InlineLevelBox LineBox::InlineLevelBox::createAtomicInlineLevelBox(const Box& layoutBox, InlineLayoutUnit logicalLeft, InlineLayoutSize logicalSize)
{
- return makeUnique<LineBox::InlineLevelBox>(layoutBox, logicalLeft, logicalSize, Type::AtomicInlineLevelBox);
+ return LineBox::InlineLevelBox { layoutBox, logicalLeft, logicalSize, Type::AtomicInlineLevelBox };
}
-inline std::unique_ptr<LineBox::InlineLevelBox> LineBox::InlineLevelBox::createInlineBox(const Box& layoutBox, InlineLayoutUnit logicalLeft, InlineLayoutUnit logicalWidth)
+inline LineBox::InlineLevelBox LineBox::InlineLevelBox::createInlineBox(const Box& layoutBox, InlineLayoutUnit logicalLeft, InlineLayoutUnit logicalWidth)
{
- return makeUnique<LineBox::InlineLevelBox>(layoutBox, logicalLeft, InlineLayoutSize { logicalWidth, { } }, Type::InlineBox);
+ return LineBox::InlineLevelBox { layoutBox, logicalLeft, InlineLayoutSize { logicalWidth, { } }, Type::InlineBox };
}
-inline std::unique_ptr<LineBox::InlineLevelBox> LineBox::InlineLevelBox::createLineBreakBox(const Box& layoutBox, InlineLayoutUnit logicalLeft)
+inline LineBox::InlineLevelBox LineBox::InlineLevelBox::createLineBreakBox(const Box& layoutBox, InlineLayoutUnit logicalLeft)
{
- return makeUnique<LineBox::InlineLevelBox>(layoutBox, logicalLeft, InlineLayoutSize { }, Type::LineBreakBox);
+ return LineBox::InlineLevelBox { layoutBox, logicalLeft, InlineLayoutSize { }, Type::LineBreakBox };
}
-inline std::unique_ptr<LineBox::InlineLevelBox> LineBox::InlineLevelBox::createGenericInlineLevelBox(const Box& layoutBox, InlineLayoutUnit logicalLeft)
+inline LineBox::InlineLevelBox LineBox::InlineLevelBox::createGenericInlineLevelBox(const Box& layoutBox, InlineLayoutUnit logicalLeft)
{
- return makeUnique<LineBox::InlineLevelBox>(layoutBox, logicalLeft, InlineLayoutSize { }, Type::GenericInlineLevelBox);
+ return LineBox::InlineLevelBox { layoutBox, logicalLeft, InlineLayoutSize { }, Type::GenericInlineLevelBox };
}
}
Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp (273973 => 273974)
--- trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp 2021-03-05 16:33:15 UTC (rev 273973)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp 2021-03-05 17:16:10 UTC (rev 273974)
@@ -189,7 +189,7 @@
}
// Text + <br> (or just <br> or text<span></span><br>) behaves like text.
for (auto& inlineLevelBox : nonRootInlineLevelBoxList) {
- if (inlineLevelBox->isAtomicInlineLevelBox()) {
+ if (inlineLevelBox.isAtomicInlineLevelBox()) {
// Content like text<img> prevents legacy snapping.
return false;
}
@@ -374,14 +374,14 @@
auto& lineBoxLogicalRect = lineBox.logicalRect();
for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
- if (!inlineLevelBox->isInlineBox())
+ if (!inlineLevelBox.isInlineBox())
continue;
- auto& layoutBox = inlineLevelBox->layoutBox();
+ auto& layoutBox = inlineLevelBox.layoutBox();
auto& boxGeometry = m_layoutState.geometryForBox(layoutBox);
auto inlineBoxRect = lineBox.logicalBorderBoxForInlineBox(layoutBox, boxGeometry);
inlineBoxRect.moveBy(lineBoxLogicalRect.topLeft());
- inlineContent.nonRootInlineBoxes.append({ lineIndex, layoutBox, inlineBoxRect, inlineQuirks.inlineLevelBoxAffectsLineBox(*inlineLevelBox, lineBox) });
+ inlineContent.nonRootInlineBoxes.append({ lineIndex, layoutBox, inlineBoxRect, inlineQuirks.inlineLevelBoxAffectsLineBox(inlineLevelBox, lineBox) });
}
}
}
Modified: trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp (273973 => 273974)
--- trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp 2021-03-05 16:33:15 UTC (rev 273973)
+++ trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp 2021-03-05 17:16:10 UTC (rev 273974)
@@ -432,7 +432,7 @@
};
outputInlineLevelBox(lineBox.rootInlineBox());
for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes())
- outputInlineLevelBox(*inlineLevelBox);
+ outputInlineLevelBox(inlineLevelBox);
addSpacing();
stream << " Runs:";