Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (246632 => 246633)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-06-20 11:08:29 UTC (rev 246632)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-06-20 13:59:12 UTC (rev 246633)
@@ -66,8 +66,7 @@
};
struct LineInput {
- enum class SkipVerticalAligment { No, Yes };
- LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&);
+ LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&);
struct HorizontalConstraint {
HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth);
@@ -76,7 +75,7 @@
};
HorizontalConstraint horizontalConstraint;
// FIXME Alternatively we could just have a second pass with vertical positioning (preferred width computation opts out)
- SkipVerticalAligment skipVerticalAligment;
+ Line::SkipVerticalAligment skipVerticalAligment;
unsigned firstInlineItemIndex { 0 };
const InlineItems& inlineItems;
Optional<LayoutUnit> floatMinimumLogicalBottom;
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246632 => 246633)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-06-20 11:08:29 UTC (rev 246632)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-06-20 13:59:12 UTC (rev 246633)
@@ -78,7 +78,7 @@
{
}
-InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems)
+InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems)
: horizontalConstraint(logicalTopLeft, availableLogicalWidth)
, skipVerticalAligment(skipVerticalAligment)
, firstInlineItemIndex(firstInlineItemIndex)
@@ -127,13 +127,15 @@
InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLayout::placeInlineItems(const LineInput& lineInput) const
{
- std::unique_ptr<Line> line;
- if (lineInput.skipVerticalAligment == LineInput::SkipVerticalAligment::No) {
- auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight();
- auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent;
- line = std::make_unique<Line>(layoutState(), lineInput.horizontalConstraint.logicalTopLeft, lineInput.horizontalConstraint.availableLogicalWidth, mimimumLineHeight, initialBaselineOffset);
- } else
- line = std::make_unique<Line>(layoutState(), lineInput.horizontalConstraint.logicalTopLeft.x(), lineInput.horizontalConstraint.availableLogicalWidth);
+ auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight();
+ auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent;
+ auto initialLineConstraints = Line::InitialConstraints {
+ lineInput.horizontalConstraint.logicalTopLeft,
+ lineInput.horizontalConstraint.availableLogicalWidth,
+ mimimumLineHeight,
+ initialBaselineOffset
+ };
+ auto line = Line { layoutState(), initialLineConstraints, lineInput.skipVerticalAligment };
Vector<WeakPtr<InlineItem>> floats;
unsigned committedInlineItemCount = 0;
@@ -144,7 +146,7 @@
return;
committedInlineItemCount += uncommittedContent.size();
for (auto& uncommittedRun : uncommittedContent.runs())
- line->append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth);
+ line.append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth);
uncommittedContent.reset();
};
@@ -152,19 +154,19 @@
auto closeLine = [&] {
ASSERT(committedInlineItemCount || lineHasFloatBox);
auto lastCommittedIndex = committedInlineItemCount ? Optional<unsigned> { lineInput.firstInlineItemIndex + (committedInlineItemCount - 1) } : WTF::nullopt;
- return LineContent { lastCommittedIndex, WTFMove(floats), line->close() };
+ return LineContent { lastCommittedIndex, WTFMove(floats), line.close() };
};
LineBreaker lineBreaker;
// Iterate through the inline content and place the inline boxes on the current line.
for (auto inlineItemIndex = lineInput.firstInlineItemIndex; inlineItemIndex < lineInput.inlineItems.size(); ++inlineItemIndex) {
- auto availableWidth = line->availableWidth() - uncommittedContent.width();
- auto currentLogicalRight = line->contentLogicalRight() + uncommittedContent.width();
+ auto availableWidth = line.availableWidth() - uncommittedContent.width();
+ auto currentLogicalRight = line.contentLogicalRight() + uncommittedContent.width();
auto& inlineItem = lineInput.inlineItems[inlineItemIndex];
auto itemLogicalWidth = inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight);
// FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.
- auto lineIsConsideredEmpty = !line->hasContent() && !lineHasFloatBox;
- auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), lineIsConsideredEmpty });
+ auto lineIsConsideredEmpty = !line.hasContent() && !lineHasFloatBox;
+ auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line.trailingTrimmableWidth(), lineIsConsideredEmpty });
if (breakingContext.isAtBreakingOpportunity)
commitPendingContent();
@@ -186,7 +188,7 @@
ASSERT(layoutState().hasDisplayBox(floatBox));
// Shrink availble space for current line and move existing inline runs.
auto floatBoxWidth = layoutState().displayBoxForLayoutBox(floatBox).marginBoxWidth();
- floatBox.isLeftFloatingPositioned() ? line->moveLogicalLeft(floatBoxWidth) : line->moveLogicalRight(floatBoxWidth);
+ floatBox.isLeftFloatingPositioned() ? line.moveLogicalLeft(floatBoxWidth) : line.moveLogicalRight(floatBoxWidth);
floats.append(makeWeakPtr(*inlineItem));
++committedInlineItemCount;
lineHasFloatBox = true;
@@ -251,7 +253,7 @@
auto& inlineItems = m_formattingState.inlineItems();
unsigned currentInlineItemIndex = 0;
while (currentInlineItemIndex < inlineItems.size()) {
- auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, LineInput::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems };
+ auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, Line::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems };
applyFloatConstraint(lineInput);
auto lineContent = placeInlineItems(lineInput);
createDisplayRuns(*lineContent.runs, lineContent.floats, widthConstraint);
@@ -273,7 +275,7 @@
auto& inlineItems = m_formattingState.inlineItems();
unsigned currentInlineItemIndex = 0;
while (currentInlineItemIndex < inlineItems.size()) {
- auto lineContent = placeInlineItems({ { }, widthConstraint, LineInput::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems });
+ auto lineContent = placeInlineItems({ { }, widthConstraint, Line::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems });
currentInlineItemIndex = *lineContent.lastInlineItemIndex + 1;
LayoutUnit floatsWidth;
for (auto& floatItem : lineContent.floats)
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp (246632 => 246633)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp 2019-06-20 11:08:29 UTC (rev 246632)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp 2019-06-20 13:59:12 UTC (rev 246633)
@@ -44,25 +44,17 @@
{
}
-Line::Line(const LayoutState& layoutState, LayoutUnit logicalLeft, LayoutUnit availableWidth)
+Line::Line(const LayoutState& layoutState, const InitialConstraints& initialConstraints, SkipVerticalAligment skipVerticalAligment)
: m_layoutState(layoutState)
, m_content(std::make_unique<Line::Content>())
- , m_logicalTopLeft(logicalLeft, 0)
- , m_lineLogicalWidth(availableWidth)
- , m_skipVerticalAligment(true)
+ , m_logicalTopLeft(initialConstraints.topLeft)
+ , m_baseline({ initialConstraints.baselineOffset, initialConstraints.height - initialConstraints.baselineOffset })
+ , m_contentLogicalHeight(initialConstraints.height)
+ , m_lineLogicalWidth(initialConstraints.availableWidth)
+ , m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes)
{
}
-Line::Line(const LayoutState& layoutState, const LayoutPoint& topLeft, LayoutUnit availableWidth, LayoutUnit minimumHeight, LayoutUnit baselineOffset)
- : m_layoutState(layoutState)
- , m_content(std::make_unique<Line::Content>())
- , m_logicalTopLeft(topLeft)
- , m_baseline({ baselineOffset, minimumHeight - baselineOffset })
- , m_contentLogicalHeight(minimumHeight)
- , m_lineLogicalWidth(availableWidth)
-{
-}
-
bool Line::isVisuallyEmpty() const
{
// FIXME: This should be cached instead -as the inline items are being added.
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.h (246632 => 246633)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.h 2019-06-20 11:08:29 UTC (rev 246632)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.h 2019-06-20 13:59:12 UTC (rev 246633)
@@ -38,8 +38,14 @@
class Line {
WTF_MAKE_ISO_ALLOCATED(Line);
public:
- Line(const LayoutState&, const LayoutPoint& topLeft, LayoutUnit availableWidth, LayoutUnit minimumLineHeight, LayoutUnit baselineOffset);
- Line(const LayoutState&, LayoutUnit logicalLeft, LayoutUnit availableWidth);
+ struct InitialConstraints {
+ LayoutPoint topLeft;
+ LayoutUnit availableWidth;
+ LayoutUnit height;
+ LayoutUnit baselineOffset;
+ };
+ enum class SkipVerticalAligment { No, Yes };
+ Line(const LayoutState&, const InitialConstraints&, SkipVerticalAligment);
class Content {
public: