SVGSMILElement.cpp revision cad810f21b803229eb11403f9209855525a25d57
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG_ANIMATION)
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGSMILElement.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPropertyNames.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Event.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventListener.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatConversion.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SMILTimeContainer.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGParserUtilities.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGSVGElement.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGURIReference.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XLinkNames.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <math.h>
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/MathExtras.h>
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std;
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is used for duration type time values that can't be negative.
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const double invalidCachedTime = -1.;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass ConditionEventListener : public EventListener {
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static PassRefPtr<ConditionEventListener> create(SVGSMILElement* animation, SVGSMILElement::Condition* condition)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return adoptRef(new ConditionEventListener(animation, condition));
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static const ConditionEventListener* cast(const EventListener* listener)
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return listener->type() == ConditionEventListenerType
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            ? static_cast<const ConditionEventListener*>(listener)
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            : 0;
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    virtual bool operator==(const EventListener& other);
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void disconnectAnimation()
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_animation = 0;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ConditionEventListener(SVGSMILElement* animation, SVGSMILElement::Condition* condition)
80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        : EventListener(ConditionEventListenerType)
81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        , m_animation(animation)
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        , m_condition(condition)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    virtual void handleEvent(ScriptExecutionContext*, Event*);
87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGSMILElement* m_animation;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGSMILElement::Condition* m_condition;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool ConditionEventListener::operator==(const EventListener& listener)
93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (const ConditionEventListener* conditionEventListener = ConditionEventListener::cast(&listener))
95cad810f21b803229eb11403f9209855525a25d57Steve Block        return m_animation == conditionEventListener->m_animation && m_condition == conditionEventListener->m_condition;
96231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return false;
97231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
98231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid ConditionEventListener::handleEvent(ScriptExecutionContext*, Event* event)
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_animation)
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_animation->handleConditionEvent(event, m_condition);
104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::Condition::Condition(Type type, BeginOrEnd beginOrEnd, const String& baseID, const String& name, SMILTime offset, int repeats)
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_type(type)
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_beginOrEnd(beginOrEnd)
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_baseID(baseID)
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_name(name)
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_offset(offset)
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_repeats(repeats)
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::SVGSMILElement(const QualifiedName& tagName, Document* doc)
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : SVGElement(tagName, doc)
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_conditionsConnected(false)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_hasEndEventConditions(false)
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_intervalBegin(SMILTime::unresolved())
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_intervalEnd(SMILTime::unresolved())
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_previousIntervalBegin(SMILTime::unresolved())
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_isWaitingForFirstInterval(true)
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_activeState(Inactive)
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_lastPercent(0)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_lastRepeat(0)
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_nextProgressTime(0)
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_documentOrderIndex(0)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_cachedDur(invalidCachedTime)
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_cachedRepeatDur(invalidCachedTime)
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_cachedRepeatCount(invalidCachedTime)
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_cachedMin(invalidCachedTime)
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_cachedMax(invalidCachedTime)
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::~SVGSMILElement()
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    disconnectConditions();
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_timeContainer)
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_timeContainer->unschedule(this);
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::insertedIntoDocument()
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGElement::insertedIntoDocument();
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Verify we are not in <use> instance tree.
1496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    for (ContainerNode* n = this; n; n = n->parentNode())
150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        ASSERT(!n->isShadowRoot());
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGSVGElement* owner = ownerSVGElement();
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!owner)
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_timeContainer = owner->timeContainer();
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_timeContainer);
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_timeContainer->setDocumentOrderIndexesDirty();
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    reschedule();
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::removedFromDocument()
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_timeContainer) {
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_timeContainer->unschedule(this);
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_timeContainer = 0;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Calling disconnectConditions() may kill us if there are syncbase conditions.
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // OK, but we don't want to die inside the call.
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<SVGSMILElement> keepAlive(this);
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    disconnectConditions();
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGElement::removedFromDocument();
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::finishParsingChildren()
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGElement::finishParsingChildren();
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // "If no attribute is present, the default begin value (an offset-value of 0) must be evaluated."
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!hasAttribute(SVGNames::beginAttr))
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_beginTimes.append(0);
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_isWaitingForFirstInterval) {
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        resolveFirstInterval();
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        reschedule();
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::parseOffsetValue(const String& data)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double result = 0;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String parse = data.stripWhiteSpace();
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parse.endsWith("h"))
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = parse.left(parse.length() - 1).toDouble(&ok) * 60 * 60;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (parse.endsWith("min"))
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = parse.left(parse.length() - 3).toDouble(&ok) * 60;
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (parse.endsWith("ms"))
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = parse.left(parse.length() - 2).toDouble(&ok) / 1000;
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (parse.endsWith("s"))
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = parse.left(parse.length() - 1).toDouble(&ok);
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = parse.toDouble(&ok);
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!ok)
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SMILTime::unresolved();
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::parseClockValue(const String& data)
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (data.isNull())
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SMILTime::unresolved();
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String parse = data.stripWhiteSpace();
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const AtomicString, indefiniteValue, ("indefinite"));
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parse == indefiniteValue)
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SMILTime::indefinite();
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double result = 0;
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok;
221f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    size_t doublePointOne = parse.find(':');
222f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    size_t doublePointTwo = parse.find(':', doublePointOne + 1);
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (doublePointOne == 2 && doublePointTwo == 5 && parse.length() >= 8) {
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += parse.substring(0, 2).toUIntStrict(&ok) * 60 * 60;
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!ok)
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return SMILTime::unresolved();
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += parse.substring(3, 2).toUIntStrict(&ok) * 60;
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!ok)
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return SMILTime::unresolved();
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += parse.substring(6).toDouble(&ok);
231f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    } else if (doublePointOne == 2 && doublePointTwo == notFound && parse.length() >= 5) {
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += parse.substring(0, 2).toUIntStrict(&ok) * 60;
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!ok)
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return SMILTime::unresolved();
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += parse.substring(3).toDouble(&ok);
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return parseOffsetValue(parse);
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!ok)
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SMILTime::unresolved();
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void sortTimeList(Vector<SMILTime>& timeList)
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    std::sort(timeList.begin(), timeList.end());
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::parseCondition(const String& value, BeginOrEnd beginOrEnd)
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String parseString = value.stripWhiteSpace();
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double sign = 1.;
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok;
255f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    size_t pos = parseString.find('+');
256f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (pos == notFound) {
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pos = parseString.find('-');
258f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (pos != notFound)
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            sign = -1.;
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String conditionString;
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime offset = 0;
263f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (pos == notFound)
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        conditionString = parseString;
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        conditionString = parseString.left(pos).stripWhiteSpace();
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String offsetString = parseString.substring(pos + 1).stripWhiteSpace();
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        offset = parseOffsetValue(offsetString);
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (offset.isUnresolved())
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        offset = offset * sign;
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (conditionString.isEmpty())
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    pos = conditionString.find('.');
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String baseID;
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String nameString;
279f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (pos == notFound)
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        nameString = conditionString;
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        baseID = conditionString.left(pos);
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        nameString = conditionString.substring(pos + 1);
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (nameString.isEmpty())
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Condition::Type type;
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int repeats = -1;
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (nameString.startsWith("repeat(") && nameString.endsWith(")")) {
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: For repeat events we just need to add the data carrying TimeEvent class and
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // fire the events at appropiate times.
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        repeats = nameString.substring(7, nameString.length() - 8).toUIntStrict(&ok);
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!ok)
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        nameString = "repeat";
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        type = Condition::EventBase;
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (nameString == "begin" || nameString == "end") {
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (baseID.isEmpty())
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        type = Condition::Syncbase;
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (nameString.startsWith("accesskey(")) {
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: accesskey() support.
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        type = Condition::AccessKey;
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        type = Condition::EventBase;
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_conditions.append(Condition(type, beginOrEnd, baseID, nameString, offset, repeats));
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (type == Condition::EventBase && beginOrEnd == End)
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_hasEndEventConditions = true;
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::isSMILElement(Node* node)
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!node)
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return node->hasTagName(SVGNames::setTag) || node->hasTagName(SVGNames::animateTag) || node->hasTagName(SVGNames::animateMotionTag)
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || node->hasTagName(SVGNames::animateTransformTag) || node->hasTagName(SVGNames::animateColorTag);
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::parseBeginOrEnd(const String& parseString, BeginOrEnd beginOrEnd)
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<SMILTime>& timeList = beginOrEnd == Begin ? m_beginTimes : m_endTimes;
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (beginOrEnd == End)
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_hasEndEventConditions = false;
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<double> existing;
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned n = 0; n < timeList.size(); ++n)
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        existing.add(timeList[n].value());
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<String> splitString;
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parseString.split(';', splitString);
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned n = 0; n < splitString.size(); ++n) {
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SMILTime value = parseClockValue(splitString[n]);
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value.isUnresolved())
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parseCondition(splitString[n], beginOrEnd);
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (!existing.contains(value.value()))
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            timeList.append(value);
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sortTimeList(timeList);
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
344e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid SVGSMILElement::parseMappedAttribute(Attribute* attr)
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attr->name() == SVGNames::beginAttr) {
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_conditions.isEmpty()) {
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            disconnectConditions();
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_conditions.clear();
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parseBeginOrEnd(getAttribute(SVGNames::endAttr), End);
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parseBeginOrEnd(attr->value().string(), Begin);
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (inDocument())
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            connectConditions();
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (attr->name() == SVGNames::endAttr) {
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_conditions.isEmpty()) {
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            disconnectConditions();
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_conditions.clear();
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parseBeginOrEnd(getAttribute(SVGNames::beginAttr), Begin);
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parseBeginOrEnd(attr->value().string(), End);
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (inDocument())
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            connectConditions();
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SVGElement::parseMappedAttribute(attr);
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::attributeChanged(Attribute* attr, bool preserveDecls)
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGElement::attributeChanged(attr, preserveDecls);
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const QualifiedName& attrName = attr->name();
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attrName == SVGNames::durAttr)
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_cachedDur = invalidCachedTime;
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attrName == SVGNames::repeatDurAttr)
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_cachedRepeatDur = invalidCachedTime;
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attrName == SVGNames::repeatCountAttr)
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_cachedRepeatCount = invalidCachedTime;
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attrName == SVGNames::minAttr)
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_cachedMin = invalidCachedTime;
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attrName == SVGNames::maxAttr)
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_cachedMax = invalidCachedTime;
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (inDocument()) {
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (attrName == SVGNames::beginAttr)
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            beginListChanged();
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (attrName == SVGNames::endAttr)
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            endListChanged();
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockinline Element* SVGSMILElement::eventBaseFor(const Condition& condition) const
393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return condition.m_baseID.isEmpty() ? targetElement() : document()->getElementById(condition.m_baseID);
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::connectConditions()
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_conditionsConnected)
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        disconnectConditions();
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_conditionsConnected = true;
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned n = 0; n < m_conditions.size(); ++n) {
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Condition& condition = m_conditions[n];
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (condition.m_type == Condition::EventBase) {
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(!condition.m_syncbase);
406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Element* eventBase = eventBaseFor(condition);
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!eventBase)
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(!condition.m_eventListener);
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            condition.m_eventListener = ConditionEventListener::create(this, &condition);
411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            eventBase->addEventListener(condition.m_name, condition.m_eventListener, false);
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (condition.m_type == Condition::Syncbase) {
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(!condition.m_baseID.isEmpty());
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            condition.m_syncbase = document()->getElementById(condition.m_baseID);
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!isSMILElement(condition.m_syncbase.get())) {
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                condition.m_syncbase = 0;
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            SVGSMILElement* syncbase = static_cast<SVGSMILElement*>(condition.m_syncbase.get());
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            syncbase->addTimeDependent(this);
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::disconnectConditions()
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_conditionsConnected)
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_conditionsConnected = false;
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned n = 0; n < m_conditions.size(); ++n) {
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Condition& condition = m_conditions[n];
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (condition.m_type == Condition::EventBase) {
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(!condition.m_syncbase);
434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (!condition.m_eventListener)
435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                continue;
436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Note: It's a memory optimization to try to remove our condition
437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // event listener, but it's not guaranteed to work, since we have
438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // no guarantee that eventBaseFor() will be able to find our condition's
439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // original eventBase. So, we also have to disconnect ourselves from
440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // our condition event listener, in case it later fires.
441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Element* eventBase = eventBaseFor(condition);
442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (eventBase)
443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                eventBase->removeEventListener(condition.m_name, condition.m_eventListener.get(), false);
444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            condition.m_eventListener->disconnectAnimation();
445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            condition.m_eventListener = 0;
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (condition.m_type == Condition::Syncbase) {
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (condition.m_syncbase) {
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT(isSMILElement(condition.m_syncbase.get()));
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                static_cast<SVGSMILElement*>(condition.m_syncbase.get())->removeTimeDependent(this);
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        condition.m_syncbase = 0;
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::reschedule()
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_timeContainer)
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_timeContainer->schedule(this);
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGElement* SVGSMILElement::targetElement() const
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String href = xlinkHref();
465a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ContainerNode* target = href.isEmpty() ? parentNode() : document()->getElementById(SVGURIReference::getTarget(href));
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (target && target->isSVGElement())
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return static_cast<SVGElement*>(target);
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString SVGSMILElement::attributeName() const
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(SVGNames::attributeNameAttr).string().stripWhiteSpace();
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::elapsed() const
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_timeContainer ? m_timeContainer->elapsed() : 0;
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::isInactive() const
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     return m_activeState == Inactive;
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::isFrozen() const
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_activeState == Frozen;
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::Restart SVGSMILElement::restart() const
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
493635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const AtomicString, never, ("never"));
494635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const AtomicString, whenNotActive, ("whenNotActive"));
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& value = getAttribute(SVGNames::restartAttr);
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value == never)
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return RestartNever;
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value == whenNotActive)
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return RestartWhenNotActive;
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return RestartAlways;
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::FillMode SVGSMILElement::fill() const
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
505635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const AtomicString, freeze, ("freeze"));
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& value = getAttribute(SVGNames::fillAttr);
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return value == freeze ? FillFreeze : FillRemove;
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString SVGSMILElement::xlinkHref() const
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(XLinkNames::hrefAttr);
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::dur() const
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_cachedDur != invalidCachedTime)
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_cachedDur;
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& value = getAttribute(SVGNames::durAttr);
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime clockValue = parseClockValue(value);
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_cachedDur = clockValue <= 0 ? SMILTime::unresolved() : clockValue;
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::repeatDur() const
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_cachedRepeatDur != invalidCachedTime)
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_cachedRepeatDur;
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& value = getAttribute(SVGNames::repeatDurAttr);
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime clockValue = parseClockValue(value);
53028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    m_cachedRepeatDur = clockValue <= 0 ? SMILTime::unresolved() : clockValue;
53128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return m_cachedRepeatDur;
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// So a count is not really a time but let just all pretend we did not notice.
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::repeatCount() const
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_cachedRepeatCount != invalidCachedTime)
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_cachedRepeatCount;
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& value = getAttribute(SVGNames::repeatCountAttr);
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value.isNull())
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SMILTime::unresolved();
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
543635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const AtomicString, indefiniteValue, ("indefinite"));
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value == indefiniteValue)
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SMILTime::indefinite();
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool ok;
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double result = value.string().toDouble(&ok);
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_cachedRepeatCount = ok && result > 0 ? result : SMILTime::unresolved();
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::maxValue() const
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_cachedMax != invalidCachedTime)
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_cachedMax;
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& value = getAttribute(SVGNames::maxAttr);
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime result = parseClockValue(value);
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_cachedMax = (result.isUnresolved() || result < 0) ? SMILTime::indefinite() : result;
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::minValue() const
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_cachedMin != invalidCachedTime)
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_cachedMin;
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& value = getAttribute(SVGNames::minAttr);
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime result = parseClockValue(value);
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_cachedMin = (result.isUnresolved() || result < 0) ? 0 : result;
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::simpleDuration() const
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return min(dur(), SMILTime::indefinite());
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::addBeginTime(SMILTime time)
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_beginTimes.append(time);
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sortTimeList(m_beginTimes);
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    beginListChanged();
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::addEndTime(SMILTime time)
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_endTimes.append(time);
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sortTimeList(m_endTimes);
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    endListChanged();
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::findInstanceTime(BeginOrEnd beginOrEnd, SMILTime minimumTime, bool equalsMinimumOK) const
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This searches from the beginning which is inefficient. The list is usually not long
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // (one entry in common cases) but you can construct a case where it does grow.
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const Vector<SMILTime>& list = beginOrEnd == Begin ? m_beginTimes : m_endTimes;
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned n = 0; n < list.size(); ++n) {
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SMILTime time = list[n];
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!time.isUnresolved());
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (time.isIndefinite() && beginOrEnd == Begin) {
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // "The special value "indefinite" does not yield an instance time in the begin list."
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (equalsMinimumOK) {
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (time >= minimumTime)
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return time;
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (time > minimumTime)
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return time;
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return SMILTime::unresolved();
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::repeatingDuration() const
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Computing the active duration
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // http://www.w3.org/TR/SMIL2/smil-timing.html#Timing-ComputingActiveDur
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime repeatCount = this->repeatCount();
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime repeatDur = this->repeatDur();
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime simpleDuration = this->simpleDuration();
616cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!simpleDuration || (repeatDur.isUnresolved() && repeatCount.isUnresolved()))
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return simpleDuration;
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime repeatCountDuration = simpleDuration * repeatCount;
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return min(repeatCountDuration, min(repeatDur, SMILTime::indefinite()));
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::resolveActiveEnd(SMILTime resolvedBegin, SMILTime resolvedEnd) const
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Computing the active duration
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // http://www.w3.org/TR/SMIL2/smil-timing.html#Timing-ComputingActiveDur
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime preliminaryActiveDuration;
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolvedEnd.isUnresolved() && dur().isUnresolved() && repeatDur().isUnresolved() && repeatCount().isUnresolved())
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        preliminaryActiveDuration = resolvedEnd - resolvedBegin;
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (!resolvedEnd.isFinite())
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        preliminaryActiveDuration = repeatingDuration();
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        preliminaryActiveDuration = min(repeatingDuration(), resolvedEnd - resolvedBegin);
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime minValue = this->minValue();
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime maxValue = this->maxValue();
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (minValue > maxValue) {
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Ignore both.
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // http://www.w3.org/TR/2001/REC-smil-animation-20010904/#MinMax
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        minValue = 0;
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        maxValue = SMILTime::indefinite();
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return resolvedBegin + min(maxValue, max(minValue, preliminaryActiveDuration));
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::resolveInterval(bool first, SMILTime& beginResult, SMILTime& endResult) const
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // See the pseudocode in
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // http://www.w3.org/TR/2001/REC-smil-animation-20010904/#Timing-BeginEnd-LifeCycle
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime beginAfter = first ? -numeric_limits<double>::infinity() : m_intervalEnd;
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime lastIntervalTempEnd = numeric_limits<double>::infinity();
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (true) {
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SMILTime tempBegin = findInstanceTime(Begin, beginAfter, true);
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (tempBegin.isUnresolved())
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SMILTime tempEnd;
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_endTimes.isEmpty())
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            tempEnd = resolveActiveEnd(tempBegin, SMILTime::indefinite());
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            tempEnd = findInstanceTime(End, tempBegin, true);
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ((first && tempBegin == tempEnd && tempEnd == lastIntervalTempEnd) || (!first && tempEnd == m_intervalEnd))
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                tempEnd = findInstanceTime(End, tempBegin, false);
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (tempEnd.isUnresolved()) {
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_endTimes.isEmpty() && !m_hasEndEventConditions)
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            tempEnd = resolveActiveEnd(tempBegin, tempEnd);
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (tempEnd > 0 || !first) {
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            beginResult = tempBegin;
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            endResult = tempEnd;
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
672cad810f21b803229eb11403f9209855525a25d57Steve Block        }
673cad810f21b803229eb11403f9209855525a25d57Steve Block        if (restart() == RestartNever)
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
675cad810f21b803229eb11403f9209855525a25d57Steve Block
676cad810f21b803229eb11403f9209855525a25d57Steve Block        beginAfter = tempEnd;
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lastIntervalTempEnd = tempEnd;
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    beginResult = SMILTime::unresolved();
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    endResult = SMILTime::unresolved();
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::resolveFirstInterval()
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime begin;
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime end;
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    resolveInterval(true, begin, end);
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!begin.isIndefinite());
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!begin.isUnresolved() && (begin != m_intervalBegin || end != m_intervalEnd)) {
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool wasUnresolved = m_intervalBegin.isUnresolved();
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_intervalBegin = begin;
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_intervalEnd = end;
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        notifyDependentsIntervalChanged(wasUnresolved ? NewInterval : ExistingInterval);
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_nextProgressTime = min(m_nextProgressTime, m_intervalBegin);
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        reschedule();
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::resolveNextInterval()
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime begin;
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime end;
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    resolveInterval(false, begin, end);
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!begin.isIndefinite());
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!begin.isUnresolved() && begin != m_intervalBegin) {
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_intervalBegin = begin;
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_intervalEnd = end;
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        notifyDependentsIntervalChanged(NewInterval);
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_nextProgressTime = min(m_nextProgressTime, m_intervalBegin);
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::nextProgressTime() const
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_nextProgressTime;
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::beginListChanged()
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime elapsed = this->elapsed();
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_isWaitingForFirstInterval)
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        resolveFirstInterval();
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (elapsed < m_intervalBegin) {
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SMILTime newBegin = findInstanceTime(Begin, elapsed, false);
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (newBegin < m_intervalBegin) {
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Begin time changed, re-resolve the interval.
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            SMILTime oldBegin = m_intervalBegin;
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_intervalBegin = elapsed;
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            resolveInterval(false, m_intervalBegin, m_intervalEnd);
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(!m_intervalBegin.isUnresolved());
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_intervalBegin != oldBegin)
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                notifyDependentsIntervalChanged(ExistingInterval);
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_nextProgressTime = elapsed;
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    reschedule();
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::endListChanged()
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime elapsed = this->elapsed();
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_isWaitingForFirstInterval)
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        resolveFirstInterval();
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (elapsed < m_intervalEnd && m_intervalBegin.isFinite()) {
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SMILTime newEnd = findInstanceTime(End, m_intervalBegin, false);
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (newEnd < m_intervalEnd) {
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            newEnd = resolveActiveEnd(m_intervalBegin, newEnd);
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (newEnd != m_intervalEnd) {
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_intervalEnd = newEnd;
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                notifyDependentsIntervalChanged(ExistingInterval);
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_nextProgressTime = elapsed;
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    reschedule();
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::checkRestart(SMILTime elapsed)
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!m_isWaitingForFirstInterval);
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(elapsed >= m_intervalBegin);
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Restart restart = this->restart();
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (restart == RestartNever)
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (elapsed < m_intervalEnd) {
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (restart != RestartAlways)
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SMILTime nextBegin = findInstanceTime(Begin, m_intervalBegin, false);
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (nextBegin < m_intervalEnd) {
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_intervalEnd = nextBegin;
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            notifyDependentsIntervalChanged(ExistingInterval);
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (elapsed >= m_intervalEnd)
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        resolveNextInterval();
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SVGSMILElement::calculateAnimationPercentAndRepeat(SMILTime elapsed, unsigned& repeat) const
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime simpleDuration = this->simpleDuration();
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    repeat = 0;
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (simpleDuration.isIndefinite()) {
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        repeat = 0;
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0.f;
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
790cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!simpleDuration) {
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        repeat = 0;
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1.f;
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_intervalBegin.isFinite());
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(simpleDuration.isFinite());
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime activeTime = elapsed - m_intervalBegin;
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime repeatingDuration = this->repeatingDuration();
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (elapsed >= m_intervalEnd || activeTime > repeatingDuration) {
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        repeat = static_cast<unsigned>(repeatingDuration.value() / simpleDuration.value());
800cad810f21b803229eb11403f9209855525a25d57Steve Block        if (fmod(repeatingDuration.value(), !simpleDuration.value()))
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            repeat--;
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1.f;
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    repeat = static_cast<unsigned>(activeTime.value() / simpleDuration.value());
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SMILTime simpleTime = fmod(activeTime.value(), simpleDuration.value());
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return narrowPrecisionToFloat(simpleTime.value() / simpleDuration.value());
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::calculateNextProgressTime(SMILTime elapsed) const
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_activeState == Active) {
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If duration is indefinite the value does not actually change over time. Same is true for <set>.
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SMILTime simpleDuration = this->simpleDuration();
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (simpleDuration.isIndefinite() || hasTagName(SVGNames::setTag)) {
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            SMILTime repeatCount = this->repeatCount();
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            SMILTime repeatingDurationEnd = m_intervalBegin + repeatingDuration();
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We are supposed to do freeze semantics when repeating ends, even if the element is still active.
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Take care that we get a timer callback at that point.
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (elapsed < repeatingDurationEnd && repeatingDurationEnd < m_intervalEnd && repeatingDurationEnd.isFinite())
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return repeatingDurationEnd;
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return m_intervalEnd;
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return elapsed + 0.025;
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_intervalBegin >= elapsed ? m_intervalBegin : SMILTime::unresolved();
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::ActiveState SVGSMILElement::determineActiveState(SMILTime elapsed) const
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (elapsed >= m_intervalBegin && elapsed < m_intervalEnd)
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return Active;
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_activeState == Active)
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return fill() == FillFreeze ? Frozen : Inactive;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_activeState;
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::isContributing(SMILTime elapsed) const
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Animation does not contribute during the active time if it is past its repeating duration and has fill=remove.
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (m_activeState == Active && (fill() == FillFreeze || elapsed <= m_intervalBegin + repeatingDuration())) || m_activeState == Frozen;
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement)
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_timeContainer);
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_isWaitingForFirstInterval || m_intervalBegin.isFinite());
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_conditionsConnected)
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        connectConditions();
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_intervalBegin.isFinite()) {
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_activeState == Inactive);
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_nextProgressTime = SMILTime::unresolved();
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (elapsed < m_intervalBegin) {
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_activeState != Active);
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_activeState == Frozen && resultElement)
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            updateAnimation(m_lastPercent, m_lastRepeat, resultElement);
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_nextProgressTime = m_intervalBegin;
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_previousIntervalBegin = m_intervalBegin;
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_activeState == Inactive) {
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_isWaitingForFirstInterval = false;
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_activeState = Active;
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        startedActiveInterval();
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned repeat;
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float percent = calculateAnimationPercentAndRepeat(elapsed, repeat);
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkRestart(elapsed);
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ActiveState oldActiveState = m_activeState;
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_activeState = determineActiveState(elapsed);
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isContributing(elapsed)) {
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (resultElement)
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            updateAnimation(percent, repeat, resultElement);
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_lastPercent = percent;
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_lastRepeat = repeat;
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (oldActiveState == Active && m_activeState != Active)
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        endedActiveInterval();
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_nextProgressTime = calculateNextProgressTime(elapsed);
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::notifyDependentsIntervalChanged(NewOrExistingInterval newOrExisting)
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_intervalBegin.isFinite());
899635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(HashSet<SVGSMILElement*>, loopBreaker, ());
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (loopBreaker.contains(this))
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loopBreaker.add(this);
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    TimeDependentSet::iterator end = m_timeDependents.end();
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (TimeDependentSet::iterator it = m_timeDependents.begin(); it != end; ++it) {
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SVGSMILElement* dependent = *it;
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dependent->createInstanceTimesFromSyncbase(this, newOrExisting);
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loopBreaker.remove(this);
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
913635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SVGSMILElement::createInstanceTimesFromSyncbase(SVGSMILElement* syncbase, NewOrExistingInterval)
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: To be really correct, this should handle updating exising interval by changing
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the associated times instead of creating new ones.
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned n = 0; n < m_conditions.size(); ++n) {
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Condition& condition = m_conditions[n];
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (condition.m_type == Condition::Syncbase && condition.m_syncbase == syncbase) {
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(condition.m_name == "begin" || condition.m_name == "end");
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // No nested time containers in SVG, no need for crazy time space conversions. Phew!
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            SMILTime time = 0;
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (condition.m_name == "begin")
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                time = syncbase->m_intervalBegin + condition.m_offset;
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                time = syncbase->m_intervalEnd + condition.m_offset;
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(time.isFinite());
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (condition.m_beginOrEnd == Begin)
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addBeginTime(time);
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addEndTime(time);
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::addTimeDependent(SVGSMILElement* animation)
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_timeDependents.add(animation);
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_intervalBegin.isFinite())
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->createInstanceTimesFromSyncbase(this, NewInterval);
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::removeTimeDependent(SVGSMILElement* animation)
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_timeDependents.remove(animation);
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
948635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SVGSMILElement::handleConditionEvent(Event*, Condition* condition)
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (condition->m_beginOrEnd == Begin)
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addBeginTime(elapsed() + condition->m_offset);
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addEndTime(elapsed() + condition->m_offset);
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::beginByLinkActivation()
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addBeginTime(elapsed());
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
964