CTTE: Convert more of SVG to use references
[WebKit-https.git] / Source / WebCore / svg / SVGFilterPrimitiveStandardAttributes.cpp
1 /*
2  * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
4  * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
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 #include "config.h"
23
24 #if ENABLE(SVG) && ENABLE(FILTERS)
25 #include "SVGFilterPrimitiveStandardAttributes.h"
26
27 #include "Attribute.h"
28 #include "FilterEffect.h"
29 #include "RenderSVGResourceFilterPrimitive.h"
30 #include "SVGElement.h"
31 #include "SVGElementInstance.h"
32 #include "SVGFilterBuilder.h"
33 #include "SVGLength.h"
34 #include "SVGNames.h"
35 #include "SVGUnitTypes.h"
36
37 namespace WebCore {
38
39 // Animated property definitions
40 DEFINE_ANIMATED_LENGTH(SVGFilterPrimitiveStandardAttributes, SVGNames::xAttr, X, x)
41 DEFINE_ANIMATED_LENGTH(SVGFilterPrimitiveStandardAttributes, SVGNames::yAttr, Y, y)
42 DEFINE_ANIMATED_LENGTH(SVGFilterPrimitiveStandardAttributes, SVGNames::widthAttr, Width, width)
43 DEFINE_ANIMATED_LENGTH(SVGFilterPrimitiveStandardAttributes, SVGNames::heightAttr, Height, height)
44 DEFINE_ANIMATED_STRING(SVGFilterPrimitiveStandardAttributes, SVGNames::resultAttr, Result, result)
45
46 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGFilterPrimitiveStandardAttributes)
47     REGISTER_LOCAL_ANIMATED_PROPERTY(x)
48     REGISTER_LOCAL_ANIMATED_PROPERTY(y)
49     REGISTER_LOCAL_ANIMATED_PROPERTY(width)
50     REGISTER_LOCAL_ANIMATED_PROPERTY(height)
51     REGISTER_LOCAL_ANIMATED_PROPERTY(result)
52     REGISTER_PARENT_ANIMATED_PROPERTIES(SVGElement)
53 END_REGISTER_ANIMATED_PROPERTIES
54
55 SVGFilterPrimitiveStandardAttributes::SVGFilterPrimitiveStandardAttributes(const QualifiedName& tagName, Document& document)
56     : SVGElement(tagName, document)
57     , m_x(LengthModeWidth, "0%")
58     , m_y(LengthModeHeight, "0%")
59     , m_width(LengthModeWidth, "100%")
60     , m_height(LengthModeHeight, "100%")
61 {
62     // Spec: If the x/y attribute is not specified, the effect is as if a value of "0%" were specified.
63     // Spec: If the width/height attribute is not specified, the effect is as if a value of "100%" were specified.
64     registerAnimatedPropertiesForSVGFilterPrimitiveStandardAttributes();
65 }
66
67 bool SVGFilterPrimitiveStandardAttributes::isSupportedAttribute(const QualifiedName& attrName)
68 {
69     DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ());
70     if (supportedAttributes.isEmpty()) {
71         supportedAttributes.add(SVGNames::xAttr);
72         supportedAttributes.add(SVGNames::yAttr);
73         supportedAttributes.add(SVGNames::widthAttr);
74         supportedAttributes.add(SVGNames::heightAttr);
75         supportedAttributes.add(SVGNames::resultAttr);
76     }
77     return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName);
78 }
79
80 void SVGFilterPrimitiveStandardAttributes::parseAttribute(const QualifiedName& name, const AtomicString& value)
81 {
82     SVGParsingError parseError = NoError;
83
84     if (!isSupportedAttribute(name))
85         SVGElement::parseAttribute(name, value);
86     else if (name == SVGNames::xAttr)
87         setXBaseValue(SVGLength::construct(LengthModeWidth, value, parseError));
88     else if (name == SVGNames::yAttr)
89         setYBaseValue(SVGLength::construct(LengthModeHeight, value, parseError));
90     else if (name == SVGNames::widthAttr)
91         setWidthBaseValue(SVGLength::construct(LengthModeWidth, value, parseError));
92     else if (name == SVGNames::heightAttr)
93         setHeightBaseValue(SVGLength::construct(LengthModeHeight, value, parseError));
94     else if (name == SVGNames::resultAttr)
95         setResultBaseValue(value);
96     else
97         ASSERT_NOT_REACHED();
98
99     reportAttributeParsingError(parseError, name, value);
100 }
101
102 bool SVGFilterPrimitiveStandardAttributes::setFilterEffectAttribute(FilterEffect*, const QualifiedName&)
103 {
104     // When all filters support this method, it will be changed to a pure virtual method.
105     ASSERT_NOT_REACHED();
106     return false;
107 }
108
109 void SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(const QualifiedName& attrName)
110 {
111     if (!isSupportedAttribute(attrName)) {
112         SVGElement::svgAttributeChanged(attrName);
113         return;
114     }
115
116     SVGElementInstance::InvalidationGuard invalidationGuard(this);    
117     invalidate();
118 }
119
120 void SVGFilterPrimitiveStandardAttributes::childrenChanged(const ChildChange& change)
121 {
122     SVGElement::childrenChanged(change);
123
124     if (change.source == ChildChangeSourceParser)
125         return;
126     invalidate();
127 }
128
129 void SVGFilterPrimitiveStandardAttributes::setStandardAttributes(FilterEffect* filterEffect) const
130 {
131     ASSERT(filterEffect);
132     if (!filterEffect)
133         return;
134
135     if (hasAttribute(SVGNames::xAttr))
136         filterEffect->setHasX(true);
137     if (hasAttribute(SVGNames::yAttr))
138         filterEffect->setHasY(true);
139     if (hasAttribute(SVGNames::widthAttr))
140         filterEffect->setHasWidth(true);
141     if (hasAttribute(SVGNames::heightAttr))
142         filterEffect->setHasHeight(true);
143 }
144
145 RenderElement* SVGFilterPrimitiveStandardAttributes::createRenderer(PassRef<RenderStyle> style)
146 {
147     return new RenderSVGResourceFilterPrimitive(*this, std::move(style));
148 }
149
150 bool SVGFilterPrimitiveStandardAttributes::rendererIsNeeded(const RenderStyle& style)
151 {
152     if (parentNode() && (parentNode()->hasTagName(SVGNames::filterTag)))
153         return SVGElement::rendererIsNeeded(style);
154
155     return false;
156 }
157
158 void invalidateFilterPrimitiveParent(SVGElement* element)
159 {
160     if (!element)
161         return;
162
163     ContainerNode* parent = element->parentNode();
164
165     if (!parent)
166         return;
167
168     RenderElement* renderer = parent->renderer();
169     if (!renderer || !renderer->isSVGResourceFilterPrimitive())
170         return;
171
172     RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer, false);
173 }
174
175 }
176
177 #endif // ENABLE(SVG)