Remove the SVG elements' attributes macros
[WebKit-https.git] / Source / WebCore / svg / SVGFEBlendElement.cpp
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) 2014 Adobe Systems Incorporated. All rights reserved.
5  * Copyright (C) 2018 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #include "config.h"
24 #include "SVGFEBlendElement.h"
25
26 #include "FEBlend.h"
27 #include "FilterEffect.h"
28 #include "SVGFilterBuilder.h"
29 #include "SVGNames.h"
30 #include <wtf/IsoMallocInlines.h>
31
32 namespace WebCore {
33
34 WTF_MAKE_ISO_ALLOCATED_IMPL(SVGFEBlendElement);
35
36 inline SVGFEBlendElement::SVGFEBlendElement(const QualifiedName& tagName, Document& document)
37     : SVGFilterPrimitiveStandardAttributes(tagName, document)
38 {
39     ASSERT(hasTagName(SVGNames::feBlendTag));
40     registerAttributes();
41 }
42
43 Ref<SVGFEBlendElement> SVGFEBlendElement::create(const QualifiedName& tagName, Document& document)
44 {
45     return adoptRef(*new SVGFEBlendElement(tagName, document));
46 }
47     
48 void SVGFEBlendElement::registerAttributes()
49 {
50     auto& registry = attributeRegistry();
51     if (!registry.isEmpty())
52         return;
53     registry.registerAttribute<SVGNames::inAttr, &SVGFEBlendElement::m_in1>();
54     registry.registerAttribute<SVGNames::in2Attr, &SVGFEBlendElement::m_in2>();
55     registry.registerAttribute<SVGNames::modeAttr, BlendMode, &SVGFEBlendElement::m_mode>();
56 }
57
58 void SVGFEBlendElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
59 {
60     if (name == SVGNames::modeAttr) {
61         BlendMode mode = BlendMode::Normal;
62         if (parseBlendMode(value, mode))
63             m_mode.setValue(mode);
64         return;
65     }
66
67     if (name == SVGNames::inAttr) {
68         m_in1.setValue(value);
69         return;
70     }
71
72     if (name == SVGNames::in2Attr) {
73         m_in2.setValue(value);
74         return;
75     }
76
77     SVGFilterPrimitiveStandardAttributes::parseAttribute(name, value);
78 }
79
80 bool SVGFEBlendElement::setFilterEffectAttribute(FilterEffect* effect, const QualifiedName& attrName)
81 {
82     FEBlend* blend = static_cast<FEBlend*>(effect);
83     if (attrName == SVGNames::modeAttr)
84         return blend->setBlendMode(mode());
85
86     ASSERT_NOT_REACHED();
87     return false;
88 }
89
90 void SVGFEBlendElement::svgAttributeChanged(const QualifiedName& attrName)
91 {
92     if (attrName == SVGNames::modeAttr) {
93         InstanceInvalidationGuard guard(*this);
94         primitiveAttributeChanged(attrName);
95         return;
96     }
97
98     if (attrName == SVGNames::inAttr || attrName == SVGNames::in2Attr) {
99         InstanceInvalidationGuard guard(*this);
100         invalidate();
101         return;
102     }
103
104     SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
105 }
106
107 RefPtr<FilterEffect> SVGFEBlendElement::build(SVGFilterBuilder* filterBuilder, Filter& filter)
108 {
109     auto input1 = filterBuilder->getEffectById(in1());
110     auto input2 = filterBuilder->getEffectById(in2());
111
112     if (!input1 || !input2)
113         return nullptr;
114
115     RefPtr<FilterEffect> effect = FEBlend::create(filter, mode());
116     FilterEffectVector& inputEffects = effect->inputEffects();
117     inputEffects.reserveCapacity(2);
118     inputEffects.append(input1);
119     inputEffects.append(input2);    
120     return effect;
121 }
122
123 }