15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) Research In Motion Limited 2012. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGAnimatedEnumeration.h" 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SVGNames.h" 2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGAnimationElement.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGComponentTransferFunctionElement.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGFEBlendElement.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGFEColorMatrixElement.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGFECompositeElement.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGFEConvolveMatrixElement.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGFEDisplacementMapElement.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGFEMorphologyElement.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGFETurbulenceElement.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGGradientElement.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGMarkerElement.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGTextContentElement.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGTextPathElement.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGUnitTypes.h" 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline unsigned enumerationValueForTargetAttribute(SVGElement* targetElement, const QualifiedName& attrName, const String& value) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(targetElement); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::clipPathUnitsAttr 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::filterUnitsAttr 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::gradientUnitsAttr 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::maskContentUnitsAttr 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::maskUnitsAttr 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::patternContentUnitsAttr 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::patternUnitsAttr 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attrName == SVGNames::primitiveUnitsAttr) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::fromString(value); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::lengthAdjustAttr) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<SVGLengthAdjustType>::fromString(value); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::markerUnitsAttr) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<SVGMarkerUnitsType>::fromString(value); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::methodAttr) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<SVGTextPathMethodType>::fromString(value); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::spacingAttr) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<SVGTextPathSpacingType>::fromString(value); 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::spreadMethodAttr) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<SVGSpreadMethodType>::fromString(value); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::edgeModeAttr) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<EdgeModeType>::fromString(value); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::operatorAttr) { 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (targetElement->hasTagName(SVGNames::feCompositeTag)) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<CompositeOperationType>::fromString(value); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(targetElement->hasTagName(SVGNames::feMorphologyTag)); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<MorphologyOperatorType>::fromString(value); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::typeAttr) { 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (targetElement->hasTagName(SVGNames::feColorMatrixTag)) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<ColorMatrixType>::fromString(value); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (targetElement->hasTagName(SVGNames::feTurbulenceTag)) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<TurbulenceType>::fromString(value); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(targetElement->hasTagName(SVGNames::feFuncATag) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || targetElement->hasTagName(SVGNames::feFuncBTag) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || targetElement->hasTagName(SVGNames::feFuncGTag) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || targetElement->hasTagName(SVGNames::feFuncRTag)); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<ComponentTransferType>::fromString(value); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::modeAttr) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<BlendModeType>::fromString(value); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::stitchTilesAttr) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<SVGStitchOptions>::fromString(value); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::xChannelSelectorAttr) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<ChannelSelectorType>::fromString(value); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::yChannelSelectorAttr) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGPropertyTraits<ChannelSelectorType>::fromString(value); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGAnimatedEnumerationAnimator::SVGAnimatedEnumerationAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : SVGAnimatedTypeAnimator(AnimatedEnumeration, animationElement, contextElement) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<SVGAnimatedType> SVGAnimatedEnumerationAnimator::constructFromString(const String& string) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_animationElement); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<SVGAnimatedType> animatedType = SVGAnimatedType::createEnumeration(new unsigned); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) animatedType->enumeration() = enumerationValueForTargetAttribute(m_animationElement->targetElement(), m_animationElement->attributeName(), string); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return animatedType.release(); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<SVGAnimatedType> SVGAnimatedEnumerationAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGAnimatedType::createEnumeration(constructFromBaseValue<SVGAnimatedEnumeration>(animatedTypes)); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGAnimatedEnumerationAnimator::stopAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) stopAnimValAnimationForType<SVGAnimatedEnumeration>(animatedTypes); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGAnimatedEnumerationAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGAnimatedType* type) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resetFromBaseValue<SVGAnimatedEnumeration>(animatedTypes, type, &SVGAnimatedType::enumeration); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGAnimatedEnumerationAnimator::animValWillChange(const SVGElementAnimatedPropertyList& animatedTypes) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) animValWillChangeForType<SVGAnimatedEnumeration>(animatedTypes); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGAnimatedEnumerationAnimator::animValDidChange(const SVGElementAnimatedPropertyList& animatedTypes) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) animValDidChangeForType<SVGAnimatedEnumeration>(animatedTypes); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGAnimatedEnumerationAnimator::addAnimatedTypes(SVGAnimatedType*, SVGAnimatedType*) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGAnimatedEnumerationAnimator::calculateAnimatedValue(float percentage, unsigned, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType*, SVGAnimatedType* animated) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_animationElement); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_contextElement); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned fromEnumeration = m_animationElement->animationMode() == ToAnimation ? animated->enumeration() : from->enumeration(); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned toEnumeration = to->enumeration(); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned& animatedEnumeration = animated->enumeration(); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_animationElement->animateDiscreteType<unsigned>(percentage, fromEnumeration, toEnumeration, animatedEnumeration); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float SVGAnimatedEnumerationAnimator::calculateDistance(const String&, const String&) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // No paced animations for enumerations. 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return -1; 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 164