LibWeb: Parse and apply fill-opacity attribute to SVG paths

This is needed to fix the rendering of the Street View directional
controls (which have paths with various levels of opacity set by
this attribute).
This commit is contained in:
MacDue 2023-04-10 12:25:00 +01:00 committed by Andreas Kling
parent 62f087bd56
commit 6482c306f1
Notes: sideshowbarker 2024-07-17 07:08:37 +09:00
2 changed files with 16 additions and 1 deletions

View file

@ -26,6 +26,14 @@ JS::ThrowCompletionOr<void> SVGGraphicsElement::initialize(JS::Realm& realm)
return {};
}
void SVGGraphicsElement::parse_attribute(DeprecatedFlyString const& name, DeprecatedString const& value)
{
SVGElement::parse_attribute(name, value);
if (name == "fill-opacity"sv) {
m_fill_opacity = AttributeParser::parse_length(value);
}
}
void SVGGraphicsElement::apply_presentational_hints(CSS::StyleProperties& style) const
{
CSS::Parser::ParsingContext parsing_context { document() };
@ -54,7 +62,9 @@ Optional<Gfx::Color> SVGGraphicsElement::fill_color() const
return {};
// FIXME: In the working-draft spec, `fill` is intended to be a shorthand, with `fill-color`
// being what we actually want to use. But that's not final or widely supported yet.
return layout_node()->computed_values().fill();
return layout_node()->computed_values().fill().map([&](Gfx::Color color) {
return color.with_alpha(m_fill_opacity.value_or(1) * 255);
});
}
Optional<Gfx::Color> SVGGraphicsElement::stroke_color() const

View file

@ -20,7 +20,10 @@ class SVGGraphicsElement : public SVGElement {
public:
virtual void apply_presentational_hints(CSS::StyleProperties&) const override;
virtual void parse_attribute(DeprecatedFlyString const& name, DeprecatedString const& value) override;
Optional<Gfx::Color> fill_color() const;
Gfx::Painter::WindingRule fill_rule() const;
Optional<Gfx::Color> stroke_color() const;
Optional<float> stroke_width() const;
@ -28,6 +31,8 @@ protected:
SVGGraphicsElement(DOM::Document&, DOM::QualifiedName);
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
Optional<float> m_fill_opacity = {};
};
}