Title: [289471] trunk/Source/WebCore
Revision
289471
Author
za...@apple.com
Date
2022-02-09 08:13:55 -0800 (Wed, 09 Feb 2022)

Log Message

[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):

Modified Paths

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()
         };
     };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to