diff --git a/Userland/Libraries/LibWeb/Painting/SVGGraphicsPaintable.cpp b/Userland/Libraries/LibWeb/Painting/SVGGraphicsPaintable.cpp index 4e5c3b1a61..45ba30acc5 100644 --- a/Userland/Libraries/LibWeb/Painting/SVGGraphicsPaintable.cpp +++ b/Userland/Libraries/LibWeb/Painting/SVGGraphicsPaintable.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace Web::Painting { @@ -35,9 +36,20 @@ Layout::SVGGraphicsBox const& SVGGraphicsPaintable::layout_box() const Optional SVGGraphicsPaintable::get_masking_area() const { auto const& graphics_element = verify_cast(*dom_node()); - if (auto mask = graphics_element.mask()) - return mask->resolve_masking_area(absolute_border_box_rect()); - return {}; + auto mask = graphics_element.mask(); + if (!mask) + return {}; + auto target_area = [&] { + auto mask_units = mask->mask_units(); + if (mask_units == SVG::MaskUnits::UserSpaceOnUse) { + auto const* svg_element = graphics_element.shadow_including_first_ancestor_of_type(); + return svg_element->paintable_box()->absolute_border_box_rect(); + } else { + VERIFY(mask_units == SVG::MaskUnits::ObjectBoundingBox); + return absolute_border_box_rect(); + } + }(); + return mask->resolve_masking_area(target_area); } static Gfx::Bitmap::MaskKind mask_type_to_gfx_mask_kind(CSS::MaskType mask_type) diff --git a/Userland/Libraries/LibWeb/SVG/SVGMaskElement.cpp b/Userland/Libraries/LibWeb/SVG/SVGMaskElement.cpp index d27d5b5b36..4160373b1b 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGMaskElement.cpp +++ b/Userland/Libraries/LibWeb/SVG/SVGMaskElement.cpp @@ -53,10 +53,6 @@ MaskUnits SVGMaskElement::mask_units() const CSSPixelRect SVGMaskElement::resolve_masking_area(CSSPixelRect const& mask_target) const { - if (mask_units() == SVG::MaskUnits::UserSpaceOnUse) { - dbgln("SVG: maskUnits=userSpaceOnUse is not supported"); - return {}; - } // TODO: Resolve this based on the x, y, width, and height of the mask. return mask_target.inflated(mask_target.size().scaled(CSSPixels(2) / 10)); }