1/* 2 * Copyright (C) Research In Motion Limited 2011. All rights reserved. 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#include "core/svg/SVGAnimatedNumberList.h" 23 24#include "core/svg/SVGAnimateElement.h" 25#include "core/svg/SVGAnimatedNumber.h" 26 27namespace WebCore { 28 29SVGAnimatedNumberListAnimator::SVGAnimatedNumberListAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement) 30 : SVGAnimatedTypeAnimator(AnimatedNumberList, animationElement, contextElement) 31{ 32} 33 34PassOwnPtr<SVGAnimatedType> SVGAnimatedNumberListAnimator::constructFromString(const String& string) 35{ 36 OwnPtr<SVGAnimatedType> animtedType = SVGAnimatedType::createNumberList(new SVGNumberList); 37 animtedType->numberList().parse(string); 38 return animtedType.release(); 39} 40 41PassOwnPtr<SVGAnimatedType> SVGAnimatedNumberListAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes) 42{ 43 return SVGAnimatedType::createNumberList(constructFromBaseValue<SVGAnimatedNumberList>(animatedTypes)); 44} 45 46void SVGAnimatedNumberListAnimator::stopAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes) 47{ 48 stopAnimValAnimationForType<SVGAnimatedNumberList>(animatedTypes); 49} 50 51void SVGAnimatedNumberListAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGAnimatedType* type) 52{ 53 resetFromBaseValue<SVGAnimatedNumberList>(animatedTypes, type, &SVGAnimatedType::numberList); 54} 55 56void SVGAnimatedNumberListAnimator::animValWillChange(const SVGElementAnimatedPropertyList& animatedTypes) 57{ 58 animValWillChangeForType<SVGAnimatedNumberList>(animatedTypes); 59} 60 61void SVGAnimatedNumberListAnimator::animValDidChange(const SVGElementAnimatedPropertyList& animatedTypes) 62{ 63 animValDidChangeForType<SVGAnimatedNumberList>(animatedTypes); 64} 65 66void SVGAnimatedNumberListAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnimatedType* to) 67{ 68 ASSERT(from->type() == AnimatedNumberList); 69 ASSERT(from->type() == to->type()); 70 71 const SVGNumberList& fromNumberList = from->numberList(); 72 SVGNumberList& toNumberList = to->numberList(); 73 74 unsigned fromNumberListSize = fromNumberList.size(); 75 if (!fromNumberListSize || fromNumberListSize != toNumberList.size()) 76 return; 77 78 for (unsigned i = 0; i < fromNumberListSize; ++i) 79 toNumberList[i] += fromNumberList[i]; 80} 81 82void SVGAnimatedNumberListAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType* toAtEndOfDuration, SVGAnimatedType* animated) 83{ 84 ASSERT(m_animationElement); 85 86 const SVGNumberList& fromNumberList = m_animationElement->animationMode() == ToAnimation ? animated->numberList() : from->numberList(); 87 const SVGNumberList& toNumberList = to->numberList(); 88 const SVGNumberList& toAtEndOfDurationNumberList = toAtEndOfDuration->numberList(); 89 SVGNumberList& animatedNumberList = animated->numberList(); 90 if (!m_animationElement->adjustFromToListValues<SVGNumberList>(fromNumberList, toNumberList, animatedNumberList, percentage)) 91 return; 92 93 unsigned fromNumberListSize = fromNumberList.size(); 94 unsigned toNumberListSize = toNumberList.size(); 95 unsigned toAtEndOfDurationSize = toAtEndOfDurationNumberList.size(); 96 97 for (unsigned i = 0; i < toNumberListSize; ++i) { 98 float effectiveFrom = fromNumberListSize ? fromNumberList[i].value() : 0; 99 float effectiveToAtEnd = i < toAtEndOfDurationSize ? toAtEndOfDurationNumberList[i].value() : 0; 100 m_animationElement->animateAdditiveNumber(percentage, repeatCount, effectiveFrom, toNumberList[i].value(), effectiveToAtEnd, animatedNumberList[i].valueRef()); 101 } 102} 103 104float SVGAnimatedNumberListAnimator::calculateDistance(const String&, const String&) 105{ 106 // FIXME: Distance calculation is not possible for SVGNumberList right now. We need the distance for every single value. 107 return -1; 108} 109 110} 111