Define the type of SVGPropertyOwnerRegistry for all SVG elements
[WebKit-https.git] / Source / WebCore / svg / SVGFECompositeElement.h
1 /*
2  * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
4  * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21
22 #pragma once
23
24 #include "FEComposite.h"
25 #include "SVGAnimatedEnumeration.h"
26 #include "SVGAnimatedNumber.h"
27 #include "SVGFilterPrimitiveStandardAttributes.h"
28
29 namespace WebCore {
30
31 template<>
32 inline unsigned SVGIDLEnumLimits<CompositeOperationType>::highestExposedEnumValue() { return FECOMPOSITE_OPERATOR_ARITHMETIC; }
33
34 template<>
35 struct SVGPropertyTraits<CompositeOperationType> {
36     static unsigned highestEnumValue() { return FECOMPOSITE_OPERATOR_LIGHTER; }
37
38     static String toString(CompositeOperationType type)
39     {
40         switch (type) {
41         case FECOMPOSITE_OPERATOR_UNKNOWN:
42             return emptyString();
43         case FECOMPOSITE_OPERATOR_OVER:
44             return "over"_s;
45         case FECOMPOSITE_OPERATOR_IN:
46             return "in"_s;
47         case FECOMPOSITE_OPERATOR_OUT:
48             return "out"_s;
49         case FECOMPOSITE_OPERATOR_ATOP:
50             return "atop"_s;
51         case FECOMPOSITE_OPERATOR_XOR:
52             return "xor"_s;
53         case FECOMPOSITE_OPERATOR_ARITHMETIC:
54             return "arithmetic"_s;
55         case FECOMPOSITE_OPERATOR_LIGHTER:
56             return "lighter"_s;
57         }
58
59         ASSERT_NOT_REACHED();
60         return emptyString();
61     }
62
63     static CompositeOperationType fromString(const String& value)
64     {
65         if (value == "over")
66             return FECOMPOSITE_OPERATOR_OVER;
67         if (value == "in")
68             return FECOMPOSITE_OPERATOR_IN;
69         if (value == "out")
70             return FECOMPOSITE_OPERATOR_OUT;
71         if (value == "atop")
72             return FECOMPOSITE_OPERATOR_ATOP;
73         if (value == "xor")
74             return FECOMPOSITE_OPERATOR_XOR;
75         if (value == "arithmetic")
76             return FECOMPOSITE_OPERATOR_ARITHMETIC;
77         if (value == "lighter")
78             return FECOMPOSITE_OPERATOR_LIGHTER;
79         return FECOMPOSITE_OPERATOR_UNKNOWN;
80     }
81 };
82
83 class SVGFECompositeElement final : public SVGFilterPrimitiveStandardAttributes {
84     WTF_MAKE_ISO_ALLOCATED(SVGFECompositeElement);
85 public:
86     static Ref<SVGFECompositeElement> create(const QualifiedName&, Document&);
87
88     String in1() { return m_in1.currentValue(attributeOwnerProxy()); }
89     String in2() { return m_in2.currentValue(attributeOwnerProxy()); }
90     CompositeOperationType svgOperator() const { return m_svgOperator.currentValue(attributeOwnerProxy()); }
91     float k1() const { return m_k1.currentValue(attributeOwnerProxy()); }
92     float k2() const { return m_k2.currentValue(attributeOwnerProxy()); }
93     float k3() const { return m_k3.currentValue(attributeOwnerProxy()); }
94     float k4() const { return m_k4.currentValue(attributeOwnerProxy()); }
95
96     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
97     RefPtr<SVGAnimatedString> in2Animated() { return m_in2.animatedProperty(attributeOwnerProxy()); }
98     RefPtr<SVGAnimatedEnumeration> svgOperatorAnimated() { return m_svgOperator.animatedProperty(attributeOwnerProxy()); }
99     RefPtr<SVGAnimatedNumber> k1Animated() { return m_k1.animatedProperty(attributeOwnerProxy()); }
100     RefPtr<SVGAnimatedNumber> k2Animated() { return m_k2.animatedProperty(attributeOwnerProxy()); }
101     RefPtr<SVGAnimatedNumber> k3Animated() { return m_k3.animatedProperty(attributeOwnerProxy()); }
102     RefPtr<SVGAnimatedNumber> k4Animated() { return m_k4.animatedProperty(attributeOwnerProxy()); }
103
104 private:
105     SVGFECompositeElement(const QualifiedName&, Document&);
106
107     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGFECompositeElement, SVGFilterPrimitiveStandardAttributes>;
108     static AttributeOwnerProxy::AttributeRegistry& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
109     static void registerAttributes();
110     const SVGAttributeOwnerProxy& attributeOwnerProxy() const final { return m_attributeOwnerProxy; }
111
112     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGFECompositeElement, SVGFilterPrimitiveStandardAttributes>;
113     const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
114
115     static bool isKnownAttribute(const QualifiedName& attributeName)
116     {
117         return AttributeOwnerProxy::isKnownAttribute(attributeName) || PropertyRegistry::isKnownAttribute(attributeName);
118     }
119
120     void parseAttribute(const QualifiedName&, const AtomicString&) override;
121     void svgAttributeChanged(const QualifiedName&) override;
122
123     bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
124     RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) override;
125
126     AttributeOwnerProxy m_attributeOwnerProxy { *this };
127     PropertyRegistry m_propertyRegistry { *this };
128     SVGAnimatedStringAttribute m_in1;
129     SVGAnimatedStringAttribute m_in2;
130     SVGAnimatedEnumerationAttribute<CompositeOperationType> m_svgOperator { FECOMPOSITE_OPERATOR_OVER };
131     SVGAnimatedNumberAttribute m_k1;
132     SVGAnimatedNumberAttribute m_k2;
133     SVGAnimatedNumberAttribute m_k3;
134     SVGAnimatedNumberAttribute m_k4;
135 };
136
137 } // namespace WebCore