1/*
2    Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
3
4    This library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public
6    License as published by the Free Software Foundation; either
7    version 2 of the License, or (at your option) any later version.
8
9    This library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public License
15    along with this library; see the file COPYING.LIB.  If not, write to
16    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17    Boston, MA 02110-1301, USA.
18*/
19
20#include "config.h"
21
22#if ENABLE(SVG) && ENABLE(FILTERS)
23#include "SVGFEMorphologyElement.h"
24
25#include "MappedAttribute.h"
26#include "SVGNames.h"
27#include "SVGParserUtilities.h"
28#include "SVGResourceFilter.h"
29
30namespace WebCore {
31
32char SVGRadiusXAttrIdentifier[] = "SVGRadiusXAttr";
33char SVGRadiusYAttrIdentifier[] = "SVGRadiusYAttr";
34
35SVGFEMorphologyElement::SVGFEMorphologyElement(const QualifiedName& tagName, Document* document)
36    : SVGFilterPrimitiveStandardAttributes(tagName, document)
37    , m__operator(FEMORPHOLOGY_OPERATOR_ERODE)
38{
39}
40
41SVGFEMorphologyElement::~SVGFEMorphologyElement()
42{
43}
44
45void SVGFEMorphologyElement::setRadius(float, float)
46{
47    // FIXME: Needs an implementation.
48}
49
50void SVGFEMorphologyElement::parseMappedAttribute(MappedAttribute* attr)
51{
52    const String& value = attr->value();
53    if (attr->name() == SVGNames::operatorAttr) {
54        if (value == "erode")
55            set_operatorBaseValue(FEMORPHOLOGY_OPERATOR_ERODE);
56        else if (value == "dilate")
57            set_operatorBaseValue(FEMORPHOLOGY_OPERATOR_DILATE);
58    } else if (attr->name() == SVGNames::inAttr)
59        setIn1BaseValue(value);
60    else if (attr->name() == SVGNames::radiusAttr) {
61        float x, y;
62        if (parseNumberOptionalNumber(value, x, y)) {
63            setRadiusXBaseValue(x);
64            setRadiusYBaseValue(y);
65        }
66    } else
67        SVGFilterPrimitiveStandardAttributes::parseMappedAttribute(attr);
68}
69
70void SVGFEMorphologyElement::synchronizeProperty(const QualifiedName& attrName)
71{
72    SVGFilterPrimitiveStandardAttributes::synchronizeProperty(attrName);
73
74    if (attrName == anyQName()) {
75        synchronize_operator();
76        synchronizeIn1();
77        synchronizeRadiusX();
78        synchronizeRadiusY();
79        return;
80    }
81
82    if (attrName == SVGNames::operatorAttr)
83        synchronize_operator();
84    else if (attrName == SVGNames::inAttr)
85        synchronizeIn1();
86    else if (attrName == SVGNames::radiusAttr) {
87        synchronizeRadiusX();
88        synchronizeRadiusY();
89    }
90}
91
92bool SVGFEMorphologyElement::build(SVGResourceFilter* filterResource)
93{
94    FilterEffect* input1 = filterResource->builder()->getEffectById(in1());
95
96    if (!input1)
97        return false;
98
99    RefPtr<FilterEffect> effect = FEMorphology::create(input1, static_cast<MorphologyOperatorType>(_operator()), radiusX(), radiusY());
100    filterResource->addFilterEffect(this, effect.release());
101
102    return true;
103}
104
105} //namespace WebCore
106
107#endif // ENABLE(SVG)
108