浏览代码

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).
MacDue 2 年之前
父节点
当前提交
6482c306f1

+ 11 - 1
Userland/Libraries/LibWeb/SVG/SVGGraphicsElement.cpp

@@ -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

+ 5 - 0
Userland/Libraries/LibWeb/SVG/SVGGraphicsElement.h

@@ -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 = {};
 };
 
 }