From f52df06a2a77f0fb38ab87d5385bb52562f512b3 Mon Sep 17 00:00:00 2001 From: Psychpsyo Date: Mon, 12 May 2025 20:34:35 +0200 Subject: [PATCH] LibWeb: Do not forget to unapply empty masks --- Libraries/LibWeb/Painting/SVGSVGPaintable.cpp | 29 +++++++++++-------- .../Ref/expected/svg/zero-area-mask-ref.html | 3 ++ .../LibWeb/Ref/input/svg/zero-area-mask.html | 7 +++++ 3 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 Tests/LibWeb/Ref/expected/svg/zero-area-mask-ref.html create mode 100644 Tests/LibWeb/Ref/input/svg/zero-area-mask.html diff --git a/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp b/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp index 250bf5d3af4..084a9a6bb6e 100644 --- a/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp +++ b/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp @@ -63,7 +63,7 @@ void SVGSVGPaintable::paint_svg_box(PaintContext& context, PaintableBox const& s Gfx::CompositingAndBlendingOperator compositing_and_blending_operator = mix_blend_mode_to_compositing_and_blending_operator(computed_values.mix_blend_mode()); - auto needs_to_save_state = computed_values.isolation() == CSS::Isolation::Isolate || compositing_and_blending_operator != Gfx::CompositingAndBlendingOperator::Normal || svg_box.has_css_transform() || svg_box.get_masking_area().has_value(); + auto needs_to_save_state = computed_values.isolation() == CSS::Isolation::Isolate || compositing_and_blending_operator != Gfx::CompositingAndBlendingOperator::Normal || svg_box.has_css_transform() || masking_area.has_value(); if (needs_to_save_state) { context.display_list_recorder().save(); @@ -88,22 +88,27 @@ void SVGSVGPaintable::paint_svg_box(PaintContext& context, PaintableBox const& s context.display_list_recorder().apply_transform(transform_origin.scaled(to_device_pixels_scale), matrix_with_scaled_translation(transform_matrix, to_device_pixels_scale)); } + bool skip_painting = false; if (masking_area.has_value()) { - if (masking_area->is_empty()) - return; - auto mask_bitmap = svg_box.calculate_mask(context, *masking_area); - if (mask_bitmap) { - auto source_paintable_rect = context.enclosing_device_rect(*masking_area).template to_type(); - auto origin = source_paintable_rect.location(); - context.display_list_recorder().apply_mask_bitmap(origin, mask_bitmap.release_nonnull(), *svg_box.get_mask_type()); + if (masking_area->is_empty()) { + skip_painting = true; + } else { + auto mask_bitmap = svg_box.calculate_mask(context, *masking_area); + if (mask_bitmap) { + auto source_paintable_rect = context.enclosing_device_rect(*masking_area).template to_type(); + auto origin = source_paintable_rect.location(); + context.display_list_recorder().apply_mask_bitmap(origin, mask_bitmap.release_nonnull(), *svg_box.get_mask_type()); + } } } - svg_box.before_paint(context, PaintPhase::Foreground); - svg_box.paint(context, PaintPhase::Foreground); - svg_box.after_paint(context, PaintPhase::Foreground); + if (!skip_painting) { + svg_box.before_paint(context, PaintPhase::Foreground); + svg_box.paint(context, PaintPhase::Foreground); + svg_box.after_paint(context, PaintPhase::Foreground); - paint_descendants(context, svg_box, phase); + paint_descendants(context, svg_box, phase); + } if (compositing_and_blending_operator != Gfx::CompositingAndBlendingOperator::Normal) { context.display_list_recorder().restore(); diff --git a/Tests/LibWeb/Ref/expected/svg/zero-area-mask-ref.html b/Tests/LibWeb/Ref/expected/svg/zero-area-mask-ref.html new file mode 100644 index 00000000000..90f9b079e46 --- /dev/null +++ b/Tests/LibWeb/Ref/expected/svg/zero-area-mask-ref.html @@ -0,0 +1,3 @@ + +This should be visible. + diff --git a/Tests/LibWeb/Ref/input/svg/zero-area-mask.html b/Tests/LibWeb/Ref/input/svg/zero-area-mask.html new file mode 100644 index 00000000000..dc9c4b6f105 --- /dev/null +++ b/Tests/LibWeb/Ref/input/svg/zero-area-mask.html @@ -0,0 +1,7 @@ + + +This should be visible. + + + +