Skip to content

Commit

Permalink
[IFC] Add fast path for simple text only content
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=259900

Reviewed by Antti Koivisto.

This patch adds a fast path for simple, text-only inline content.

1. Introduce a base class for line builders (AbstractLineBuilder)
2. Move shared types (LineInput etc) from LineBuilder to AbstractLineBuilder.h
3. Implement TextOnlyLineBuilder (This is really just a subset of LineBuilder with simplified state machine/logic)

This improves PerformanceTests/Layout/line-layout.html by ~55%.

* Source/WebCore/Headers.cmake:
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp:
(WebCore::Layout::InlineContentBreaker::ContinuousContent::appendTextContent):
* Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h:
* Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp:
(WebCore::Layout::isRootStyleEligibleForSimplifiedTextOnlyInlineLayout):
(WebCore::Layout::InlineFormattingContext::layoutInFlowAndFloatContent):
(WebCore::Layout::InlineFormattingContext::textOnlyLineLayout):
(WebCore::Layout::InlineFormattingContext::lineLayout):
(WebCore::Layout::InlineFormattingContext::createDisplayContentForLine):
(WebCore::Layout::InlineFormattingContext::resetGeometryForClampedContent):
* Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.h:
* Source/WebCore/layout/formattingContexts/inline/InlineFormattingGeometry.cpp:
(WebCore::Layout::InlineFormattingGeometry::logicalTopForNextLine const):
* Source/WebCore/layout/formattingContexts/inline/InlineFormattingGeometry.h:
* Source/WebCore/layout/formattingContexts/inline/InlineFormattingState.h:
(WebCore::Layout::InlineFormattingState::setIsNonBidiTextAndForcedLineBreakOnlyContent):
(WebCore::Layout::InlineFormattingState::isNonBidiTextAndForcedLineBreakOnlyContent const):
* Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp:
(WebCore::Layout::InlineItemsBuilder::collectInlineItems):
(WebCore::Layout::InlineItemsBuilder::handleTextContent):
(WebCore::Layout::InlineItemsBuilder::handleInlineBoxStart):
(WebCore::Layout::InlineItemsBuilder::handleInlineBoxEnd):
(WebCore::Layout::InlineItemsBuilder::handleInlineLevelBox):
* Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.h:
* Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.cpp:
(WebCore::Layout::LineBoxBuilder::LineBoxBuilder):
* Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.h:
(WebCore::Layout::LineBoxBuilder::isFirstLine const):
(WebCore::Layout::LineBoxBuilder::lineLayoutResult const):
* Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp:
(WebCore::Layout::LineCandidate::InlineContent::appendInlineItem):
(WebCore::Layout::LineBuilder::layoutInlineContent):
* Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h:
* Source/WebCore/layout/formattingContexts/inline/InlineLineLayoutTypes.h: Added.
* Source/WebCore/layout/formattingContexts/inline/TextOnlyLineBuilder.cpp: Added.
(WebCore::Layout::inlineTextItemWidth):
(WebCore::Layout::placedInlineItemEnd):
(WebCore::Layout::isLastLineWithInlineContent):
(WebCore::Layout::appendInlineTextItem):
(WebCore::Layout::consumeTrailingLineBreakIfApplicable):
(WebCore::Layout::TextOnlyLineBuilder::TextOnlyLineBuilder):
(WebCore::Layout::TextOnlyLineBuilder::layoutInlineContent):
(WebCore::Layout::TextOnlyLineBuilder::initialize):
(WebCore::Layout::TextOnlyLineBuilder::placeInlineTextContent):
(WebCore::Layout::TextOnlyLineBuilder::placeNonWrappingInlineTextContent):
(WebCore::Layout::TextOnlyLineBuilder::handleInlineTextContent):
(WebCore::Layout::TextOnlyLineBuilder::handleLineEnding):
(WebCore::Layout::TextOnlyLineBuilder::horizontalAlignmentOffset const):
(WebCore::Layout::TextOnlyLineBuilder::rebuildLine):
(WebCore::Layout::TextOnlyLineBuilder::root const):
* Source/WebCore/layout/formattingContexts/inline/TextOnlyLineBuilder.h: Added.
(WebCore::Layout::TextOnlyLineBuilder::TextOnlyLineBuilder):
(WebCore::Layout::TextOnlyLineBuilder::isFirstFormattedLine const):
(WebCore::Layout::TextOnlyLineBuilder::intrinsicWidthMode const):
(WebCore::Layout::TextOnlyLineBuilder::isInIntrinsicWidthMode const):
(WebCore::Layout::TextOnlyLineBuilder::formattingContext const):
* Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp:
(WebCore::Layout::InlineDisplayContentBuilder::build):
(WebCore::Layout::InlineDisplayContentBuilder::processNonBidiContent):
(WebCore::Layout::InlineDisplayContentBuilder::processBidiContent):
(WebCore::Layout::InlineDisplayContentBuilder::processFloatBoxes):
* Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.h:
* Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp:
(WebCore::Layout::InlineDisplayLineBuilder::collectEnclosingLineGeometry const):
(WebCore::Layout::InlineDisplayLineBuilder::build const):
* Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.h:

