6938c08c8ed5ac0a60581a2510bf8c4dddbfc4a8
[WebKit-https.git] / WebCore / ksvg2 / svg / SVGFESpecularLightingElement.cpp
1 /*
2     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
3                   2004, 2005, 2006 Rob Buis <buis@kde.org>
4                   2005 Oliver Hunt <ojh16@student.canterbury.ac.nz>
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., 59 Temple Place - Suite 330,
19     Boston, MA 02111-1307, USA.
20 */
21
22 #include "config.h"
23 #ifdef SVG_SUPPORT
24 #include "SVGFESpecularLightingElement.h"
25
26 #include "KRenderingDevice.h"
27 #include "SVGColor.h"
28 #include "SVGHelper.h"
29 #include "SVGNames.h"
30 #include "SVGFELightElement.h"
31
32 namespace WebCore {
33
34 SVGFESpecularLightingElement::SVGFESpecularLightingElement(const QualifiedName& tagName, Document* doc)
35     : SVGFilterPrimitiveStandardAttributes(tagName, doc)
36     , m_specularConstant(0.0)
37     , m_specularExponent(0.0)
38     , m_surfaceScale(0.0)
39     , m_lightingColor(new SVGColor())
40     , m_kernelUnitLengthX(0.0)
41     , m_kernelUnitLengthY(0.0)
42     , m_filterEffect(0)
43 {
44 }
45
46 SVGFESpecularLightingElement::~SVGFESpecularLightingElement()
47 {
48     delete m_filterEffect;
49 }
50
51 ANIMATED_PROPERTY_DEFINITIONS(SVGFESpecularLightingElement, String, String, string, In1, in1, SVGNames::inAttr.localName(), m_in1)
52 ANIMATED_PROPERTY_DEFINITIONS(SVGFESpecularLightingElement, double, Number, number, SpecularConstant, specularConstant, SVGNames::specularConstantAttr.localName(), m_specularConstant)
53 ANIMATED_PROPERTY_DEFINITIONS(SVGFESpecularLightingElement, double, Number, number, SpecularExponent, specularExponent, SVGNames::specularExponentAttr.localName(), m_specularExponent)
54 ANIMATED_PROPERTY_DEFINITIONS(SVGFESpecularLightingElement, double, Number, number, SurfaceScale, surfaceScale, SVGNames::surfaceScaleAttr.localName(), m_surfaceScale)
55 ANIMATED_PROPERTY_DEFINITIONS(SVGFESpecularLightingElement, double, Number, number, KernelUnitLengthX, kernelUnitLengthX, "kernelUnitLengthX", m_kernelUnitLengthX)
56 ANIMATED_PROPERTY_DEFINITIONS(SVGFESpecularLightingElement, double, Number, number, KernelUnitLengthY, kernelUnitLengthY, "kernelUnitLengthY", m_kernelUnitLengthY)
57 ANIMATED_PROPERTY_DEFINITIONS(SVGFESpecularLightingElement, SVGColor*, Color, color, LightingColor, lightingColor, SVGNames::lighting_colorAttr.localName(), m_lightingColor.get())
58
59 void SVGFESpecularLightingElement::parseMappedAttribute(MappedAttribute* attr)
60 {    
61     const String& value = attr->value();
62     if (attr->name() == SVGNames::inAttr)
63         setIn1BaseValue(value);
64     else if (attr->name() == SVGNames::surfaceScaleAttr)
65         setSurfaceScaleBaseValue(value.toDouble());
66     else if (attr->name() == SVGNames::specularConstantAttr)
67         setSpecularConstantBaseValue(value.toDouble());
68     else if (attr->name() == SVGNames::specularExponentAttr)
69         setSpecularExponentBaseValue(value.toDouble());
70     else if (attr->name() == SVGNames::kernelUnitLengthAttr) {
71         Vector<String> numbers = value.split(' ');
72         setKernelUnitLengthXBaseValue(numbers[0].toDouble());
73         if (numbers.size() == 1)
74             setKernelUnitLengthYBaseValue(numbers[0].toDouble());
75         else
76             setKernelUnitLengthYBaseValue(numbers[1].toDouble());
77     } else if (attr->name() == SVGNames::lighting_colorAttr)
78         setLightingColorBaseValue(new SVGColor(value));
79     else
80         SVGFilterPrimitiveStandardAttributes::parseMappedAttribute(attr);
81 }
82
83 SVGFESpecularLighting* SVGFESpecularLightingElement::filterEffect() const
84 {
85     if (!m_filterEffect) 
86         m_filterEffect = static_cast<SVGFESpecularLighting*>(renderingDevice()->createFilterEffect(FE_SPECULAR_LIGHTING));
87     m_filterEffect->setIn(in1());
88     setStandardAttributes(m_filterEffect);
89     m_filterEffect->setSpecularConstant((specularConstant()));
90     m_filterEffect->setSpecularExponent((specularExponent()));
91     m_filterEffect->setSurfaceScale((surfaceScale()));
92     m_filterEffect->setKernelUnitLengthX((kernelUnitLengthX()));
93     m_filterEffect->setKernelUnitLengthY((kernelUnitLengthY()));
94     m_filterEffect->setLightingColor(lightingColor()->color());
95     updateLights();
96     return m_filterEffect;
97 }
98
99 void SVGFESpecularLightingElement::updateLights() const
100 {
101     if (!m_filterEffect)
102         return;
103
104     SVGLightSource* light = 0;    
105     for (Node* n = firstChild(); n; n = n->nextSibling()) {
106         if (n->hasTagName(SVGNames::feDistantLightTag)||n->hasTagName(SVGNames::fePointLightTag)||n->hasTagName(SVGNames::feSpotLightTag)) {
107             SVGFELightElement* lightNode = static_cast<SVGFELightElement*>(n); 
108             light = lightNode->lightSource();
109             break;
110         }
111     }
112     m_filterEffect->setLightSource(light);
113 }
114
115 }
116
117 #endif // SVG_SUPPORT
118