From c94b4316e7a2f3d245f9b48f77a7f9f76785218a Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Sun, 1 Dec 2024 15:26:20 +0100 Subject: [PATCH] LibWeb: Use separate restore() for each ApplyFilters display list item ApplyFilter internally calls canvas.saveLayer() which requires a matching canvas.restore() to be called. Fixes painting on https://supabase.com/ regressed by 8562b0e33bd057d9aa5be1b6ce66db039bc99576 --- Libraries/LibWeb/Painting/SVGSVGPaintable.cpp | 12 +++++++++--- Libraries/LibWeb/Painting/StackingContext.cpp | 10 +++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp b/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp index 596bd32563b..b349618bed3 100644 --- a/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp +++ b/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp @@ -55,9 +55,9 @@ void SVGSVGPaintable::paint_svg_box(PaintContext& context, PaintableBox const& s { auto const& computed_values = svg_box.computed_values(); - auto filters = svg_box.computed_values().filter(); + auto const& filter = svg_box.computed_values().filter(); auto masking_area = svg_box.get_masking_area(); - auto needs_to_save_state = computed_values.opacity() < 1 || svg_box.has_css_transform() || svg_box.get_masking_area().has_value() || !filters.is_none(); + auto needs_to_save_state = computed_values.opacity() < 1 || svg_box.has_css_transform() || svg_box.get_masking_area().has_value(); if (needs_to_save_state) { context.display_list_recorder().save(); @@ -67,7 +67,9 @@ void SVGSVGPaintable::paint_svg_box(PaintContext& context, PaintableBox const& s context.display_list_recorder().apply_opacity(computed_values.opacity()); } - context.display_list_recorder().apply_filters(filters); + if (!filter.is_none()) { + context.display_list_recorder().apply_filters(filter); + } if (svg_box.has_css_transform()) { auto transform_matrix = svg_box.transform(); @@ -93,6 +95,10 @@ void SVGSVGPaintable::paint_svg_box(PaintContext& context, PaintableBox const& s paint_descendants(context, svg_box, phase); + if (!filter.is_none()) { + context.display_list_recorder().restore(); + } + if (needs_to_save_state) { context.display_list_recorder().restore(); } diff --git a/Libraries/LibWeb/Painting/StackingContext.cpp b/Libraries/LibWeb/Painting/StackingContext.cpp index d624158365e..9fc6cdba64b 100644 --- a/Libraries/LibWeb/Painting/StackingContext.cpp +++ b/Libraries/LibWeb/Painting/StackingContext.cpp @@ -327,7 +327,11 @@ void StackingContext::paint(PaintContext& context) const context.display_list_recorder().push_scroll_frame_id(*paintable_box().scroll_frame_id()); } context.display_list_recorder().push_stacking_context(push_stacking_context_params); - context.display_list_recorder().apply_filters(paintable_box().computed_values().filter()); + + auto const& filter = computed_values.filter(); + if (!filter.is_none()) { + context.display_list_recorder().apply_filters(paintable_box().computed_values().filter()); + } if (auto mask_image = computed_values.mask_image()) { auto mask_display_list = DisplayList::create(); @@ -348,6 +352,10 @@ void StackingContext::paint(PaintContext& context) const } } + if (!filter.is_none()) { + context.display_list_recorder().restore(); + } + paint_internal(context); context.display_list_recorder().pop_stacking_context(); if (paintable_box().scroll_frame_id().has_value()) {