Browse Source

LibWeb: Clip descendants of boxes with overflow:hidden

This is a very limited implementation of overflow:hidden, but since it's
easy to cover this common scenario, let's do it.
Andreas Kling 3 years ago
parent
commit
ec49c8fefd
2 changed files with 21 additions and 0 deletions
  1. 18 0
      Userland/Libraries/LibWeb/Layout/Box.cpp
  2. 3 0
      Userland/Libraries/LibWeb/Layout/Box.h

+ 18 - 0
Userland/Libraries/LibWeb/Layout/Box.cpp

@@ -234,4 +234,22 @@ StackingContext* Box::enclosing_stacking_context()
     VERIFY_NOT_REACHED();
     VERIFY_NOT_REACHED();
 }
 }
 
 
+void Box::before_children_paint(PaintContext& context, PaintPhase phase)
+{
+    NodeWithStyleAndBoxModelMetrics::before_children_paint(context, phase);
+    // FIXME: Support more overflow variations.
+    if (computed_values().overflow_x() == CSS::Overflow::Hidden && computed_values().overflow_y() == CSS::Overflow::Hidden) {
+        context.painter().save();
+        context.painter().add_clip_rect(enclosing_int_rect(bordered_rect()));
+    }
+}
+
+void Box::after_children_paint(PaintContext& context, PaintPhase phase)
+{
+    NodeWithStyleAndBoxModelMetrics::after_children_paint(context, phase);
+    // FIXME: Support more overflow variations.
+    if (computed_values().overflow_x() == CSS::Overflow::Hidden && computed_values().overflow_y() == CSS::Overflow::Hidden)
+        context.painter().restore();
+}
+
 }
 }

+ 3 - 0
Userland/Libraries/LibWeb/Layout/Box.h

@@ -150,6 +150,9 @@ public:
 
 
     void clear_overflow_data() { m_overflow_data = nullptr; }
     void clear_overflow_data() { m_overflow_data = nullptr; }
 
 
+    virtual void before_children_paint(PaintContext&, PaintPhase);
+    virtual void after_children_paint(PaintContext&, PaintPhase);
+
 protected:
 protected:
     Box(DOM::Document& document, DOM::Node* node, NonnullRefPtr<CSS::StyleProperties> style)
     Box(DOM::Document& document, DOM::Node* node, NonnullRefPtr<CSS::StyleProperties> style)
         : NodeWithStyleAndBoxModelMetrics(document, node, move(style))
         : NodeWithStyleAndBoxModelMetrics(document, node, move(style))