Title: [287475] trunk/Source/WebCore
Revision
287475
Author
za...@apple.com
Date
2021-12-28 13:16:11 -0800 (Tue, 28 Dec 2021)

Log Message

[LFC][IFC] Do not let Layout geometry types leak into InlineDisplay::Box
https://bugs.webkit.org/show_bug.cgi?id=234728

Reviewed by Antti Koivisto.

InlineLayoutUnit -> float
InlineRect -> FloatRect
(This is also where we will eventually do some pixel snapping)

* layout/formattingContexts/inline/display/InlineDisplayBox.h:
(WebCore::InlineDisplay::Box::Box):
(WebCore::InlineDisplay::Box::rect const):
(WebCore::InlineDisplay::Box::inkOverflow const):
(WebCore::InlineDisplay::Box::top const):
(WebCore::InlineDisplay::Box::bottom const):
(WebCore::InlineDisplay::Box::left const):
(WebCore::InlineDisplay::Box::right const):
(WebCore::InlineDisplay::Box::width const):
(WebCore::InlineDisplay::Box::height const):
(WebCore::InlineDisplay::Box::moveVertically):
(WebCore::InlineDisplay::Box::moveHorizontally):
(WebCore::InlineDisplay::Box::adjustInkOverflow):
(WebCore::InlineDisplay::Box::setLeft):
(WebCore::InlineDisplay::Box::setRight):
(WebCore::InlineDisplay::Box::setRect):
(WebCore::InlineDisplay::Box::truncate):
* layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp:
(WebCore::Layout::computeBoxShadowInkOverflow):
(WebCore::Layout::InlineDisplayContentBuilder::appendAtomicInlineLevelDisplayBox):
(WebCore::Layout::InlineDisplayContentBuilder::appendInlineBoxDisplayBox):
(WebCore::Layout::InlineDisplayContentBuilder::appendSpanningInlineBoxDisplayBox):
(WebCore::Layout::InlineDisplayContentBuilder::adjustVisualGeometryForDisplayBox):
(WebCore::Layout::InlineDisplayContentBuilder::processOverflownRunsForEllipsis):
* layout/integration/LayoutIntegrationBoxTree.cpp:
(WebCore::LayoutIntegration::showInlineContent):
* layout/integration/LayoutIntegrationInlineContentBuilder.cpp:
(WebCore::LayoutIntegration::InlineContentBuilder::createDisplayLines const):
* layout/layouttree/LayoutTreeBuilder.cpp:
(WebCore::Layout::showInlineTreeAndRuns):
* platform/graphics/FloatRect.h:
(WebCore::FloatRect::inflate):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (287474 => 287475)


