15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Cameron McCormack <cam@mcc.id.au>
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) Research In Motion Limited 2011. All rights reserved.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef SVGAnimationElement_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define SVGAnimationElement_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGAnimatedBoolean.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGExternalResourcesRequired.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGTests.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/animation/SVGSMILElement.h"
321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/animation/UnitBezier.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum AnimationMode {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NoAnimation,
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FromToAnimation,
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FromByAnimation,
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ToAnimation,
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ByAnimation,
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ValuesAnimation,
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PathAnimation // Used by AnimateMotion.
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// If we have 'currentColor' or 'inherit' as animation value, we need to grab
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// the value during the animation since the value can be animated itself.
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum AnimatedPropertyValueType {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RegularPropertyValue,
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CurrentColorValue,
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InheritValue
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum CalcMode {
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CalcModeDiscrete,
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CalcModeLinear,
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CalcModePaced,
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CalcModeSpline
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ConditionEventListener;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TimeContainer;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SVGAnimatedType;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SVGAnimationElement : public SVGSMILElement,
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            public SVGTests,
67591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                            public SVGExternalResourcesRequired {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // SVGAnimationElement
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float getStartTime() const;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float getCurrentTime() const;
7293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    float getSimpleDuration() const;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void beginElement();
75591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void beginElementAt(float offset);
76591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void endElement();
77591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void endElementAt(float offset);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool isTargetAttributeCSSProperty(SVGElement*, const QualifiedName&);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isAdditive() const;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isAccumulated() const;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AnimationMode animationMode() const { return m_animationMode; }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CalcMode calcMode() const { return m_calcMode; }
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum ShouldApplyAnimation {
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DontApplyAnimation,
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ApplyCSSAnimation,
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ApplyXMLAnimation
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ShouldApplyAnimation shouldApplyAnimation(SVGElement* targetElement, const QualifiedName& attributeName);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AnimatedPropertyValueType fromPropertyValueType() const { return m_fromPropertyValueType; }
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AnimatedPropertyValueType toPropertyValueType() const { return m_toPropertyValueType; }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename AnimatedType>
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void adjustForInheritance(AnimatedType (*parseTypeFromString)(SVGAnimationElement*, const String&),
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                              AnimatedPropertyValueType valueType, AnimatedType& animatedType, SVGElement* contextElement)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (valueType != InheritValue)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Replace 'inherit' by its computed property value.
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(parseTypeFromString);
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String typeString;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        adjustForInheritance(contextElement, attributeName(), typeString);
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        animatedType = (*parseTypeFromString)(this, typeString);
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename AnimatedType>
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool adjustFromToListValues(const AnimatedType& fromList, const AnimatedType& toList, AnimatedType& animatedList, float percentage, bool resizeAnimatedListIfNeeded = true)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If no 'to' value is given, nothing to animate.
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned toListSize = toList.size();
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!toListSize)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the 'from' value is given and it's length doesn't match the 'to' value list length, fallback to a discrete animation.
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned fromListSize = fromList.size();
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (fromListSize != toListSize && fromListSize) {
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (percentage < 0.5) {
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (animationMode() != ToAnimation)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    animatedList = AnimatedType(fromList);
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                animatedList = AnimatedType(toList);
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!fromListSize || fromListSize == toListSize);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (resizeAnimatedListIfNeeded && animatedList.size() < toListSize)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            animatedList.resize(toListSize);
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<typename AnimatedType>
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void animateDiscreteType(float percentage, const AnimatedType& fromType, const AnimatedType& toType, AnimatedType& animatedType)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ((animationMode() == FromToAnimation && percentage > 0.5) || animationMode() == ToAnimation || percentage == 1) {
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            animatedType = AnimatedType(toType);
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        animatedType = AnimatedType(fromType);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void animateAdditiveNumber(float percentage, unsigned repeatCount, float fromNumber, float toNumber, float toAtEndOfDurationNumber, float& animatedNumber)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        float number;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (calcMode() == CalcModeDiscrete)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            number = percentage < 0.5 ? fromNumber : toNumber;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            number = (toNumber - fromNumber) * percentage + fromNumber;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isAccumulated() && repeatCount)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            number += toAtEndOfDurationNumber * repeatCount;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isAdditive() && animationMode() != ToAnimation)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            animatedNumber += number;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            animatedNumber = number;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
1658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    SVGAnimationElement(const QualifiedName&, Document&);
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void computeCSSPropertyValue(SVGElement*, CSSPropertyID, String& value);
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void determinePropertyValueTypes(const String& from, const String& to);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSupportedAttribute(const QualifiedName&);
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void svgAttributeChanged(const QualifiedName&) OVERRIDE;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum AttributeType {
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AttributeTypeCSS,
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AttributeTypeXML,
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AttributeTypeAuto
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AttributeType attributeType() const { return m_attributeType; }
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String toValue() const;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String byValue() const;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String fromValue() const;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String targetAttributeBaseValue();
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // from SVGSMILElement
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void startedActiveInterval() OVERRIDE;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void updateAnimation(float percent, unsigned repeat, SVGSMILElement* resultElement) OVERRIDE;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AnimatedPropertyValueType m_fromPropertyValueType;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AnimatedPropertyValueType m_toPropertyValueType;
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void setTargetElement(SVGElement*) OVERRIDE;
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void setAttributeName(const QualifiedName&) OVERRIDE;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasInvalidCSSAttributeType() const { return m_hasInvalidCSSAttributeType; }
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void updateAnimationMode();
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setAnimationMode(AnimationMode animationMode) { m_animationMode = animationMode; }
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setCalcMode(CalcMode calcMode) { m_calcMode = calcMode; }
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void animationAttributeChanged() OVERRIDE;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setAttributeType(const AtomicString&);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void checkInvalidCSSAttributeType(SVGElement*);
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool calculateToAtEndOfDurationValue(const String& toAtEndOfDurationString) = 0;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool calculateFromAndToValues(const String& fromString, const String& toString) = 0;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool calculateFromAndByValues(const String& fromString, const String& byString) = 0;
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void calculateAnimatedValue(float percent, unsigned repeatCount, SVGSMILElement* resultElement) = 0;
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual float calculateDistance(const String& /*fromString*/, const String& /*toString*/) { return -1.f; }
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void currentValuesForValuesAnimation(float percent, float& effectivePercent, String& from, String& to);
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void calculateKeyTimesForCalcModePaced();
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float calculatePercentFromKeyPoints(float percent) const;
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void currentValuesFromKeyPoints(float percent, float& effectivePercent, String& from, String& to) const;
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float calculatePercentForSpline(float percent, unsigned splineIndex) const;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float calculatePercentForFromTo(float percent) const;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned calculateKeyTimesIndex(float percent) const;
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void applyAnimatedValue(ShouldApplyAnimation, SVGElement* targetElement, const QualifiedName& attributeName, SVGAnimatedType*);
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void adjustForInheritance(SVGElement* targetElement, const QualifiedName& attributeName, String&);
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGAnimationElement)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    END_DECLARE_ANIMATED_PROPERTIES
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // SVGTests
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void synchronizeRequiredFeatures() { SVGTests::synchronizeRequiredFeatures(this); }
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void synchronizeRequiredExtensions() { SVGTests::synchronizeRequiredExtensions(this); }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void synchronizeSystemLanguage() { SVGTests::synchronizeSystemLanguage(this); }
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setCalcMode(const AtomicString&);
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_animationValid;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AttributeType m_attributeType;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<String> m_values;
240e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // FIXME: We should probably use doubles for this, but there's no point
241e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // making such a change unless all SVG logic for sampling animations is
242e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // changed to use doubles.
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<float> m_keyTimes;
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<float> m_keyPoints;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<UnitBezier> m_keySplines;
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_lastValuesAnimationFrom;
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_lastValuesAnimationTo;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_hasInvalidCSSAttributeType;
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CalcMode m_calcMode;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AnimationMode m_animationMode;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // SVGAnimationElement_h
256