[LFC] Adjust static position with containing block's content box top/left
[WebKit-https.git] / Source / WebCore / layout / displaytree / DisplayBox.h
index 8c1e261e4c01993a702ce22a9c0a5d5558850dea..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,53 +160,67 @@ 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); }
 
-    struct Edges {
-        Edges() = default;
-        Edges(LayoutUnit top, LayoutUnit left, LayoutUnit bottom, LayoutUnit right)
-            : top(top)
-            , left(left)
-            , bottom(bottom)
-            , right(right)
-            { }
+    void setContentBoxHeight(LayoutUnit);
+    void setContentBoxWidth(LayoutUnit);
 
-        LayoutUnit top;
+    struct HorizontalEdges {
         LayoutUnit left;
-        LayoutUnit bottom;
         LayoutUnit right;
     };
-    void setMargin(Edges);
+
+    struct VerticalEdges {
+        LayoutUnit top;
+        LayoutUnit bottom;
+    };
+
+    struct Edges {
+        HorizontalEdges horizontal;
+        VerticalEdges vertical;
+    };
+
+    void setHorizontalMargin(HorizontalEdges);
+    void setVerticalMargin(VerticalEdges);
     void setBorder(Edges);
     void setPadding(Edges);
 
 #if !ASSERT_DISABLED
-    void invalidateMargin() { m_hasValidMargin = false; }
+    void invalidateMargin();
     void invalidateBorder() { m_hasValidBorder = false; }
     void invalidatePadding() { m_hasValidPadding = false; }
 
-    void setHasValidMargin() { m_hasValidMargin = true; }
+    void setHasValidVerticalMargin() { m_hasValidVerticalMargin = true; }
+    void setHasValidHorizontalMargin() { m_hasValidHorizontalMargin = true; }
+
     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;
     Edges m_padding;
 
 #if !ASSERT_DISABLED
-    bool m_hasValidMargin { false };
+    bool m_hasValidHorizontalMargin { false };
+    bool m_hasValidVerticalMargin { false };
     bool m_hasValidBorder { false };
     bool m_hasValidPadding { false };
+    bool m_hasValidContentHeight { false };
+    bool m_hasValidContentWidth { false };
 #endif
 };
 
@@ -221,6 +242,12 @@ inline void Box::Rect::setHasValidSize()
     m_hasValidWidth = true;
     m_hasValidHeight = true;
 }
+
+inline void Box::invalidateMargin()
+{
+    m_hasValidHorizontalMargin = false;
+    m_hasValidVerticalMargin = false;
+}
 #endif
 
 inline LayoutUnit Box::Rect::top() const
@@ -306,7 +333,6 @@ inline void Box::Rect::setWidth(LayoutUnit width)
 #if !ASSERT_DISABLED
     m_hasValidWidth = true;
 #endif
-    ASSERT(m_hasValidLeft);
     m_rect.setWidth(width);
 }
 
@@ -315,7 +341,6 @@ inline void Box::Rect::setHeight(LayoutUnit height)
 #if !ASSERT_DISABLED
     m_hasValidHeight = true;
 #endif
-    ASSERT(m_hasValidTop);
     m_rect.setHeight(height);
 }
 
@@ -351,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());
@@ -376,12 +413,48 @@ inline Box::Rect::operator LayoutRect() const
     return m_rect;
 }
 
-inline void Box::setMargin(Edges margin)
+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
+    setHasValidHorizontalMargin();
+#endif
+    m_margin.horizontal = margin;
+}
+
+inline void Box::setVerticalMargin(VerticalEdges margin)
 {
 #if !ASSERT_DISABLED
-    setHasValidMargin();
+    setHasValidVerticalMargin();
 #endif
-    m_margin = margin;
+    m_margin.vertical = margin;
 }
 
 inline void Box::setBorder(Edges border)
@@ -402,74 +475,74 @@ inline void Box::setPadding(Edges padding)
 
 inline LayoutUnit Box::marginTop() const
 {
-    ASSERT(m_hasValidMargin);
-    return m_margin.top;
+    ASSERT(m_hasValidVerticalMargin);
+    return m_margin.vertical.top;
 }
 
 inline LayoutUnit Box::marginLeft() const
 {
-    ASSERT(m_hasValidMargin);
-    return m_margin.left;
+    ASSERT(m_hasValidHorizontalMargin);
+    return m_margin.horizontal.left;
 }
 
 inline LayoutUnit Box::marginBottom() const
 {
-    ASSERT(m_hasValidMargin);
-    return m_margin.bottom;
+    ASSERT(m_hasValidVerticalMargin);
+    return m_margin.vertical.bottom;
 }
 
 inline LayoutUnit Box::marginRight() const
 {
-    ASSERT(m_hasValidMargin);
-    return m_margin.right;
+    ASSERT(m_hasValidHorizontalMargin);
+    return m_margin.horizontal.right;
 }
 
 inline LayoutUnit Box::paddingTop() const
 {
     ASSERT(m_hasValidPadding);
-    return m_padding.top;
+    return m_padding.vertical.top;
 }
 
 inline LayoutUnit Box::paddingLeft() const
 {
     ASSERT(m_hasValidPadding);
-    return m_padding.left;
+    return m_padding.horizontal.left;
 }
 
 inline LayoutUnit Box::paddingBottom() const
 {
     ASSERT(m_hasValidPadding);
-    return m_padding.bottom;
+    return m_padding.vertical.bottom;
 }
 
 inline LayoutUnit Box::paddingRight() const
 {
     ASSERT(m_hasValidPadding);
-    return m_padding.right;
+    return m_padding.horizontal.right;
 }
 
 inline LayoutUnit Box::borderTop() const
 {
     ASSERT(m_hasValidBorder);
-    return m_border.top;
+    return m_border.vertical.top;
 }
 
 inline LayoutUnit Box::borderLeft() const
 {
     ASSERT(m_hasValidBorder);
-    return m_border.left;
+    return m_border.horizontal.left;
 }
 
 inline LayoutUnit Box::borderBottom() const
 {
     ASSERT(m_hasValidBorder);
-    return m_border.bottom;
+    return m_border.vertical.bottom;
 }
 
 inline LayoutUnit Box::borderRight() const
 {
     ASSERT(m_hasValidBorder);
-    return m_border.right;
+    return m_border.horizontal.right;
 }
 
 }