--- trunk/Source/WebCore/ChangeLog	2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/ChangeLog	2021-12-28 21:16:11 UTC (rev 287475)
@@ -1,3 +1,47 @@
+2021-12-28  Alan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] Do not let Layout geometry types leak into InlineDisplay::Box
+        https://bugs.webkit.org/show_bug.cgi?id=234728
+
+        Reviewed by Antti Koivisto.
+
+        InlineLayoutUnit -> float
+        InlineRect -> FloatRect
+        (This is also where we will eventually do some pixel snapping)
+
+        * layout/formattingContexts/inline/display/InlineDisplayBox.h:
+        (WebCore::InlineDisplay::Box::Box):
+        (WebCore::InlineDisplay::Box::rect const):
+        (WebCore::InlineDisplay::Box::inkOverflow const):
+        (WebCore::InlineDisplay::Box::top const):
+        (WebCore::InlineDisplay::Box::bottom const):
+        (WebCore::InlineDisplay::Box::left const):
+        (WebCore::InlineDisplay::Box::right const):
+        (WebCore::InlineDisplay::Box::width const):
+        (WebCore::InlineDisplay::Box::height const):
+        (WebCore::InlineDisplay::Box::moveVertically):
+        (WebCore::InlineDisplay::Box::moveHorizontally):
+        (WebCore::InlineDisplay::Box::adjustInkOverflow):
+        (WebCore::InlineDisplay::Box::setLeft):
+        (WebCore::InlineDisplay::Box::setRight):
+        (WebCore::InlineDisplay::Box::setRect):
+        (WebCore::InlineDisplay::Box::truncate):
+        * layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp:
+        (WebCore::Layout::computeBoxShadowInkOverflow):
+        (WebCore::Layout::InlineDisplayContentBuilder::appendAtomicInlineLevelDisplayBox):
+        (WebCore::Layout::InlineDisplayContentBuilder::appendInlineBoxDisplayBox):
+        (WebCore::Layout::InlineDisplayContentBuilder::appendSpanningInlineBoxDisplayBox):
+        (WebCore::Layout::InlineDisplayContentBuilder::adjustVisualGeometryForDisplayBox):
+        (WebCore::Layout::InlineDisplayContentBuilder::processOverflownRunsForEllipsis):
+        * layout/integration/LayoutIntegrationBoxTree.cpp:
+        (WebCore::LayoutIntegration::showInlineContent):
+        * layout/integration/LayoutIntegrationInlineContentBuilder.cpp:
+        (WebCore::LayoutIntegration::InlineContentBuilder::createDisplayLines const):
+        * layout/layouttree/LayoutTreeBuilder.cpp:
+        (WebCore::Layout::showInlineTreeAndRuns):
+        * platform/graphics/FloatRect.h:
+        (WebCore::FloatRect::inflate):
+
 2021-12-28  Sam Weinig  <wei...@apple.com>
 
         Support color interpolation methods for CSS Gradients

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h (287474 => 287475)


--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h	2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h	2021-12-28 21:16:11 UTC (rev 287475)
@@ -74,7 +74,7 @@
         First = 1 << 0,
         Last  = 1 << 1
     };
-    Box(size_t lineIndex, Type, const Layout::Box&, UBiDiLevel, const Layout::InlineRect&, const Layout::InlineRect& inkOverflow, Expansion, std::optional<Text> = std::nullopt, bool hasContent = true, OptionSet<PositionWithinInlineLevelBox> = { });
+    Box(size_t lineIndex, Type, const Layout::Box&, UBiDiLevel, const FloatRect&, const FloatRect& inkOverflow, Expansion, std::optional<Text> = std::nullopt, bool hasContent = true, OptionSet<PositionWithinInlineLevelBox> = { });
 
     bool isText() const { return m_type == Type::Text; }
     bool isEllipsis() const { return m_type == Type::Ellipsis; }
@@ -95,42 +95,42 @@
 
     bool hasContent() const { return m_hasContent; }
 
-    const Layout::InlineRect& rect() const { return m_physicalRect; }
-    const Layout::InlineRect& inkOverflow() const { return m_inkOverflow; }
+    const FloatRect& rect() const { return m_physicalRect; }
+    const FloatRect& inkOverflow() const { return m_inkOverflow; }
 
-    Layout::InlineLayoutUnit top() const { return rect().top(); }
-    Layout::InlineLayoutUnit bottom() const { return rect().bottom(); }
-    Layout::InlineLayoutUnit left() const { return rect().left(); }
-    Layout::InlineLayoutUnit right() const { return rect().right(); }
+    float top() const { return rect().y(); }
+    float bottom() const { return rect().maxY(); }
+    float left() const { return rect().x(); }
+    float right() const { return rect().maxX(); }
 
-    Layout::InlineLayoutUnit width() const { return rect().width(); }
-    Layout::InlineLayoutUnit height() const { return rect().height(); }
+    float width() const { return rect().width(); }
+    float height() const { return rect().height(); }
 
-    void moveVertically(Layout::InlineLayoutUnit offset)
+    void moveVertically(float offset)
     {
-        m_physicalRect.moveVertically(offset);
-        m_inkOverflow.moveVertically(offset);
+        m_physicalRect.move({ { }, offset });
+        m_inkOverflow.move({ { }, offset });
     }
