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. + + + +