1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2006 Oliver Hunt <oliver@nerget.com> 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * This library is free software; you can redistribute it and/or 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * modify it under the terms of the GNU Library General Public 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * License as published by the Free Software Foundation; either 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * version 2 of the License, or (at your option) any later version. 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * This library is distributed in the hope that it will be useful, 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * but WITHOUT ANY WARRANTY; without even the implied warranty of 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Library General Public License for more details. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You should have received a copy of the GNU Library General Public License 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * along with this library; see the file COPYING.LIB. If not, write to 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Boston, MA 02110-1301, USA. 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#include "config.h" 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#include "core/svg/SVGFEDisplacementMapElement.h" 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#include "core/SVGNames.h" 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#include "platform/graphics/filters/FilterEffect.h" 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#include "core/svg/graphics/filters/SVGFilterBuilder.h" 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonnamespace blink { 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsontemplate<> const SVGEnumerationStringEntries& getStaticStringEntries<ChannelSelectorType>() 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson{ 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson DEFINE_STATIC_LOCAL(SVGEnumerationStringEntries, entries, ()); 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (entries.isEmpty()) { 34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson entries.append(std::make_pair(CHANNEL_R, "R")); 35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson entries.append(std::make_pair(CHANNEL_G, "G")); 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson entries.append(std::make_pair(CHANNEL_B, "B")); 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson entries.append(std::make_pair(CHANNEL_A, "A")); 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return entries; 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsoninline SVGFEDisplacementMapElement::SVGFEDisplacementMapElement(Document& document) 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson : SVGFilterPrimitiveStandardAttributes(SVGNames::feDisplacementMapTag, document) 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson , m_scale(SVGAnimatedNumber::create(this, SVGNames::scaleAttr, SVGNumber::create(0))) 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson , m_in1(SVGAnimatedString::create(this, SVGNames::inAttr, SVGString::create())) 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson , m_in2(SVGAnimatedString::create(this, SVGNames::in2Attr, SVGString::create())) 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson , m_xChannelSelector(SVGAnimatedEnumeration<ChannelSelectorType>::create(this, SVGNames::xChannelSelectorAttr, CHANNEL_A)) 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson , m_yChannelSelector(SVGAnimatedEnumeration<ChannelSelectorType>::create(this, SVGNames::yChannelSelectorAttr, CHANNEL_A)) 49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson{ 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson addToPropertyMap(m_scale); 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson addToPropertyMap(m_in1); 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson addToPropertyMap(m_in2); 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson addToPropertyMap(m_xChannelSelector); 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson addToPropertyMap(m_yChannelSelector); 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse WilsonDEFINE_NODE_FACTORY(SVGFEDisplacementMapElement) 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonbool SVGFEDisplacementMapElement::isSupportedAttribute(const QualifiedName& attrName) 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson{ 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ()); 62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (supportedAttributes.isEmpty()) { 63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson supportedAttributes.add(SVGNames::inAttr); 64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson supportedAttributes.add(SVGNames::in2Attr); 65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson supportedAttributes.add(SVGNames::xChannelSelectorAttr); 66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson supportedAttributes.add(SVGNames::yChannelSelectorAttr); 67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson supportedAttributes.add(SVGNames::scaleAttr); 68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); 70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonvoid SVGFEDisplacementMapElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 73{ 74 if (!isSupportedAttribute(name)) { 75 SVGFilterPrimitiveStandardAttributes::parseAttribute(name, value); 76 return; 77 } 78 79 SVGParsingError parseError = NoError; 80 81 if (name == SVGNames::inAttr) 82 m_in1->setBaseValueAsString(value, parseError); 83 else if (name == SVGNames::in2Attr) 84 m_in2->setBaseValueAsString(value, parseError); 85 else if (name == SVGNames::scaleAttr) 86 m_scale->setBaseValueAsString(value, parseError); 87 else if (name == SVGNames::xChannelSelectorAttr) 88 m_xChannelSelector->setBaseValueAsString(value, parseError); 89 else if (name == SVGNames::yChannelSelectorAttr) 90 m_yChannelSelector->setBaseValueAsString(value, parseError); 91 else 92 ASSERT_NOT_REACHED(); 93 94 reportAttributeParsingError(parseError, name, value); 95} 96 97bool SVGFEDisplacementMapElement::setFilterEffectAttribute(FilterEffect* effect, const QualifiedName& attrName) 98{ 99 FEDisplacementMap* displacementMap = static_cast<FEDisplacementMap*>(effect); 100 if (attrName == SVGNames::xChannelSelectorAttr) 101 return displacementMap->setXChannelSelector(m_xChannelSelector->currentValue()->enumValue()); 102 if (attrName == SVGNames::yChannelSelectorAttr) 103 return displacementMap->setYChannelSelector(m_yChannelSelector->currentValue()->enumValue()); 104 if (attrName == SVGNames::scaleAttr) 105 return displacementMap->setScale(m_scale->currentValue()->value()); 106 107 ASSERT_NOT_REACHED(); 108 return false; 109} 110 111void SVGFEDisplacementMapElement::svgAttributeChanged(const QualifiedName& attrName) 112{ 113 if (!isSupportedAttribute(attrName)) { 114 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName); 115 return; 116 } 117 118 SVGElement::InvalidationGuard invalidationGuard(this); 119 120 if (attrName == SVGNames::xChannelSelectorAttr || attrName == SVGNames::yChannelSelectorAttr || attrName == SVGNames::scaleAttr) { 121 primitiveAttributeChanged(attrName); 122 return; 123 } 124 125 if (attrName == SVGNames::inAttr || attrName == SVGNames::in2Attr) { 126 invalidate(); 127 return; 128 } 129 130 ASSERT_NOT_REACHED(); 131} 132 133PassRefPtr<FilterEffect> SVGFEDisplacementMapElement::build(SVGFilterBuilder* filterBuilder, Filter* filter) 134{ 135 FilterEffect* input1 = filterBuilder->getEffectById(AtomicString(m_in1->currentValue()->value())); 136 FilterEffect* input2 = filterBuilder->getEffectById(AtomicString(m_in2->currentValue()->value())); 137 138 if (!input1 || !input2) 139 return nullptr; 140 141 RefPtr<FilterEffect> effect = FEDisplacementMap::create(filter, m_xChannelSelector->currentValue()->enumValue(), m_yChannelSelector->currentValue()->enumValue(), m_scale->currentValue()->value()); 142 FilterEffectVector& inputEffects = effect->inputEffects(); 143 inputEffects.reserveCapacity(2); 144 inputEffects.append(input1); 145 inputEffects.append(input2); 146 return effect.release(); 147} 148 149} // namespace blink 150