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
8562b0e33b
This commit is contained in:
Aliaksandr Kalenik 2024-12-01 15:26:20 +01:00 committed by Andreas Kling
parent 30c8510725
commit c94b4316e7
Notes: github-actions[bot] 2024-12-01 15:13:10 +00:00
2 changed files with 18 additions and 4 deletions

View file

@ -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();
}

View file

@ -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()) {