Diff
Modified: trunk/Source/WebCore/ChangeLog (246062 => 246063)
--- trunk/Source/WebCore/ChangeLog 2019-06-04 14:54:52 UTC (rev 246062)
+++ trunk/Source/WebCore/ChangeLog 2019-06-04 15:26:04 UTC (rev 246063)
@@ -1,5 +1,27 @@
2019-06-04 Zalan Bujtas <[email protected]>
+ [LFC][IFC] Move run width measuring out of LineBreaker
+ https://bugs.webkit.org/show_bug.cgi?id=198491
+ <rdar://problem/51363554>
+
+ Reviewed by Antti Koivisto.
+
+ LineBreaker should not need to deal with measuring runs.
+ This is also in preparation for removing InlineItem::width().
+
+ * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+ (WebCore::Layout::inlineItemWidth):
+ (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
+ (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const):
+ * layout/inlineformatting/InlineLineBreaker.cpp:
+ (WebCore::Layout::LineBreaker::breakingContext):
+ (WebCore::Layout::LineBreaker::LineBreaker): Deleted.
+ (WebCore::Layout::LineBreaker::runWidth const): Deleted.
+ (WebCore::Layout::LineBreaker::textWidth const): Deleted.
+ * layout/inlineformatting/InlineLineBreaker.h:
+
+2019-06-04 Zalan Bujtas <[email protected]>
+
[LFC][IFC] Remove redundant InlineItem::width() calls.
https://bugs.webkit.org/show_bug.cgi?id=198489
<rdar://problem/51360390>
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246062 => 246063)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-06-04 14:54:52 UTC (rev 246062)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-06-04 15:26:04 UTC (rev 246063)
@@ -83,6 +83,34 @@
{
}
+static LayoutUnit inlineItemWidth(const LayoutState& layoutState, const InlineItem& inlineItem, LayoutUnit contentLogicalLeft)
+{
+ if (inlineItem.isLineBreak())
+ return 0;
+
+ if (is<InlineTextItem>(inlineItem)) {
+ auto& inlineTextItem = downcast<InlineTextItem>(inlineItem);
+ auto end = inlineTextItem.isCollapsed() ? inlineTextItem.start() + 1 : inlineTextItem.end();
+ return TextUtil::width(downcast<InlineBox>(inlineTextItem.layoutBox()), inlineTextItem.start(), end, contentLogicalLeft);
+ }
+
+ auto& layoutBox = inlineItem.layoutBox();
+ ASSERT(layoutState.hasDisplayBox(layoutBox));
+ auto& displayBox = layoutState.displayBoxForLayoutBox(layoutBox);
+
+ if (inlineItem.isContainerStart())
+ return displayBox.marginStart() + displayBox.borderLeft() + displayBox.paddingLeft().valueOr(0);
+
+ if (inlineItem.isContainerEnd())
+ return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0);
+
+ if (inlineItem.isFloat())
+ return displayBox.marginBoxWidth();
+
+ return displayBox.width();
+}
+
+
static std::unique_ptr<Line> constructLine(const LayoutState& layoutState, const FloatingState& floatingState, const Box& formattingRoot,
LayoutUnit lineLogicalTop, LayoutUnit availableWidth)
{
@@ -140,7 +168,7 @@
ASSERT(committedInlineItemCount);
return LineContent { lineInput.firstInlineItemIndex + (committedInlineItemCount - 1), line->close() };
};
- LineBreaker lineBreaker(layoutState());
+ 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& inlineItem = lineInput.inlineItems[inlineItemIndex];
@@ -151,8 +179,9 @@
}
auto availableWidth = line->availableWidth() - uncommittedContent.width();
auto currentLogicalRight = line->contentLogicalRight() + uncommittedContent.width();
+ inlineItem->setWidth(inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight));
// FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.
- auto breakingContext = lineBreaker.breakingContext(*inlineItem, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
+ auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItem->width(), { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
if (breakingContext.isAtBreakingOpportunity)
commitPendingContent();
@@ -206,10 +235,12 @@
LayoutUnit lineLogicalRight;
LayoutUnit trimmableTrailingWidth;
- LineBreaker lineBreaker(layoutState());
+ LineBreaker lineBreaker;
auto& inlineContent = m_formattingState.inlineItems();
for (auto& inlineItem : inlineContent) {
- auto breakingContext = lineBreaker.breakingContext(*inlineItem, { widthConstraint, lineLogicalRight, !lineLogicalRight });
+ auto logicalWidth = inlineItemWidth(layoutState(), *inlineItem, lineLogicalRight);
+ inlineItem->setWidth(logicalWidth);
+ auto breakingContext = lineBreaker.breakingContext(*inlineItem, logicalWidth, { widthConstraint, lineLogicalRight, !lineLogicalRight });
if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) {
maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
trimmableTrailingWidth = { };
@@ -219,10 +250,10 @@
// Skip leading whitespace.
if (!lineLogicalRight)
continue;
- trimmableTrailingWidth += inlineItem->width();
+ trimmableTrailingWidth += logicalWidth;
} else
trimmableTrailingWidth = { };
- lineLogicalRight += inlineItem->width();
+ lineLogicalRight += logicalWidth;
}
return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
}
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp (246062 => 246063)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp 2019-06-04 14:54:52 UTC (rev 246062)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp 2019-06-04 15:26:04 UTC (rev 246063)
@@ -34,16 +34,10 @@
namespace WebCore {
namespace Layout {
-LineBreaker::LineBreaker(const LayoutState& layoutState)
- : m_layoutState(layoutState)
+LineBreaker::BreakingContext LineBreaker::breakingContext(const InlineItem& inlineItem, LayoutUnit logicalWidth, const LineContext& lineContext)
{
-}
-
-LineBreaker::BreakingContext LineBreaker::breakingContext(InlineItem& inlineItem, LineContext lineContext)
-{
- inlineItem.setWidth(runWidth(inlineItem, lineContext.logicalLeft));
// First content always stays on line.
- if (lineContext.isEmpty || inlineItem.width() <= lineContext.availableWidth)
+ if (lineContext.isEmpty || logicalWidth <= lineContext.availableWidth)
return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) };
if (is<InlineTextItem>(inlineItem))
@@ -51,7 +45,7 @@
// Wrap non-text boxes to the next line unless we can trim trailing whitespace.
auto availableWidth = lineContext.availableWidth + lineContext.trimmableWidth;
- if (inlineItem.width() <= availableWidth)
+ if (logicalWidth <= availableWidth)
return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) };
return { BreakingBehavior::Wrap, isAtBreakingOpportunity(inlineItem) };
}
@@ -88,30 +82,6 @@
return lineIsEmpty ? BreakingBehavior::Keep : BreakingBehavior::Wrap;
}
-LayoutUnit LineBreaker::runWidth(const InlineItem& inlineItem, LayoutUnit contentLogicalLeft) const
-{
- if (inlineItem.isLineBreak())
- return 0;
-
- if (is<InlineTextItem>(inlineItem))
- return textWidth(downcast<InlineTextItem>(inlineItem), contentLogicalLeft);
-
- auto& layoutBox = inlineItem.layoutBox();
- ASSERT(m_layoutState.hasDisplayBox(layoutBox));
- auto& displayBox = m_layoutState.displayBoxForLayoutBox(layoutBox);
-
- if (inlineItem.isContainerStart())
- return displayBox.marginStart() + displayBox.borderLeft() + displayBox.paddingLeft().valueOr(0);
-
- if (inlineItem.isContainerEnd())
- return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0);
-
- if (inlineItem.isFloat())
- return displayBox.marginBoxWidth();
-
- return displayBox.width();
-}
-
bool LineBreaker::isAtBreakingOpportunity(const InlineItem& inlineItem)
{
if (is<InlineTextItem>(inlineItem))
@@ -119,11 +89,6 @@
return !inlineItem.isFloat() && !inlineItem.isContainerStart() && !inlineItem.isContainerEnd();
}
-LayoutUnit LineBreaker::textWidth(const InlineTextItem& inlineTextItem, LayoutUnit contentLogicalLeft) const
-{
- auto end = inlineTextItem.isCollapsed() ? inlineTextItem.start() + 1 : inlineTextItem.end();
- return TextUtil::width(downcast<InlineBox>(inlineTextItem.layoutBox()), inlineTextItem.start(), end, contentLogicalLeft);
}
}
-}
#endif
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h (246062 => 246063)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h 2019-06-04 14:54:52 UTC (rev 246062)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h 2019-06-04 15:26:04 UTC (rev 246063)
@@ -34,8 +34,6 @@
class LineBreaker {
public:
- LineBreaker(const LayoutState&);
-
enum class BreakingBehavior { Keep, Break, Wrap };
struct BreakingContext {
BreakingBehavior breakingBehavior;
@@ -47,16 +45,13 @@
LayoutUnit trimmableWidth;
bool isEmpty { false };
};
- BreakingContext breakingContext(InlineItem&, const LineContext);
+ BreakingContext breakingContext(const InlineItem&, LayoutUnit logicalWidth, const LineContext&);
private:
BreakingBehavior wordBreakingBehavior(const InlineTextItem&, bool lineIsEmpty) const;
bool isAtBreakingOpportunity(const InlineItem&);
- LayoutUnit runWidth(const InlineItem&, LayoutUnit contentLogicalLeft) const;
- LayoutUnit textWidth(const InlineTextItem&, LayoutUnit contentLogicalLeft) const;
- const LayoutState& m_layoutState;
bool m_hyphenationIsDisabled { true };
};