ceda9f5d5c008f44c9636559d28821fa803b35a3
[WebKit-https.git] / Source / WebCore / svg / SVGFilterElement.h
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) 2006 Samuel Weinig <sam.weinig@gmail.com>
5  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
6  * Copyright (C) 2018 Apple Inc. All rights reserved.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  */
23
24 #pragma once
25
26 #include "SVGAnimatedEnumeration.h"
27 #include "SVGAnimatedLength.h"
28 #include "SVGElement.h"
29 #include "SVGExternalResourcesRequired.h"
30 #include "SVGURIReference.h"
31 #include "SVGUnitTypes.h"
32
33 namespace WebCore {
34
35 class SVGFilterElement final : public SVGElement, public SVGExternalResourcesRequired, public SVGURIReference {
36     WTF_MAKE_ISO_ALLOCATED(SVGFilterElement);
37 public:
38     static Ref<SVGFilterElement> create(const QualifiedName&, Document&);
39
40     SVGUnitTypes::SVGUnitType filterUnits() const { return m_filterUnits.currentValue(attributeOwnerProxy()); }
41     SVGUnitTypes::SVGUnitType primitiveUnits() const { return m_primitiveUnits.currentValue(attributeOwnerProxy()); }
42     const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
43     const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
44     const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
45     const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
46
47     RefPtr<SVGAnimatedEnumeration> filterUnitsAnimated() { return m_filterUnits.animatedProperty(attributeOwnerProxy()); }
48     RefPtr<SVGAnimatedEnumeration> primitiveUnitsAnimated() { return m_primitiveUnits.animatedProperty(attributeOwnerProxy()); }
49     RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
50     RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
51     RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
52     RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
53
54 private:
55     SVGFilterElement(const QualifiedName&, Document&);
56
57     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGFilterElement, SVGElement, SVGExternalResourcesRequired, SVGURIReference>;
58     static AttributeOwnerProxy::AttributeRegistry& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
59     static bool isKnownAttribute(const QualifiedName& attributeName) { return AttributeOwnerProxy::isKnownAttribute(attributeName); }
60     static bool isAnimatedLengthAttribute(const QualifiedName& attributeName) { return AttributeOwnerProxy::isAnimatedLengthAttribute(attributeName); }
61     static void registerAttributes();
62
63     const SVGAttributeOwnerProxy& attributeOwnerProxy() const final { return m_attributeOwnerProxy; }
64     void parseAttribute(const QualifiedName&, const AtomicString&) final;
65     void svgAttributeChanged(const QualifiedName&) final;
66     void childrenChanged(const ChildChange&) final;
67
68     bool needsPendingResourceHandling() const final { return false; }
69
70     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
71     bool childShouldCreateRenderer(const Node&) const final;
72
73     bool selfHasRelativeLengths() const final { return true; }
74
75     AttributeOwnerProxy m_attributeOwnerProxy { *this };
76     SVGAnimatedEnumerationAttribute<SVGUnitTypes::SVGUnitType> m_filterUnits { SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX };
77     SVGAnimatedEnumerationAttribute<SVGUnitTypes::SVGUnitType> m_primitiveUnits { SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE };
78     SVGAnimatedLengthAttribute m_x { LengthModeWidth, "-10%" };
79     SVGAnimatedLengthAttribute m_y { LengthModeHeight, "-10%" };
80     SVGAnimatedLengthAttribute m_width { LengthModeWidth, "120%" };
81     SVGAnimatedLengthAttribute m_height { LengthModeHeight, "120%" };
82 };
83
84 } // namespace WebCore