Diff
Modified: trunk/Source/WebCore/ChangeLog (289470 => 289471)
--- trunk/Source/WebCore/ChangeLog 2022-02-09 15:58:58 UTC (rev 289470)
+++ trunk/Source/WebCore/ChangeLog 2022-02-09 16:13:55 UTC (rev 289471)
@@ -1,3 +1,36 @@
+2022-02-09 Alan Bujtas <za...@apple.com>
+
+ [LFC][IFC] Transform root inline box's logical rect based on the writing mode
+ https://bugs.webkit.org/show_bug.cgi?id=236341
+
+ Reviewed by Antti Koivisto.
+
+ Make sure root inline box has the correct _visual_ coordinates in vertical mode.
+ (also let's rename DisplayLine::contentLeft to contentLogicalOffset. The emphasis is on _logical_. It helps to catch incorrect use (even this diff has a couple)).
+
+ * layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp:
+ (WebCore::Layout::InlineDisplayContentBuilder::build):
+ (WebCore::Layout::InlineDisplayContentBuilder::processNonBidiContent):
+ (WebCore::Layout::InlineDisplayContentBuilder::processBidiContent):
+ (WebCore::Layout::InlineDisplayContentBuilder::flipRootInlineBoxRectToVisualForWritingMode const):
+ * layout/formattingContexts/inline/display/InlineDisplayContentBuilder.h:
+ * layout/formattingContexts/inline/display/InlineDisplayLine.h:
+ (WebCore::InlineDisplay::Line::contentLogicalOffset const):
+ (WebCore::InlineDisplay::Line::Line):
+ (WebCore::InlineDisplay::Line::contentLeft const): Deleted.
+ * layout/integration/InlineIteratorBoxModernPath.h:
+ (WebCore::InlineIterator::BoxModernPath::createTextRun const):
+ * layout/integration/InlineIteratorLineModernPath.h:
+ (WebCore::InlineIterator::LineIteratorModernPath::contentLogicalLeft const):
+ * layout/integration/LayoutIntegrationInlineContentBuilder.cpp:
+ (WebCore::LayoutIntegration::InlineContentBuilder::createDisplayLines const):
+ * layout/integration/LayoutIntegrationLine.h:
+ (WebCore::LayoutIntegration::Line::Line):
+ (WebCore::LayoutIntegration::Line::contentLogicalOffset const):
+ (WebCore::LayoutIntegration::Line::contentLeft const): Deleted.
+ * layout/integration/LayoutIntegrationPagination.cpp:
+ (WebCore::LayoutIntegration::makeAdjustedContent):
+
2022-02-09 Lauro Moura <lmo...@igalia.com>
Non-unified build fixes after r289247
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp (289470 => 289471)
--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp 2022-02-09 15:58:58 UTC (rev 289470)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp 2022-02-09 16:13:55 UTC (rev 289471)
@@ -94,10 +94,7 @@
m_lineIndex = lineIndex;
// Every line starts with a root box, even the empty ones.
- auto rootInlineBoxRect = lineBox.logicalRectForRootInlineBox();
- rootInlineBoxRect.moveHorizontally(displayLine.left() + displayLine.contentLeft());
- rootInlineBoxRect.moveVertically(displayLine.top());
-
+ auto rootInlineBoxRect = flipRootInlineBoxRectToVisualForWritingMode(lineBox.logicalRectForRootInlineBox(), displayLine, root().style().writingMode());
boxes.append({ m_lineIndex, InlineDisplay::Box::Type::RootInlineBox, root(), UBIDI_DEFAULT_LTR, rootInlineBoxRect, rootInlineBoxRect, { }, { }, lineBox.rootInlineBox().hasContent() });
auto contentNeedsBidiReordering = !lineContent.visualOrderList.isEmpty();
@@ -327,7 +324,7 @@
ASSERT(lineContent.inlineBaseDirection == TextDirection::LTR || !hasContent);
#endif
auto writingMode = root().style().writingMode();
- auto contentStartInVisualOrder = movePointHorizontallyForWritingMode(displayLine.topLeft(), displayLine.contentLeft(), writingMode);
+ auto contentStartInVisualOrder = movePointHorizontallyForWritingMode(displayLine.topLeft(), displayLine.contentLogicalOffset(), writingMode);
for (auto& lineRun : lineContent.runs) {
auto& layoutBox = lineRun.layoutBox();
@@ -545,7 +542,7 @@
ancestorStack.push({ }, root());
auto writingMode = root().style().writingMode();
- auto contentStartInVisualOrder = displayLine.left() + displayLine.contentLeft();
+ auto contentStartInVisualOrder = displayLine.left() + displayLine.contentLogicalOffset();
auto hasInlineBox = false;
auto createDisplayBoxesInVisualOrder = [&] {
@@ -801,6 +798,28 @@
return logicalRect;
}
+InlineRect InlineDisplayContentBuilder::flipRootInlineBoxRectToVisualForWritingMode(const InlineRect& rootInlineBoxLogicalRect, const InlineDisplay::Line& displayLine, WritingMode writingMode) const
+{
+ switch (writingMode) {
+ case WritingMode::TopToBottom: {
+ auto visualRect = rootInlineBoxLogicalRect;
+ visualRect.moveBy({ displayLine.left() + displayLine.contentLogicalOffset(), displayLine.top() });
+ return visualRect;
+ }
+ case WritingMode::LeftToRight:
+ case WritingMode::RightToLeft: {
+ // See InlineFormattingGeometry for more info.
+ auto visualRect = InlineRect { rootInlineBoxLogicalRect.left(), rootInlineBoxLogicalRect.top(), rootInlineBoxLogicalRect.height(), rootInlineBoxLogicalRect.width() };
+ visualRect.moveBy({ displayLine.left(), displayLine.top() + displayLine.contentLogicalOffset() });
+ return visualRect;
+ }
+ default:
+ ASSERT_NOT_REACHED();
+ break;
+ }
+ return rootInlineBoxLogicalRect;
+}
+
InlineLayoutPoint InlineDisplayContentBuilder::movePointHorizontallyForWritingMode(const InlineLayoutPoint& logicalPoint, InlineLayoutUnit horizontalOffset, WritingMode writingMode) const
{
auto visualPoint = logicalPoint;
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.h (289470 => 289471)
--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.h 2022-02-09 15:58:58 UTC (rev 289470)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.h 2022-02-09 16:13:55 UTC (rev 289471)
@@ -67,6 +67,7 @@
size_t ensureDisplayBoxForContainer(const ContainerBox&, DisplayBoxTree&, AncestorStack&, DisplayBoxes&);
InlineRect flipLogicalRectToVisualForWritingModeWithinLine(const InlineRect& logicalRect, const InlineRect& lineLogicalRect, WritingMode) const;
+ InlineRect flipRootInlineBoxRectToVisualForWritingMode(const InlineRect& rootInlineBoxLogicalRect, const InlineDisplay::Line&, WritingMode) const;
InlineLayoutPoint movePointHorizontallyForWritingMode(const InlineLayoutPoint& topLeft, InlineLayoutUnit horizontalOffset, WritingMode) const;
const ContainerBox& root() const { return m_formattingContextRoot; }
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLine.h (289470 => 289471)
--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLine.h 2022-02-09 15:58:58 UTC (rev 289470)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLine.h 2022-02-09 16:13:55 UTC (rev 289471)
@@ -41,7 +41,7 @@
float top { 0 };
float bottom { 0 };
};
- Line(const FloatRect& lineBoxRect, const FloatRect& scrollableOverflow, EnclosingTopAndBottom, float aligmentBaseline, FontBaseline baselineType, float contentLeft, float contentLogicalWidth);
+ Line(const FloatRect& lineBoxRect, const FloatRect& scrollableOverflow, EnclosingTopAndBottom, float aligmentBaseline, FontBaseline baselineType, float contentLogicalOffset, float contentLogicalWidth);
float left() const { return m_lineBoxRect.x(); }
float right() const { return m_lineBoxRect.maxX(); }
@@ -58,7 +58,7 @@
float baseline() const { return m_aligmentBaseline; }
FontBaseline baselineType() const { return m_baselineType; }
- float contentLeft() const { return m_contentLeft; }
+ float contentLogicalOffset() const { return m_contentLogicalOffset; }
float contentLogicalWidth() const { return m_contentLogicalWidth; }
void moveVertically(float offset) { m_lineBoxRect.move({ { }, offset }); }
@@ -72,17 +72,17 @@
// the layout bounds of the inline level boxes which may be different when line-height is present.
EnclosingTopAndBottom m_enclosingTopAndBottom;
float m_aligmentBaseline { 0 };
- float m_contentLeft { 0 };
+ float m_contentLogicalOffset { 0 };
float m_contentLogicalWidth { 0 };
FontBaseline m_baselineType { AlphabeticBaseline };
};
-inline Line::Line(const FloatRect& lineBoxRect, const FloatRect& scrollableOverflow, EnclosingTopAndBottom enclosingTopAndBottom, float aligmentBaseline, FontBaseline baselineType, float contentLeft, float contentLogicalWidth)
+inline Line::Line(const FloatRect& lineBoxRect, const FloatRect& scrollableOverflow, EnclosingTopAndBottom enclosingTopAndBottom, float aligmentBaseline, FontBaseline baselineType, float contentLogicalOffset, float contentLogicalWidth)
: m_lineBoxRect(lineBoxRect)
, m_scrollableOverflow(scrollableOverflow)
, m_enclosingTopAndBottom(enclosingTopAndBottom)
, m_aligmentBaseline(aligmentBaseline)
- , m_contentLeft(contentLeft)
+ , m_contentLogicalOffset(contentLogicalOffset)
, m_contentLogicalWidth(contentLogicalWidth)
, m_baselineType(baselineType)
{
Modified: trunk/Source/WebCore/layout/integration/InlineIteratorBoxModernPath.h (289470 => 289471)
--- trunk/Source/WebCore/layout/integration/InlineIteratorBoxModernPath.h 2022-02-09 15:58:58 UTC (rev 289470)
+++ trunk/Source/WebCore/layout/integration/InlineIteratorBoxModernPath.h 2022-02-09 16:13:55 UTC (rev 289471)
@@ -83,7 +83,7 @@
auto& style = box().style();
auto expansion = box().expansion();
auto rect = this->rect();
- auto xPos = rect.x() - (line().lineBoxLeft() + line().contentLeft());
+ auto xPos = rect.x() - (line().lineBoxLeft() + line().contentLogicalOffset());
auto textForRun = [&] {
if (mode == CreateTextRunMode::Editing || !hasHyphen())
Modified: trunk/Source/WebCore/layout/integration/InlineIteratorLineModernPath.h (289470 => 289471)
--- trunk/Source/WebCore/layout/integration/InlineIteratorLineModernPath.h 2022-02-09 15:58:58 UTC (rev 289470)
+++ trunk/Source/WebCore/layout/integration/InlineIteratorLineModernPath.h 2022-02-09 16:13:55 UTC (rev 289471)
@@ -62,7 +62,7 @@
// FIXME: Implement or replace.
LayoutUnit selectionBottom() const { return bottom(); }
- float contentLogicalLeft() const { return line().lineBoxLeft() + line().contentLeft(); }
+ float contentLogicalLeft() const { return line().lineBoxLeft() + line().contentLogicalOffset(); }
float contentLogicalRight() const { return contentLogicalLeft() + line().contentLogicalWidth(); }
float y() const { return lineBoxTop(); }
float logicalHeight() const { return lineBoxBottom() - lineBoxTop(); }
Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp (289470 => 289471)
--- trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp 2022-02-09 15:58:58 UTC (rev 289470)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp 2022-02-09 16:13:55 UTC (rev 289471)
@@ -137,7 +137,7 @@
}
auto boxCount = boxIndex - firstBoxIndex;
- inlineContent.lines.append({ firstBoxIndex, boxCount, FloatRect { line.lineBoxRect() }, line.enclosingTopAndBottom().top, line.enclosingTopAndBottom().bottom, scrollableOverflowRect, lineInkOverflowRect, line.baseline(), line.baselineType(), line.contentLeft(), line.contentLogicalWidth() });
+ inlineContent.lines.append({ firstBoxIndex, boxCount, FloatRect { line.lineBoxRect() }, line.enclosingTopAndBottom().top, line.enclosingTopAndBottom().bottom, scrollableOverflowRect, lineInkOverflowRect, line.baseline(), line.baselineType(), line.contentLogicalOffset(), line.contentLogicalWidth() });
}
}
Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationLine.h (289470 => 289471)
--- trunk/Source/WebCore/layout/integration/LayoutIntegrationLine.h 2022-02-09 15:58:58 UTC (rev 289470)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationLine.h 2022-02-09 16:13:55 UTC (rev 289471)
@@ -36,7 +36,7 @@
class Line {
WTF_MAKE_FAST_ALLOCATED;
public:
- Line(size_t firstBoxIndex, size_t boxCount, const FloatRect& lineBoxRect, float enclosingContentTop, float enclosingContentBottom, const FloatRect& scrollableOverflow, const FloatRect& inkOverflow, float baseline, FontBaseline baselineType, float contentLeft, float contentLogicalWidth)
+ Line(size_t firstBoxIndex, size_t boxCount, const FloatRect& lineBoxRect, float enclosingContentTop, float enclosingContentBottom, const FloatRect& scrollableOverflow, const FloatRect& inkOverflow, float baseline, FontBaseline baselineType, float contentLogicalOffset, float contentLogicalWidth)
: m_firstBoxIndex(firstBoxIndex)
, m_boxCount(boxCount)
, m_lineBoxRect(lineBoxRect)
@@ -45,7 +45,7 @@
, m_scrollableOverflow(scrollableOverflow)
, m_inkOverflow(inkOverflow)
, m_baseline(baseline)
- , m_contentLeft(contentLeft)
+ , m_contentLogicalOffset(contentLogicalOffset)
, m_contentLogicalWidth(contentLogicalWidth)
, m_baselineType(baselineType)
{
@@ -68,7 +68,7 @@
float baseline() const { return m_baseline; }
FontBaseline baselineType() const { return m_baselineType; }
- float contentLeft() const { return m_contentLeft; }
+ float contentLogicalOffset() const { return m_contentLogicalOffset; }
float contentLogicalWidth() const { return m_contentLogicalWidth; }
private:
@@ -84,7 +84,7 @@
FloatRect m_scrollableOverflow;
FloatRect m_inkOverflow;
float m_baseline { 0 };
- float m_contentLeft { 0 };
+ float m_contentLogicalOffset { 0 };
float m_contentLogicalWidth { 0 };
FontBaseline m_baselineType { AlphabeticBaseline };
};
Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationPagination.cpp (289470 => 289471)
--- trunk/Source/WebCore/layout/integration/LayoutIntegrationPagination.cpp 2022-02-09 15:58:58 UTC (rev 289470)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationPagination.cpp 2022-02-09 16:13:55 UTC (rev 289471)
@@ -136,7 +136,7 @@
moveVertically(line.inkOverflow(), offset),
line.baseline(),
line.baselineType(),
- line.contentLeft(),
+ line.contentLogicalOffset(),
line.contentLogicalWidth()
};
};