Explorar o código

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 %!s(int64=3) %!d(string=hai) anos
pai
achega
ec49c8fefd

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

@@ -234,4 +234,22 @@ StackingContext* Box::enclosing_stacking_context()
     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; }
 
+    virtual void before_children_paint(PaintContext&, PaintPhase);
+    virtual void after_children_paint(PaintContext&, PaintPhase);
+
 protected:
     Box(DOM::Document& document, DOM::Node* node, NonnullRefPtr<CSS::StyleProperties> style)
         : NodeWithStyleAndBoxModelMetrics(document, node, move(style))