[LFC] Adjust static position with containing block's content box top/left
[WebKit-https.git] / Source / WebCore / layout / displaytree / DisplayBox.h
index f717aa5c47e9ad8b80bc92340e2d69f87dc1baf6..ba2d866a1a21be4b54acaf9ba64428c631838788 100644 (file)
@@ -80,6 +80,9 @@ public:
         void shiftTopTo(LayoutUnit);
         void shiftBottomTo(LayoutUnit);
 
+        void moveHorizontally(LayoutUnit);
+        void moveVertically(LayoutUnit);
+
         void expand(LayoutUnit, LayoutUnit);
 
         Rect clone() const;
@@ -110,19 +113,18 @@ public:
 
     ~Box();
 
-    Rect rect() const { return m_rect; }
-
-    LayoutUnit top() const { return m_rect.top(); }
-    LayoutUnit left() const { return m_rect.left(); }
-    LayoutUnit bottom() const { return m_rect.bottom(); }
-    LayoutUnit right() const { return m_rect.right(); }
+    LayoutUnit top() const { return m_topLeft.y(); }
+    LayoutUnit left() const { return m_topLeft.x(); }
+    LayoutUnit bottom() const { return top() + height(); }
+    LayoutUnit right() const { return left() + width(); }
 
-    LayoutPoint topLeft() const { return m_rect.topLeft(); }
-    LayoutPoint bottomRight() const { return m_rect.bottomRight(); }
+    LayoutPoint topLeft() const { return m_topLeft; }
+    LayoutPoint bottomRight() const { return { right(), bottom() }; }
 
-    LayoutSize size() const { return m_rect.size(); }
-    LayoutUnit width() const { return m_rect.width(); }
-    LayoutUnit height() const { return m_rect.height(); }
+    LayoutSize size() const { return { width(), height() }; }
+    LayoutUnit width() const { return borderLeft() + paddingLeft() + contentBoxWidth() + paddingRight() + borderRight(); }
+    LayoutUnit height() const { return borderTop() + paddingTop() + contentBoxHeight() + paddingBottom() + borderBottom(); }
+    LayoutRect rect() const { return { left(), top(), width(), height() }; }
 
     LayoutUnit marginTop() const;
     LayoutUnit marginLeft() const;
@@ -139,6 +141,11 @@ public:
     LayoutUnit paddingBottom() const;
     LayoutUnit paddingRight() const;
 
+    LayoutUnit contentBoxTop() const { return borderTop() + paddingTop(); }
+    LayoutUnit contentBoxLeft() const { return borderLeft() + paddingLeft(); }
+    LayoutUnit contentBoxHeight() const;
+    LayoutUnit contentBoxWidth() const;
+
     Rect marginBox() const;
     Rect borderBox() const;
     Rect paddingBox() const;
@@ -153,12 +160,14 @@ private:
         BoxSizing boxSizing { BoxSizing::ContentBox };
     };
 
-    void setTopLeft(const LayoutPoint& topLeft) { m_rect.setTopLeft(topLeft); }
-    void setTop(LayoutUnit top) { m_rect.setTop(top); }
-    void setLeft(LayoutUnit left) { m_rect.setLeft(left); }
-    void setWidth(LayoutUnit width) { m_rect.setWidth(width); }
-    void setHeight(LayoutUnit height) { m_rect.setHeight(height); }
-    void setSize(const LayoutSize& size) { m_rect.setSize(size); }
+    void setTopLeft(const LayoutPoint& topLeft) { m_topLeft = topLeft; }
+    void setTop(LayoutUnit top) { m_topLeft.setY(top); }
+    void setLeft(LayoutUnit left) { m_topLeft.setX(left); }
+    void moveHorizontally(LayoutUnit offset) { m_topLeft.move(offset, { }); }
+    void moveVertically(LayoutUnit offset) { m_topLeft.move({ }, offset); }
+
+    void setContentBoxHeight(LayoutUnit);
+    void setContentBoxWidth(LayoutUnit);
 
     struct HorizontalEdges {
         LayoutUnit left;
@@ -190,11 +199,16 @@ private:
 
     void setHasValidBorder() { m_hasValidBorder = true; }
     void setHasValidPadding() { m_hasValidPadding = true; }
+
+    void setHasValidContentHeight() { m_hasValidContentHeight = true; }
+    void setHasValidContentWidth() { m_hasValidContentWidth = true; }
 #endif
 
     const Style m_style;
 
-    Rect m_rect;
+    LayoutPoint m_topLeft;
+    LayoutUnit m_contentWidth;
+    LayoutUnit m_contentHeight;
 
     Edges m_margin;
     Edges m_border;
@@ -205,6 +219,8 @@ private:
     bool m_hasValidVerticalMargin { false };
     bool m_hasValidBorder { false };
     bool m_hasValidPadding { false };
+    bool m_hasValidContentHeight { false };
+    bool m_hasValidContentWidth { false };
 #endif
 };
 
@@ -317,7 +333,6 @@ inline void Box::Rect::setWidth(LayoutUnit width)
 #if !ASSERT_DISABLED
     m_hasValidWidth = true;
 #endif
-    ASSERT(m_hasValidLeft);
     m_rect.setWidth(width);
 }
 
@@ -326,7 +341,6 @@ inline void Box::Rect::setHeight(LayoutUnit height)
 #if !ASSERT_DISABLED
     m_hasValidHeight = true;
 #endif
-    ASSERT(m_hasValidTop);
     m_rect.setHeight(height);
 }
 
@@ -362,6 +376,18 @@ inline void Box::Rect::shiftBottomTo(LayoutUnit bottom)
     m_rect.shiftMaxYEdgeTo(bottom);
 }
 
+inline void Box::Rect::moveHorizontally(LayoutUnit offset)
+{
+    ASSERT(m_hasValidLeft);
+    m_rect.move(offset, { });
+}
+
+inline void Box::Rect::moveVertically(LayoutUnit offset)
+{
+    ASSERT(m_hasValidTop);
+    m_rect.move({ }, offset);
+}
+
 inline void Box::Rect::expand(LayoutUnit width, LayoutUnit height)
 {
     ASSERT(hasValidGeometry());
@@ -387,6 +413,34 @@ inline Box::Rect::operator LayoutRect() const
     return m_rect;
 }
 
+inline void Box::setContentBoxHeight(LayoutUnit height)
+{ 
+#if !ASSERT_DISABLED
+    setHasValidContentHeight();
+#endif
+    m_contentHeight = height;
+}
+
+inline void Box::setContentBoxWidth(LayoutUnit width)
+{ 
+#if !ASSERT_DISABLED
+    setHasValidContentWidth();
+#endif
+    m_contentWidth = width;
+}
+
+inline LayoutUnit Box::contentBoxHeight() const
+{
+    ASSERT(m_hasValidContentHeight);
+    return m_contentHeight;
+}
+
+inline LayoutUnit Box::contentBoxWidth() const
+{
+    ASSERT(m_hasValidContentWidth);
+    return m_contentWidth;
+}
+
 inline void Box::setHorizontalMargin(HorizontalEdges margin)
 {
 #if !ASSERT_DISABLED