-    void moveHorizontally(Layout::InlineLayoutUnit offset)
+    void moveHorizontally(float offset)
     {
-        m_physicalRect.moveHorizontally(offset);
-        m_inkOverflow.moveHorizontally(offset);
+        m_physicalRect.move({ offset, { } });
+        m_inkOverflow.move({ offset, { } });
     }
-    void adjustInkOverflow(const Layout::InlineRect& childBorderBox) { return m_inkOverflow.expandToContain(childBorderBox); }
-    void truncate(Layout::InlineLayoutUnit truncatedwidth = 0.f);
-    void setLeft(Layout::InlineLayoutUnit pysicalLeft)
+    void adjustInkOverflow(const FloatRect& childBorderBox) { return m_inkOverflow.uniteEvenIfEmpty(childBorderBox); }
+    void truncate(float truncatedwidth = 0.f);
+    void setLeft(float pysicalLeft)
     {
         auto offset = pysicalLeft - left();
-        m_physicalRect.setLeft(pysicalLeft);
-        m_inkOverflow.setLeft(m_inkOverflow.left() + offset);
+        m_physicalRect.setX(pysicalLeft);
+        m_inkOverflow.setX(m_inkOverflow.x() + offset);
     }
-    void setRight(Layout::InlineLayoutUnit physicalRight)
+    void setRight(float physicalRight)
     {
         auto offset = physicalRight - right();
-        m_physicalRect.setRight(physicalRight);
-        m_inkOverflow.setRight(m_inkOverflow.right() + offset);
+        m_physicalRect.shiftMaxXEdgeTo(physicalRight);
+        m_inkOverflow.shiftMaxXEdgeTo(m_inkOverflow.maxY() + offset);
     }
-    void setRect(const Layout::InlineRect& rect, const Layout::InlineRect& inkOverflow)
+    void setRect(const FloatRect& rect, const FloatRect& inkOverflow)
     {
         m_physicalRect = rect;
         m_inkOverflow = inkOverflow;
@@ -142,7 +142,7 @@
 
     struct Expansion {
         ExpansionBehavior behavior { DefaultExpansion };
-        Layout::InlineLayoutUnit horizontalExpansion { 0 };
+        float horizontalExpansion { 0 };
     };
     Expansion expansion() const { return m_expansion; }
 
@@ -163,8 +163,8 @@
     const Type m_type { Type::GenericInlineLevelBox };
     CheckedRef<const Layout::Box> m_layoutBox;
     UBiDiLevel m_bidiLevel { UBIDI_DEFAULT_LTR };
-    Layout::InlineRect m_physicalRect;
-    Layout::InlineRect m_inkOverflow;
+    FloatRect m_physicalRect;
+    FloatRect m_inkOverflow;
     bool m_hasContent : 1;
     bool m_isFirstForLayoutBox : 1;
     bool m_isLastForLayoutBox : 1;
@@ -172,7 +172,7 @@
     std::optional<Text> m_text;
 };
 
-inline Box::Box(size_t lineIndex, Type type, const Layout::Box& layoutBox, UBiDiLevel bidiLevel, const Layout::InlineRect& physicalRect, const Layout::InlineRect& inkOverflow, Expansion expansion, std::optional<Text> text, bool hasContent, OptionSet<PositionWithinInlineLevelBox> positionWithinInlineLevelBox)
+inline Box::Box(size_t lineIndex, Type type, const Layout::Box& layoutBox, UBiDiLevel bidiLevel, const FloatRect& physicalRect, const FloatRect& inkOverflow, Expansion expansion, std::optional<Text> text, bool hasContent, OptionSet<PositionWithinInlineLevelBox> positionWithinInlineLevelBox)
     : m_lineIndex(lineIndex)
     , m_type(type)
     , m_layoutBox(layoutBox)
@@ -196,10 +196,10 @@
 {
 }
 
-inline void Box::truncate(Layout::InlineLayoutUnit truncatedwidth)
+inline void Box::truncate(float truncatedwidth)
 {
     m_physicalRect.setWidth(truncatedwidth);
-    m_inkOverflow.setRight(m_physicalRect.right());
+    m_inkOverflow.shiftMaxXEdgeTo(m_physicalRect.maxY());
 }
 
 }

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp (287474 => 287475)


