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