15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org> 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org> 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGFETurbulenceElement.h" 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/SVGNames.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGParserUtilities.h" 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template<> const SVGEnumerationStringEntries& getStaticStringEntries<SVGStitchOptions>() 31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DEFINE_STATIC_LOCAL(SVGEnumerationStringEntries, entries, ()); 33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (entries.isEmpty()) { 34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.append(std::make_pair(SVG_STITCHTYPE_STITCH, "stitch")); 35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.append(std::make_pair(SVG_STITCHTYPE_NOSTITCH, "noStitch")); 36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return entries; 38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template<> const SVGEnumerationStringEntries& getStaticStringEntries<TurbulenceType>() 41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DEFINE_STATIC_LOCAL(SVGEnumerationStringEntries, entries, ()); 43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (entries.isEmpty()) { 44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.append(std::make_pair(FETURBULENCE_TYPE_FRACTALNOISE, "fractalNoise")); 45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.append(std::make_pair(FETURBULENCE_TYPE_TURBULENCE, "turbulence")); 46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return entries; 48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)inline SVGFETurbulenceElement::SVGFETurbulenceElement(Document& document) 5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : SVGFilterPrimitiveStandardAttributes(SVGNames::feTurbulenceTag, document) 5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_baseFrequency(SVGAnimatedNumberOptionalNumber::create(this, SVGNames::baseFrequencyAttr)) 5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_seed(SVGAnimatedNumber::create(this, SVGNames::seedAttr, SVGNumber::create(0))) 54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_stitchTiles(SVGAnimatedEnumeration<SVGStitchOptions>::create(this, SVGNames::stitchTilesAttr, SVG_STITCHTYPE_NOSTITCH)) 55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_type(SVGAnimatedEnumeration<TurbulenceType>::create(this, SVGNames::typeAttr, FETURBULENCE_TYPE_TURBULENCE)) 5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_numOctaves(SVGAnimatedInteger::create(this, SVGNames::numOctavesAttr, SVGInteger::create(1))) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ScriptWrappable::init(this); 5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) addToPropertyMap(m_baseFrequency); 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) addToPropertyMap(m_seed); 62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) addToPropertyMap(m_stitchTiles); 63d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) addToPropertyMap(m_type); 6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) addToPropertyMap(m_numOctaves); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)DEFINE_NODE_FACTORY(SVGFETurbulenceElement) 685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGFETurbulenceElement::isSupportedAttribute(const QualifiedName& attrName) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ()); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (supportedAttributes.isEmpty()) { 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::baseFrequencyAttr); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::numOctavesAttr); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::seedAttr); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::stitchTilesAttr); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::typeAttr); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 79591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGFETurbulenceElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!isSupportedAttribute(name)) { 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SVGFilterPrimitiveStandardAttributes::parseAttribute(name, value); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) SVGParsingError parseError = NoError; 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (name == SVGNames::baseFrequencyAttr) 9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_baseFrequency->setBaseValueAsString(value, parseError); 9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else if (name == SVGNames::numOctavesAttr) 9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_numOctaves->setBaseValueAsString(value, parseError); 9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else if (name == SVGNames::seedAttr) 9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_seed->setBaseValueAsString(value, parseError); 97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) else if (name == SVGNames::stitchTilesAttr) 98d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_stitchTiles->setBaseValueAsString(value, parseError); 99d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) else if (name == SVGNames::typeAttr) 100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_type->setBaseValueAsString(value, parseError); 10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else 10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT_NOT_REACHED(); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) reportAttributeParsingError(parseError, name, value); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGFETurbulenceElement::setFilterEffectAttribute(FilterEffect* effect, const QualifiedName& attrName) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FETurbulence* turbulence = static_cast<FETurbulence*>(effect); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::typeAttr) 111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return turbulence->setType(m_type->currentValue()->enumValue()); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::stitchTilesAttr) 113d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return turbulence->setStitchTiles(m_stitchTiles->currentValue()->enumValue()); 11493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (attrName == SVGNames::baseFrequencyAttr) { 11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool baseFrequencyXChanged = turbulence->setBaseFrequencyX(baseFrequencyX()->currentValue()->value()); 11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool baseFrequencyYChanged = turbulence->setBaseFrequencyY(baseFrequencyY()->currentValue()->value()); 11793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return (baseFrequencyXChanged || baseFrequencyYChanged); 11893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::seedAttr) 12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return turbulence->setSeed(m_seed->currentValue()->value()); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::numOctavesAttr) 12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return turbulence->setNumOctaves(m_numOctaves->currentValue()->value()); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGFETurbulenceElement::svgAttributeChanged(const QualifiedName& attrName) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isSupportedAttribute(attrName)) { 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 135323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) SVGElement::InvalidationGuard invalidationGuard(this); 13602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::baseFrequencyAttr 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::numOctavesAttr 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::seedAttr 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::stitchTilesAttr 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::typeAttr) { 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) primitiveAttributeChanged(attrName); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<FilterEffect> SVGFETurbulenceElement::build(SVGFilterBuilder*, Filter* filter) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (baseFrequencyX()->currentValue()->value() < 0 || baseFrequencyY()->currentValue()->value() < 0) 152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return FETurbulence::create(filter, m_type->currentValue()->enumValue(), baseFrequencyX()->currentValue()->value(), baseFrequencyY()->currentValue()->value(), m_numOctaves->currentValue()->value(), m_seed->currentValue()->value(), m_stitchTiles->currentValue()->enumValue() == SVG_STITCHTYPE_STITCH); 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 157