Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp (281803 => 281804)
--- trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp 2021-08-31 15:19:19 UTC (rev 281803)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp 2021-08-31 15:24:36 UTC (rev 281804)
@@ -67,70 +67,35 @@
void InlineContentBuilder::build(const Layout::InlineFormattingState& inlineFormattingState, InlineContent& inlineContent) const
{
- createDisplayRuns(inlineFormattingState.lines(), inlineFormattingState.runs(), inlineContent);
+ createDisplayRuns(inlineFormattingState.runs(), inlineContent);
createDisplayLines(inlineFormattingState.lines(), inlineContent);
}
-void InlineContentBuilder::createDisplayRuns(const Layout::InlineLines& lines, const Layout::InlineRuns& runs, InlineContent& inlineContent) const
+void InlineContentBuilder::createDisplayRuns(const Layout::InlineRuns& runs, InlineContent& inlineContent) const
{
if (runs.isEmpty())
return;
- auto createDisplayBoxRun = [&](auto& run) {
- if (run.isRootInlineBox()) {
+ inlineContent.runs.reserveInitialCapacity(runs.size());
+ for (auto& run : runs) {
+ if (auto text = run.text()) {
+ inlineContent.runs.append({ run.lineIndex(), run.layoutBox(), run.logicalRect(), run.inkOverflow(), Run::Expansion { run.expansion().behavior, run.expansion().horizontalExpansion }
+ , Run::Text { text->start(), text->length(), text->originalContent(), text->renderedContent(), text->hasHyphen() } });
+ } else if (!run.isRootInlineBox()) {
// FIXME: Teach the run iterators to ignore the root inline box runs.
- return;
- }
- auto& layoutBox = run.layoutBox();
- auto lineIndex = run.lineIndex();
- auto runRect = FloatRect { run.logicalRect() };
- auto inkOverflow = FloatRect { run.inkOverflow() };
- auto& geometry = m_layoutState.geometryForBox(layoutBox);
- runRect.setSize({ geometry.borderBoxWidth(), geometry.borderBoxHeight() });
- if (lines[lineIndex].needsIntegralPosition()) {
- runRect.setY(roundToInt(runRect.y()));
- inkOverflow.setY(roundToInt(inkOverflow.y()));
- }
- if (run.isInlineBox()) {
- auto runRect = run.logicalRect();
- auto hasScrollableContent = [&] {
- // In standards mode, inline boxes always start with an imaginary strut.
- return m_layoutState.inStandardsMode() || run.hasContent() || geometry.horizontalBorder() || (geometry.horizontalPadding() && geometry.horizontalPadding().value());
- };
- inlineContent.nonRootInlineBoxes.append({ lineIndex, layoutBox, runRect, hasScrollableContent() });
- if (!run.isLineSpanning()) {
+ auto& geometry = m_layoutState.geometryForBox(run.layoutBox());
+ if (!run.isInlineBox() || !run.isLineSpanning()) {
// FIXME: Run iterators with (text)runs spanning over multiple lines expect no "in-between" runs (e.g. line spanning or root inline boxes).
- inlineContent.runs.append({ lineIndex, layoutBox, runRect, inkOverflow, { }, { } });
+ inlineContent.runs.append({ run.lineIndex(), run.layoutBox(), run.logicalRect(), run.inkOverflow(), { }, { } });
}
- } else
- inlineContent.runs.append({ lineIndex, layoutBox, runRect, inkOverflow, { }, { } });
- };
-
- auto createDisplayTextRun = [&](auto& run) {
- auto& layoutBox = run.layoutBox();
- auto lineIndex = run.lineIndex();
- auto runRect = FloatRect { run.logicalRect() };
- auto inkOverflow = FloatRect { run.inkOverflow() };
- if (lines[lineIndex].needsIntegralPosition()) {
- runRect.setY(roundToInt(runRect.y()));
- inkOverflow.setY(roundToInt(inkOverflow.y()));
+ if (run.isInlineBox()) {
+ auto hasScrollableContent = [&] {
+ // In standards mode, inline boxes always start with an imaginary strut.
+ return m_layoutState.inStandardsMode() || run.hasContent() || geometry.horizontalBorder() || (geometry.horizontalPadding() && geometry.horizontalPadding().value());
+ };
+ inlineContent.nonRootInlineBoxes.append({ run.lineIndex(), run.layoutBox(), run.logicalRect(), hasScrollableContent() });
+ }
}
-
- auto text = run.text();
- inlineContent.runs.append({ lineIndex
- , layoutBox
- , runRect
- , inkOverflow
- , Run::Expansion { run.expansion().behavior, run.expansion().horizontalExpansion }
- , Run::Text { text->start(), text->length(), text->originalContent(), text->renderedContent(), text->hasHyphen() } });
- };
-
- inlineContent.runs.reserveInitialCapacity(runs.size());
- for (auto& run : runs) {
- if (run.text())
- createDisplayTextRun(run);
- else
- createDisplayBoxRun(run);
}
}
@@ -152,6 +117,9 @@
// Collect overflow from runs.
for (; runIndex < runs.size() && runs[runIndex].lineIndex() == lineIndex; ++runIndex) {
auto& run = runs[runIndex];
+ if (line.needsIntegralPosition())
+ run.setVerticalPositionIntegral();
+
lineInkOverflowRect.unite(run.inkOverflow());
auto& layoutBox = run.layoutBox();
@@ -173,6 +141,10 @@
// Collect scrollable overflow from inline boxes. All other inline level boxes (e.g atomic inline level boxes) stretch the line.
while (inlineBoxIndex < nonRootInlineBoxes.size() && nonRootInlineBoxes[inlineBoxIndex].lineIndex() == lineIndex) {
auto& inlineBox = nonRootInlineBoxes[inlineBoxIndex++];
+
+ if (line.needsIntegralPosition())
+ inlineBox.setVerticalPositionIntegral();
+
if (inlineBox.hasScrollableContent())
scrollableOverflowRect.unite(inlineBox.rect());
}
Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.h (281803 => 281804)
--- trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.h 2021-08-31 15:19:19 UTC (rev 281803)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.h 2021-08-31 15:24:36 UTC (rev 281804)
@@ -46,7 +46,7 @@
void build(const Layout::InlineFormattingState&, InlineContent&) const;
private:
- void createDisplayRuns(const Layout::InlineLines&, const Layout::InlineRuns&, InlineContent&) const;
+ void createDisplayRuns(const Layout::InlineRuns&, InlineContent&) const;
void createDisplayLines(const Layout::InlineLines&, InlineContent&) const;
const Layout::LayoutState& m_layoutState;
Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationRun.h (281803 => 281804)
--- trunk/Source/WebCore/layout/integration/LayoutIntegrationRun.h 2021-08-31 15:19:19 UTC (rev 281803)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationRun.h 2021-08-31 15:24:36 UTC (rev 281804)
@@ -66,6 +66,8 @@
const FloatRect& logicalRect() const { return m_rect; }
const FloatRect& inkOverflow() const { return m_inkOverflow; }
+ void setVerticalPositionIntegral();
+
std::optional<Text>& text() { return m_text; }
const std::optional<Text>& text() const { return m_text; }
// FIXME: This information should be preserved at Run construction time.
@@ -116,6 +118,12 @@
{
}
+inline void Run::setVerticalPositionIntegral()
+{
+ m_rect.setY(roundToInt(m_rect.y()));
+ m_inkOverflow.setY(roundToInt(m_inkOverflow.y()));
}
+
}
+}
#endif