Canonical link: https://commits.webkit.org/266815@main
  • Loading branch information
alanbaradlay committed Aug 11, 2023
1 parent eacccd2 commit ba2673d
Show file tree
Hide file tree
Showing 25 changed files with 753 additions and 136 deletions.
2 changes: 2 additions & 0 deletions Source/WebCore/Headers.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -1279,6 +1279,8 @@ set(WebCore_PRIVATE_FRAMEWORK_HEADERS
layout/LayoutUnits.h
layout/MarginTypes.h

layout/floats/FloatingState.h

layout/formattingContexts/FormattingConstraints.h
layout/formattingContexts/FormattingContext.h

Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/Sources.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1717,6 +1717,7 @@ layout/formattingContexts/inline/InlineLineBoxBuilder.cpp
layout/formattingContexts/inline/InlineLineBuilder.cpp
layout/formattingContexts/inline/InlineLineBoxVerticalAligner.cpp
layout/formattingContexts/inline/InlineTextItem.cpp
layout/formattingContexts/inline/TextOnlyLineBuilder.cpp
layout/formattingContexts/inline/display/InlineDisplayContent.cpp
layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp
layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp
Expand Down
10 changes: 10 additions & 0 deletions Source/WebCore/WebCore.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -5248,10 +5248,12 @@
DD17C083286EC57700D60B58 /* LICENSE in Copy PDF.js */ = {isa = PBXBuildFile; fileRef = DD17C080286EC51B00D60B58 /* LICENSE */; };
DD17C084286EC57A00D60B58 /* web in Copy PDF.js */ = {isa = PBXBuildFile; fileRef = DD17C07E286EC51A00D60B58 /* web */; };
DD1C779029354C77003BD79B /* StyleTextBoxEdge.h in Headers */ = {isa = PBXBuildFile; fileRef = DD1C778F29354C75003BD79B /* StyleTextBoxEdge.h */; settings = {ATTRIBUTES = (Private, ); }; };
DD308A2D2A82F684000A2687 /* AbstractLineBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = DD308A2C2A82F684000A2687 /* AbstractLineBuilder.h */; settings = {ATTRIBUTES = (Private, ); }; };
DD763BB20992C2C900740B8E /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DD763BB10992C2C900740B8E /* libxml2.dylib */; };
DD7CDF250A23CF9800069928 /* CSSUnknownRule.h in Headers */ = {isa = PBXBuildFile; fileRef = A80E6CCE0A1989CA007FB8C5 /* CSSUnknownRule.h */; settings = {ATTRIBUTES = (Private, ); }; };
DD8A30B4291DFC8F00AD537C /* BlockLayoutState.h in Headers */ = {isa = PBXBuildFile; fileRef = DD8A30B3291DFC8F00AD537C /* BlockLayoutState.h */; settings = {ATTRIBUTES = (Private, ); }; };
DDA210EA29FC46EE00C712C3 /* InlineLayoutState.h in Headers */ = {isa = PBXBuildFile; fileRef = DDA210E929FC46ED00C712C3 /* InlineLayoutState.h */; settings = {ATTRIBUTES = (Private, ); }; };
DDA3D5CF2A7D844D000ECEE1 /* TextOnlyLineBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = DDA3D5CE2A7D844D000ECEE1 /* TextOnlyLineBuilder.h */; settings = {ATTRIBUTES = (Private, ); }; };
DDB04F3A278E5539008D3678 /* libWTF.a in Product Dependencies */ = {isa = PBXBuildFile; fileRef = DDB04F39278E5531008D3678 /* libWTF.a */; };
DDC8E9562A3DE60400FF8ECF /* LogicalFlexItem.h in Headers */ = {isa = PBXBuildFile; fileRef = DDC8E9552A3DE60400FF8ECF /* LogicalFlexItem.h */; settings = {ATTRIBUTES = (Private, ); }; };
DDDFE83E2846ECE2006F1EE5 /* cocoa in Copy PDF.js Extras */ = {isa = PBXBuildFile; fileRef = DDDFE83B2846ECD3006F1EE5 /* cocoa */; };
Expand Down Expand Up @@ -18237,10 +18239,13 @@
DD17C07E286EC51A00D60B58 /* web */ = {isa = PBXFileReference; lastKnownFileType = folder; path = web; sourceTree = "<group>"; };
DD17C080286EC51B00D60B58 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
DD1C778F29354C75003BD79B /* StyleTextBoxEdge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleTextBoxEdge.h; sourceTree = "<group>"; };
DD308A2C2A82F684000A2687 /* AbstractLineBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbstractLineBuilder.h; sourceTree = "<group>"; };
DD763BB10992C2C900740B8E /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = /usr/lib/libxml2.dylib; sourceTree = "<absolute>"; };
DD8A30B3291DFC8F00AD537C /* BlockLayoutState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockLayoutState.h; sourceTree = "<group>"; };
DD93A9E129C2A60300ED671E /* InlineDisplayContent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = InlineDisplayContent.cpp; sourceTree = "<group>"; };
DDA210E929FC46ED00C712C3 /* InlineLayoutState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineLayoutState.h; sourceTree = "<group>"; };
DDA3D5CE2A7D844D000ECEE1 /* TextOnlyLineBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextOnlyLineBuilder.h; sourceTree = "<group>"; };
DDA3D5D02A7D847E000ECEE1 /* TextOnlyLineBuilder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TextOnlyLineBuilder.cpp; sourceTree = "<group>"; };
DDB04F39278E5531008D3678 /* libWTF.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libWTF.a; sourceTree = BUILT_PRODUCTS_DIR; };
DDC8E9552A3DE60400FF8ECF /* LogicalFlexItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LogicalFlexItem.h; sourceTree = "<group>"; };
DDDFE83A2846ECD3006F1EE5 /* adwaita */ = {isa = PBXFileReference; lastKnownFileType = folder; path = adwaita; sourceTree = "<group>"; };
Expand Down Expand Up @@ -21178,6 +21183,7 @@
11A1E6FB26FBB6CE00435D36 /* display */,
111FA1C326F0F2E6003B8F16 /* invalidation */,
6FE7DDDD20EC6E8B008B5B4E /* text */,
DD308A2C2A82F684000A2687 /* AbstractLineBuilder.h */,
6FE198132178397B00446F08 /* InlineContentBreaker.cpp */,
6FE198152178397C00446F08 /* InlineContentBreaker.h */,
DDFCB4802917014500C799C6 /* InlineFormattingConstraints.h */,
Expand Down Expand Up @@ -21211,6 +21217,8 @@
6F360E4E23999420001512A7 /* InlineSoftLineBreakItem.h */,
6F1CC1DC225F8B4100720AD2 /* InlineTextItem.cpp */,
6F1CC1DD225F8B4200720AD2 /* InlineTextItem.h */,
DDA3D5D02A7D847E000ECEE1 /* TextOnlyLineBuilder.cpp */,
DDA3D5CE2A7D844D000ECEE1 /* TextOnlyLineBuilder.h */,
);
path = inline;
sourceTree = "<group>";
Expand Down Expand Up @@ -36622,6 +36630,7 @@
5CCEB08B29F1056A005EF534 /* ApplePaySetupFeatureTypeWebCore.h in Headers */,
7CD0E2B81F80A4820016A4CE /* AbortController.h in Headers */,
7CD0E2BF1F80A56E0016A4CE /* AbortSignal.h in Headers */,
DD308A2D2A82F684000A2687 /* AbstractLineBuilder.h in Headers */,
F48223131E386E240066FC79 /* AbstractPasteboard.h in Headers */,
93D05032253A149A002A3072 /* AbstractRange.h in Headers */,
41E1B1D10FF5986900576B3B /* AbstractWorker.h in Headers */,
Expand Down Expand Up @@ -41321,6 +41330,7 @@
86AA527C2937BD620065399E /* TextManipulationToken.h in Headers */,
BCEF45E90E687767001C1287 /* TextMetrics.h in Headers */,
E4D988B417BFD1F60084FB88 /* TextNodeTraversal.h in Headers */,
DDA3D5CF2A7D844D000ECEE1 /* TextOnlyLineBuilder.h in Headers */,
1C18DA59181AF6A500C4EF22 /* TextPainter.h in Headers */,
E4C91A0E1802343100A17F6D /* TextPaintStyle.h in Headers */,
CE212158240DBEB9006ED443 /* TextPlaceholderElement.h in Headers */,
Expand Down
105 changes: 105 additions & 0 deletions Source/WebCore/layout/formattingContexts/inline/AbstractLineBuilder.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/*
* Copyright (C) 2023 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/

#pragma once

#include "FloatingState.h"
#include "InlineLineTypes.h"
#include "LayoutUnits.h"

namespace WebCore {
namespace Layout {

struct LineInput {
InlineItemRange needsLayoutRange;
InlineRect initialLogicalRect;
};

struct LineLayoutResult {
using PlacedFloatList = FloatingState::FloatList;
using SuspendedFloatList = Vector<const Box*>;

InlineItemRange inlineItemRange;
const Line::RunList& inlineContent;

struct FloatContent {
PlacedFloatList placedFloats;
SuspendedFloatList suspendedFloats;
bool hasIntrusiveFloat { false };
};
FloatContent floatContent { };

struct ContentGeometry {
InlineLayoutUnit logicalLeft { 0.f };
InlineLayoutUnit logicalWidth { 0.f };
InlineLayoutUnit logicalRightIncludingNegativeMargin { 0.f }; // Note that with negative horizontal margin value, contentLogicalLeft + contentLogicalWidth is not necessarily contentLogicalRight.
std::optional<InlineLayoutUnit> trailingOverflowingContentWidth { };
};
ContentGeometry contentGeometry { };

struct LineGeometry {
InlineLayoutPoint logicalTopLeft;
InlineLayoutUnit logicalWidth { 0.f };
InlineLayoutUnit initialLogicalLeftIncludingIntrusiveFloats { 0.f };
std::optional<InlineLayoutUnit> initialLetterClearGap { };
};
LineGeometry lineGeometry { };

struct HangingContent {
bool shouldContributeToScrollableOverflow { false };
InlineLayoutUnit logicalWidth { 0.f };
};
HangingContent hangingContent { };

struct Directionality {
Vector<int32_t> visualOrderList;
TextDirection inlineBaseDirection { TextDirection::LTR };
};
Directionality directionality { };

struct IsFirstLast {
enum class FirstFormattedLine : uint8_t {
No,
WithinIFC,
WithinBFC
};
FirstFormattedLine isFirstFormattedLine { FirstFormattedLine::WithinIFC };
bool isLastLineWithInlineContent { true };
};
IsFirstLast isFirstLast { };
// Misc
size_t nonSpanningInlineLevelBoxCount { 0 };
std::optional<InlineLayoutUnit> hintForNextLineTopToAvoidIntrusiveFloat { }; // This is only used for cases when intrusive floats prevent any content placement at current vertical position.
};

class AbstractLineBuilder {
public:
virtual LineLayoutResult layoutInlineContent(const LineInput&, const std::optional<PreviousLine>&) = 0;
virtual ~AbstractLineBuilder() { };
};


}
}
Original file line number Diff line number Diff line change
Expand Up @@ -811,8 +811,20 @@ void InlineContentBreaker::ContinuousContent::append(const InlineItem& inlineIte
}
}

void InlineContentBreaker::ContinuousContent::appendTextContent(const InlineTextItem& inlineTextItem, const RenderStyle& style, InlineLayoutUnit logicalWidth, std::optional<InlineLayoutUnit> trimmableWidth)
void InlineContentBreaker::ContinuousContent::appendTextContent(const InlineTextItem& inlineTextItem, const RenderStyle& style, InlineLayoutUnit logicalWidth)
{
// https://www.w3.org/TR/css-text-4/#white-space-phase-2
auto isTrailingHangingContent = inlineTextItem.isWhitespace() && TextUtil::shouldTrailingWhitespaceHang(style);
if (isTrailingHangingContent)
setHangingContentWidth(logicalWidth);

auto trimmableWidth = [&]() -> std::optional<InlineLayoutUnit> {
if (isTrailingHangingContent)
return { };
if (inlineTextItem.isFullyTrimmable() || inlineTextItem.isQuirkNonBreakingSpace())
return logicalWidth;
return { };
}();
if (!trimmableWidth) {
appendToRunList(inlineTextItem, style, logicalWidth);
resetTrailingTrimmableContent();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class InlineContentBreaker {
bool isHangingContent() const { return hangingContentWidth() == logicalWidth(); }

void append(const InlineItem&, const RenderStyle&, InlineLayoutUnit logicalWidth);
void appendTextContent(const InlineTextItem&, const RenderStyle&, InlineLayoutUnit logicalWidth, std::optional<InlineLayoutUnit> trimmableWidth);
void appendTextContent(const InlineTextItem&, const RenderStyle&, InlineLayoutUnit logicalWidth);
void setHangingContentWidth(InlineLayoutUnit logicalWidth) { m_hangingContentWidth = logicalWidth; }
void reset();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include "LayoutState.h"
#include "Logging.h"
#include "RenderStyleInlines.h"
#include "TextOnlyLineBuilder.h"
#include "TextUtil.h"
#include <wtf/IsoMallocInlines.h>
#include <wtf/text/TextStream.h>
Expand All @@ -66,10 +67,11 @@ InlineFormattingContext::InlineFormattingContext(const ElementBox& formattingCon

InlineLayoutResult InlineFormattingContext::layoutInFlowAndFloatContent(const ConstraintsForInlineContent& constraints, InlineLayoutState& inlineLayoutState)
{
auto& floatingState = inlineLayoutState.parentBlockLayoutState().floatingState();
if (!root().hasInFlowChild()) {
// Float and/or out-of-flow only content does not support partial layout.
ASSERT(!m_lineDamage);
layoutFloatContentOnly(constraints, inlineLayoutState.parentBlockLayoutState().floatingState());
layoutFloatContentOnly(constraints, floatingState);
return { { }, InlineLayoutResult::Range::Full };
}

Expand All @@ -81,6 +83,7 @@ InlineLayoutResult InlineFormattingContext::layoutInFlowAndFloatContent(const Co

auto& inlineItems = inlineFormattingState.inlineItems();
auto needsLayoutRange = InlineItemRange { needsLayoutStartPosition, { inlineItems.size(), 0 } };

auto previousLine = [&]() -> std::optional<PreviousLine> {
if (!needsLayoutStartPosition)
return { };
Expand All @@ -90,7 +93,13 @@ InlineLayoutResult InlineFormattingContext::layoutInFlowAndFloatContent(const Co
// FIXME: We should be able to extract the last line information and provide it to layout as "previous line" (ends in line break and inline direction).
return PreviousLine { lastLineIndex, { }, { }, { }, { } };
};
return lineLayout(inlineItems, needsLayoutRange, previousLine(), constraints, inlineLayoutState);

if (TextOnlyLineBuilder::isEligibleForSimplifiedTextOnlyInlineLayout(root(), floatingState, formattingState())) {
auto simplifiedLineBuilder = TextOnlyLineBuilder { *this, constraints.horizontal(), inlineItems };
return lineLayout(simplifiedLineBuilder, inlineItems, needsLayoutRange, previousLine(), constraints, inlineLayoutState);
}
auto lineBuilder = LineBuilder { *this, inlineLayoutState, floatingState, constraints.horizontal(), inlineItems };
return lineLayout(lineBuilder, inlineItems, needsLayoutRange, previousLine(), constraints, inlineLayoutState);
}

void InlineFormattingContext::layoutOutOfFlowContent(const ConstraintsForInlineContent& constraints, InlineLayoutState& inlineLayoutState, const InlineDisplay::Content& inlineDisplayContent)
Expand Down Expand Up @@ -162,7 +171,7 @@ static bool mayExitFromPartialLayout(const InlineDamage& lineDamage, size_t line
return trailingContentFromPreviousLayout ? (!newContent.isEmpty() && *trailingContentFromPreviousLayout == newContent.last()) : false;
}

InlineLayoutResult InlineFormattingContext::lineLayout(const InlineItems& inlineItems, InlineItemRange needsLayoutRange, std::optional<PreviousLine> previousLine, const ConstraintsForInlineContent& constraints, InlineLayoutState& inlineLayoutState)
InlineLayoutResult InlineFormattingContext::lineLayout(AbstractLineBuilder& lineBuilder, const InlineItems& inlineItems, InlineItemRange needsLayoutRange, std::optional<PreviousLine> previousLine, const ConstraintsForInlineContent& constraints, InlineLayoutState& inlineLayoutState)
{
ASSERT(!needsLayoutRange.isEmpty());

Expand All @@ -171,17 +180,15 @@ InlineLayoutResult InlineFormattingContext::lineLayout(const InlineItems& inline
layoutResult.displayContent.boxes.reserveInitialCapacity(inlineItems.size());

auto isPartialLayout = m_lineDamage && m_lineDamage->start();
auto& floatingState = inlineLayoutState.parentBlockLayoutState().floatingState();
auto floatingContext = FloatingContext { *this, floatingState };
auto floatingContext = FloatingContext { *this, inlineLayoutState.parentBlockLayoutState().floatingState() };
auto lineLogicalTop = InlineLayoutUnit { constraints.logicalTop() };
auto previousLineEnd = std::optional<InlineItemPosition> { };
auto leadingInlineItemPosition = needsLayoutRange.start;

auto lineBuilder = LineBuilder { *this, inlineLayoutState, floatingState, constraints.horizontal(), inlineItems };
while (true) {

auto lineInitialRect = InlineRect { lineLogicalTop, constraints.horizontal().logicalLeft, constraints.horizontal().logicalWidth, formattingGeometry().initialLineHeight(!previousLine.has_value()) };
auto lineLayoutResult = lineBuilder.layoutInlineContent({ { leadingInlineItemPosition, needsLayoutRange.end }, lineInitialRect }, previousLine);
auto lineInput = LineInput { { leadingInlineItemPosition, needsLayoutRange.end }, lineInitialRect };
auto lineLayoutResult = lineBuilder.layoutInlineContent(lineInput, previousLine);

auto lineIndex = previousLine ? (previousLine->lineIndex + 1) : 0lu;
auto lineLogicalRect = createDisplayContentForLine(lineIndex, lineLayoutResult, constraints, inlineLayoutState, layoutResult.displayContent);
Expand Down Expand Up @@ -313,7 +320,7 @@ static LineEndingEllipsisPolicy lineEndingEllipsisPolicy(const RenderStyle& root
return LineEndingEllipsisPolicy::No;
}

InlineRect InlineFormattingContext::createDisplayContentForLine(size_t lineIndex, const LineBuilder::LayoutResult& lineLayoutResult, const ConstraintsForInlineContent& constraints, const InlineLayoutState& inlineLayoutState, InlineDisplay::Content& displayContent)
InlineRect InlineFormattingContext::createDisplayContentForLine(size_t lineIndex, const LineLayoutResult& lineLayoutResult, const ConstraintsForInlineContent& constraints, const InlineLayoutState& inlineLayoutState, InlineDisplay::Content& displayContent)
{
auto numberOfVisibleLinesAllowed = [&] () -> std::optional<size_t> {
if (auto lineClamp = inlineLayoutState.parentBlockLayoutState().lineClamp())
Expand Down Expand Up @@ -347,7 +354,7 @@ InlineRect InlineFormattingContext::createDisplayContentForLine(size_t lineIndex
return InlineFormattingGeometry::flipVisualRectToLogicalForWritingMode(displayContent.lines.last().lineBoxRect(), root().style().writingMode());
}

void InlineFormattingContext::resetGeometryForClampedContent(const InlineItemRange& needsDisplayContentRange, const LineBuilder::SuspendedFloatList& suspendedFloats, LayoutPoint topleft)
void InlineFormattingContext::resetGeometryForClampedContent(const InlineItemRange& needsDisplayContentRange, const LineLayoutResult::SuspendedFloatList& suspendedFloats, LayoutPoint topleft)
{
if (needsDisplayContentRange.isEmpty() && suspendedFloats.isEmpty())
return;
Expand Down
Loading

0 comments on commit ba2673d

Please sign in to comment.