--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp	2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp	2021-12-28 21:16:11 UTC (rev 287475)
@@ -109,7 +109,7 @@
     return boxes;
 }
 
-static inline bool computeBoxShadowInkOverflow(const RenderStyle& style, InlineRect& inkOverflow)
+static inline bool computeBoxShadowInkOverflow(const RenderStyle& style, FloatRect& inkOverflow)
 {
     auto topBoxShadow = LayoutUnit { };
     auto bottomBoxShadow = LayoutUnit { };
@@ -120,7 +120,7 @@
     style.getBoxShadowInlineDirectionExtent(leftBoxShadow, rightBoxShadow);
     if (!topBoxShadow && !bottomBoxShadow && !leftBoxShadow && !rightBoxShadow)
         return false;
-    inkOverflow.inflate(InlineLayoutUnit { topBoxShadow }, InlineLayoutUnit { rightBoxShadow }, InlineLayoutUnit { bottomBoxShadow }, InlineLayoutUnit { leftBoxShadow });
+    inkOverflow.inflate(leftBoxShadow.toFloat(), topBoxShadow.toFloat(), rightBoxShadow.toFloat(), bottomBoxShadow.toFloat());
     return true;
 }
 
@@ -206,7 +206,7 @@
 
     auto& layoutBox = lineRun.layoutBox();
     auto inkOverflow = [&] {
-        auto inkOverflow = borderBoxRect;
+        auto inkOverflow = FloatRect { borderBoxRect };
         computeBoxShadowInkOverflow(!m_lineIndex ? layoutBox.firstLineStyle() : layoutBox.style(), inkOverflow);
         // Atomic inline box contribute to their inline box parents ink overflow at all times (e.g. <span><img></span>).
         m_contentHasInkOverflow = m_contentHasInkOverflow || &layoutBox.parent() != &root();
@@ -256,7 +256,7 @@
     }
 
     auto inkOverflow = [&] {
-        auto inkOverflow = inlineBoxBorderBox;
+        auto inkOverflow = FloatRect { inlineBoxBorderBox };
         m_contentHasInkOverflow = computeBoxShadowInkOverflow(!m_lineIndex ? layoutBox.firstLineStyle() : layoutBox.style(), inkOverflow) || m_contentHasInkOverflow;
         return inkOverflow;
     };
@@ -283,7 +283,7 @@
 
     auto& layoutBox = lineRun.layoutBox();
     auto inkOverflow = [&] {
-        auto inkOverflow = inlineBoxBorderBox;
+        auto inkOverflow = FloatRect { inlineBoxBorderBox };
         m_contentHasInkOverflow = computeBoxShadowInkOverflow(!m_lineIndex ? layoutBox.firstLineStyle() : layoutBox.style(), inkOverflow) || m_contentHasInkOverflow;
         return inkOverflow;
     };
@@ -523,7 +523,7 @@
     afterInlineBoxContent();
 
     auto computeInkOverflow = [&] {
-        auto inkOverflow = displayBox.rect();
+        auto inkOverflow = FloatRect { displayBox.rect() };
         m_contentHasInkOverflow = computeBoxShadowInkOverflow(!m_lineIndex ? layoutBox.firstLineStyle() : layoutBox.style(), inkOverflow) || m_contentHasInkOverflow;
         displayBox.adjustInkOverflow(inkOverflow);
     };
@@ -659,8 +659,7 @@
     auto& rootInlineBox = boxes[0];
     ASSERT(rootInlineBox.isRootInlineBox());
 
-    auto rootInlineBoxRect = rootInlineBox.rect();
-    if (rootInlineBoxRect.right() <= lineBoxRight) {
+    if (rootInlineBox.right() <= lineBoxRight) {
         ASSERT(boxes.last().right() <= lineBoxRight);
         return;
     }
@@ -705,7 +704,7 @@
     for (auto index = firstTruncatedBoxIndex + 1; index < boxes.size(); ++index)
         boxes[index].moveHorizontally(contentRight - boxes[index].left());
     // And append the ellipsis box as the trailing item.
-    auto ellispisBoxRect = InlineRect { rootInlineBoxRect.top(), contentRight, ellipsisWidth, rootInlineBoxRect.height() };
+    auto ellispisBoxRect = InlineRect { rootInlineBox.top(), contentRight, ellipsisWidth, rootInlineBox.height() };
     boxes.append({ m_lineIndex
         , InlineDisplay::Box::Type::Ellipsis
         , root()

Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp (287474 => 287475)


--- trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp	2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp	2021-12-28 21:16:11 UTC (rev 287475)
@@ -284,7 +284,7 @@
             else
                 stream << "Generic inline level box";
             stream
-                << " at (" << rect.left() << "," << rect.top() << ")"
+                << " at (" << rect.x() << "," << rect.y() << ")"
                 << " size (" << rect.width() << "x" << rect.height() << ")";
             stream.nextLine();
         };

Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp (287474 => 287475)


--- trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp	2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp	2021-12-28 21:16:11 UTC (rev 287475)
@@ -108,14 +108,13 @@
             if (layoutBox.isReplacedBox()) {
                 // Similar to LegacyInlineFlowBox::addReplacedChildOverflow.
                 auto& renderer = downcast<RenderBox>(m_boxTree.rendererForLayoutBox(layoutBox));
-                auto boxRect = box.rect();
                 if (!renderer.hasSelfPaintingLayer()) {
                     auto childInkOverflow = renderer.logicalVisualOverflowRectForPropagation(&renderer.parent()->style());
-                    childInkOverflow.move(boxRect.left(), boxRect.top());
+                    childInkOverflow.move(box.left(), box.top());
                     lineInkOverflowRect.unite(childInkOverflow);
                 }
                 auto childScrollableOverflow = renderer.logicalLayoutOverflowRectForPropagation(&renderer.parent()->style());
-                childScrollableOverflow.move(boxRect.left(), boxRect.top());
+                childScrollableOverflow.move(box.left(), box.top());
                 scrollableOverflowRect.unite(childScrollableOverflow);
             }
         }

Modified: trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp (287474 => 287475)


--- trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp	2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp	2021-12-28 21:16:11 UTC (rev 287475)
@@ -397,7 +397,7 @@
             else
                 stream << "Generic inline level box";
             stream
-                << " at (" << rect.left() << "," << rect.top() << ")"
+                << " at (" << rect.x() << "," << rect.y() << ")"
                 << " size (" << rect.width() << "x" << rect.height() << ")";
             stream.nextLine();
         };

Modified: trunk/Source/WebCore/platform/graphics/FloatRect.h (287474 => 287475)


--- trunk/Source/WebCore/platform/graphics/FloatRect.h	2021-12-28 20:36:28 UTC (rev 287474)
+++ trunk/Source/WebCore/platform/graphics/FloatRect.h	2021-12-28 21:16:11 UTC (rev 287475)
@@ -196,6 +196,7 @@
     }
     void inflate(float d) { inflateX(d); inflateY(d); }
     void inflate(FloatSize size) { inflateX(size.width()); inflateY(size.height()); }
+    void inflate(float dx, float dy, float dmaxX, float dmaxY);
 
     void scale(float s) { scale(s, s); }
     WEBCORE_EXPORT void scale(float sx, float sy);
@@ -294,6 +295,14 @@
     return *this == infiniteRect();
 }
 
+inline void FloatRect::inflate(float deltaX, float deltaY, float deltaMaxX, float deltaMaxY)
+{
+    setX(x() - deltaX);
+    setY(y() - deltaY);
+    setWidth(width() + deltaX + deltaMaxX);
+    setHeight(height() + deltaY + deltaMaxY);
+}
+
 FloatRect normalizeRect(const FloatRect&);
 WEBCORE_EXPORT FloatRect encloseRectToDevicePixels(const FloatRect&, float deviceScaleFactor);
 WEBCORE_EXPORT IntRect enclosingIntRect(const FloatRect&);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to