SVGSMILElement.cpp revision 81bc750723a18f21cd17d1b173cd2a4dda9cea6e
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" 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "SVGDocumentExtensions.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGParserUtilities.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGSVGElement.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGURIReference.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XLinkNames.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) 11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_attributeName(anyQName()) 11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_targetElement(0) 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_conditionsConnected(false) 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_hasEndEventConditions(false) 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_intervalBegin(SMILTime::unresolved()) 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_intervalEnd(SMILTime::unresolved()) 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_previousIntervalBegin(SMILTime::unresolved()) 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isWaitingForFirstInterval(true) 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_activeState(Inactive) 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_lastPercent(0) 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_lastRepeat(0) 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_nextProgressTime(0) 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_documentOrderIndex(0) 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_cachedDur(invalidCachedTime) 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_cachedRepeatDur(invalidCachedTime) 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_cachedRepeatCount(invalidCachedTime) 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_cachedMin(invalidCachedTime) 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_cachedMax(invalidCachedTime) 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::~SVGSMILElement() 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project disconnectConditions(); 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_timeContainer) 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_timeContainer->unschedule(this); 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 14681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic inline QualifiedName constructQualifiedName(const SVGElement* svgElement, const String& attributeName) 14781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 14881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(svgElement); 14981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (attributeName.isEmpty()) 15081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return anyQName(); 15181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!attributeName.contains(':')) 15281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return QualifiedName(nullAtom, attributeName, nullAtom); 15381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 15481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch String prefix; 15581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch String localName; 15681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ExceptionCode ec = 0; 15781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!Document::parseQualifiedName(attributeName, prefix, localName, ec)) 15881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return anyQName(); 15981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(!ec); 16081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 16181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch String namespaceURI = svgElement->lookupNamespaceURI(prefix); 16281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (namespaceURI.isEmpty()) 16381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return anyQName(); 16481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 16581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return QualifiedName(nullAtom, localName, namespaceURI); 16681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::insertedIntoDocument() 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGElement::insertedIntoDocument(); 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Verify we are not in <use> instance tree. 1736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner for (ContainerNode* n = this; n; n = n->parentNode()) 174f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ASSERT(!n->isShadowRoot()); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 17681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_attributeName = constructQualifiedName(this, getAttribute(SVGNames::attributeNameAttr)); 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGSVGElement* owner = ownerSVGElement(); 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!owner) 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_timeContainer = owner->timeContainer(); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_timeContainer); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_timeContainer->setDocumentOrderIndexesDirty(); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reschedule(); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::removedFromDocument() 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_attributeName = anyQName(); 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_timeContainer) { 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_timeContainer->unschedule(this); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_timeContainer = 0; 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_targetElement) { 19481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch document()->accessSVGExtensions()->removeAnimationElementFromTarget(this, m_targetElement); 19581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_targetElement = 0; 19681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Calling disconnectConditions() may kill us if there are syncbase conditions. 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // OK, but we don't want to die inside the call. 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<SVGSMILElement> keepAlive(this); 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project disconnectConditions(); 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGElement::removedFromDocument(); 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::finishParsingChildren() 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGElement::finishParsingChildren(); 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // "If no attribute is present, the default begin value (an offset-value of 0) must be evaluated." 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasAttribute(SVGNames::beginAttr)) 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_beginTimes.append(0); 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_isWaitingForFirstInterval) { 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resolveFirstInterval(); 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reschedule(); 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::parseOffsetValue(const String& data) 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool ok; 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double result = 0; 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String parse = data.stripWhiteSpace(); 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parse.endsWith("h")) 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = parse.left(parse.length() - 1).toDouble(&ok) * 60 * 60; 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (parse.endsWith("min")) 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = parse.left(parse.length() - 3).toDouble(&ok) * 60; 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (parse.endsWith("ms")) 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = parse.left(parse.length() - 2).toDouble(&ok) / 1000; 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (parse.endsWith("s")) 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = parse.left(parse.length() - 1).toDouble(&ok); 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = parse.toDouble(&ok); 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ok) 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::unresolved(); 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::parseClockValue(const String& data) 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data.isNull()) 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::unresolved(); 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String parse = data.stripWhiteSpace(); 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(const AtomicString, indefiniteValue, ("indefinite")); 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parse == indefiniteValue) 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::indefinite(); 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double result = 0; 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool ok; 251f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick size_t doublePointOne = parse.find(':'); 252f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick size_t doublePointTwo = parse.find(':', doublePointOne + 1); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (doublePointOne == 2 && doublePointTwo == 5 && parse.length() >= 8) { 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result += parse.substring(0, 2).toUIntStrict(&ok) * 60 * 60; 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ok) 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::unresolved(); 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result += parse.substring(3, 2).toUIntStrict(&ok) * 60; 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ok) 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::unresolved(); 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result += parse.substring(6).toDouble(&ok); 261f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } else if (doublePointOne == 2 && doublePointTwo == notFound && parse.length() >= 5) { 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result += parse.substring(0, 2).toUIntStrict(&ok) * 60; 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ok) 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::unresolved(); 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result += parse.substring(3).toDouble(&ok); 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parseOffsetValue(parse); 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ok) 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::unresolved(); 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void sortTimeList(Vector<SMILTime>& timeList) 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project std::sort(timeList.begin(), timeList.end()); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::parseCondition(const String& value, BeginOrEnd beginOrEnd) 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String parseString = value.stripWhiteSpace(); 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double sign = 1.; 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool ok; 285f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick size_t pos = parseString.find('+'); 286f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (pos == notFound) { 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pos = parseString.find('-'); 288f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (pos != notFound) 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sign = -1.; 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String conditionString; 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime offset = 0; 293f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (pos == notFound) 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project conditionString = parseString; 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project conditionString = parseString.left(pos).stripWhiteSpace(); 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String offsetString = parseString.substring(pos + 1).stripWhiteSpace(); 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project offset = parseOffsetValue(offsetString); 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (offset.isUnresolved()) 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project offset = offset * sign; 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (conditionString.isEmpty()) 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pos = conditionString.find('.'); 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String baseID; 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String nameString; 309f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (pos == notFound) 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nameString = conditionString; 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project baseID = conditionString.left(pos); 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nameString = conditionString.substring(pos + 1); 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nameString.isEmpty()) 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Condition::Type type; 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int repeats = -1; 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nameString.startsWith("repeat(") && nameString.endsWith(")")) { 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: For repeat events we just need to add the data carrying TimeEvent class and 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fire the events at appropiate times. 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repeats = nameString.substring(7, nameString.length() - 8).toUIntStrict(&ok); 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ok) 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nameString = "repeat"; 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = Condition::EventBase; 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (nameString == "begin" || nameString == "end") { 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (baseID.isEmpty()) 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = Condition::Syncbase; 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (nameString.startsWith("accesskey(")) { 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: accesskey() support. 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = Condition::AccessKey; 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = Condition::EventBase; 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_conditions.append(Condition(type, beginOrEnd, baseID, nameString, offset, repeats)); 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (type == Condition::EventBase && beginOrEnd == End) 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasEndEventConditions = true; 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::isSMILElement(Node* node) 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!node) 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return node->hasTagName(SVGNames::setTag) || node->hasTagName(SVGNames::animateTag) || node->hasTagName(SVGNames::animateMotionTag) 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || node->hasTagName(SVGNames::animateTransformTag) || node->hasTagName(SVGNames::animateColorTag); 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::parseBeginOrEnd(const String& parseString, BeginOrEnd beginOrEnd) 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<SMILTime>& timeList = beginOrEnd == Begin ? m_beginTimes : m_endTimes; 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (beginOrEnd == End) 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_hasEndEventConditions = false; 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HashSet<double> existing; 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned n = 0; n < timeList.size(); ++n) 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project existing.add(timeList[n].value()); 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<String> splitString; 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parseString.split(';', splitString); 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned n = 0; n < splitString.size(); ++n) { 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime value = parseClockValue(splitString[n]); 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (value.isUnresolved()) 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parseCondition(splitString[n], beginOrEnd); 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (!existing.contains(value.value())) 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project timeList.append(value); 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sortTimeList(timeList); 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 374e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid SVGSMILElement::parseMappedAttribute(Attribute* attr) 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr->name() == SVGNames::beginAttr) { 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_conditions.isEmpty()) { 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project disconnectConditions(); 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_conditions.clear(); 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parseBeginOrEnd(getAttribute(SVGNames::endAttr), End); 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parseBeginOrEnd(attr->value().string(), Begin); 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (inDocument()) 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project connectConditions(); 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (attr->name() == SVGNames::endAttr) { 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_conditions.isEmpty()) { 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project disconnectConditions(); 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_conditions.clear(); 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parseBeginOrEnd(getAttribute(SVGNames::beginAttr), Begin); 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parseBeginOrEnd(attr->value().string(), End); 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (inDocument()) 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project connectConditions(); 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGElement::parseMappedAttribute(attr); 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::attributeChanged(Attribute* attr, bool preserveDecls) 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGElement::attributeChanged(attr, preserveDecls); 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const QualifiedName& attrName = attr->name(); 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attrName == SVGNames::durAttr) 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_cachedDur = invalidCachedTime; 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (attrName == SVGNames::repeatDurAttr) 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_cachedRepeatDur = invalidCachedTime; 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (attrName == SVGNames::repeatCountAttr) 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_cachedRepeatCount = invalidCachedTime; 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (attrName == SVGNames::minAttr) 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_cachedMin = invalidCachedTime; 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (attrName == SVGNames::maxAttr) 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_cachedMax = invalidCachedTime; 41381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else if (attrName == SVGNames::attributeNameAttr) { 41481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (inDocument()) 41581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_attributeName = constructQualifiedName(this, attr->value()); 41681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 41781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (inDocument()) { 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attrName == SVGNames::beginAttr) 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project beginListChanged(); 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (attrName == SVGNames::endAttr) 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project endListChanged(); 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockinline Element* SVGSMILElement::eventBaseFor(const Condition& condition) const 427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return condition.m_baseID.isEmpty() ? targetElement() : document()->getElementById(condition.m_baseID); 429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 430dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::connectConditions() 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_conditionsConnected) 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project disconnectConditions(); 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_conditionsConnected = true; 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned n = 0; n < m_conditions.size(); ++n) { 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Condition& condition = m_conditions[n]; 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (condition.m_type == Condition::EventBase) { 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!condition.m_syncbase); 440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Element* eventBase = eventBaseFor(condition); 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!eventBase) 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!condition.m_eventListener); 444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block condition.m_eventListener = ConditionEventListener::create(this, &condition); 445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block eventBase->addEventListener(condition.m_name, condition.m_eventListener, false); 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (condition.m_type == Condition::Syncbase) { 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!condition.m_baseID.isEmpty()); 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project condition.m_syncbase = document()->getElementById(condition.m_baseID); 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isSMILElement(condition.m_syncbase.get())) { 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project condition.m_syncbase = 0; 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGSMILElement* syncbase = static_cast<SVGSMILElement*>(condition.m_syncbase.get()); 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project syncbase->addTimeDependent(this); 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::disconnectConditions() 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_conditionsConnected) 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_conditionsConnected = false; 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned n = 0; n < m_conditions.size(); ++n) { 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Condition& condition = m_conditions[n]; 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (condition.m_type == Condition::EventBase) { 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!condition.m_syncbase); 468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!condition.m_eventListener) 469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block continue; 470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Note: It's a memory optimization to try to remove our condition 471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // event listener, but it's not guaranteed to work, since we have 472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // no guarantee that eventBaseFor() will be able to find our condition's 473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // original eventBase. So, we also have to disconnect ourselves from 474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // our condition event listener, in case it later fires. 475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Element* eventBase = eventBaseFor(condition); 476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (eventBase) 477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block eventBase->removeEventListener(condition.m_name, condition.m_eventListener.get(), false); 478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block condition.m_eventListener->disconnectAnimation(); 479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block condition.m_eventListener = 0; 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (condition.m_type == Condition::Syncbase) { 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (condition.m_syncbase) { 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(isSMILElement(condition.m_syncbase.get())); 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static_cast<SVGSMILElement*>(condition.m_syncbase.get())->removeTimeDependent(this); 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project condition.m_syncbase = 0; 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::reschedule() 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_timeContainer) 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_timeContainer->schedule(this); 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGElement* SVGSMILElement::targetElement() const 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 49881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_targetElement) 49981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return m_targetElement; 50081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String href = xlinkHref(); 502a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ContainerNode* target = href.isEmpty() ? parentNode() : document()->getElementById(SVGURIReference::getTarget(href)); 50381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!target || !target->isSVGElement()) 50481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 50681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_targetElement = static_cast<SVGElement*>(target); 50781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch document()->accessSVGExtensions()->addAnimationElementToTarget(const_cast<SVGSMILElement*>(this), m_targetElement); 50881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return m_targetElement; 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 51081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::elapsed() const 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_timeContainer ? m_timeContainer->elapsed() : 0; 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::isInactive() const 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_activeState == Inactive; 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::isFrozen() const 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_activeState == Frozen; 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::Restart SVGSMILElement::restart() const 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 528635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(const AtomicString, never, ("never")); 529635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(const AtomicString, whenNotActive, ("whenNotActive")); 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& value = getAttribute(SVGNames::restartAttr); 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (value == never) 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return RestartNever; 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (value == whenNotActive) 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return RestartWhenNotActive; 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return RestartAlways; 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::FillMode SVGSMILElement::fill() const 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 540635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(const AtomicString, freeze, ("freeze")); 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& value = getAttribute(SVGNames::fillAttr); 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return value == freeze ? FillFreeze : FillRemove; 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString SVGSMILElement::xlinkHref() const 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return getAttribute(XLinkNames::hrefAttr); 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::dur() const 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_cachedDur != invalidCachedTime) 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cachedDur; 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& value = getAttribute(SVGNames::durAttr); 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime clockValue = parseClockValue(value); 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cachedDur = clockValue <= 0 ? SMILTime::unresolved() : clockValue; 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::repeatDur() const 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_cachedRepeatDur != invalidCachedTime) 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cachedRepeatDur; 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& value = getAttribute(SVGNames::repeatDurAttr); 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime clockValue = parseClockValue(value); 56528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_cachedRepeatDur = clockValue <= 0 ? SMILTime::unresolved() : clockValue; 56628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return m_cachedRepeatDur; 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// So a count is not really a time but let just all pretend we did not notice. 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::repeatCount() const 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_cachedRepeatCount != invalidCachedTime) 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cachedRepeatCount; 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& value = getAttribute(SVGNames::repeatCountAttr); 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (value.isNull()) 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::unresolved(); 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(const AtomicString, indefiniteValue, ("indefinite")); 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (value == indefiniteValue) 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::indefinite(); 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool ok; 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double result = value.string().toDouble(&ok); 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cachedRepeatCount = ok && result > 0 ? result : SMILTime::unresolved(); 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::maxValue() const 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_cachedMax != invalidCachedTime) 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cachedMax; 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& value = getAttribute(SVGNames::maxAttr); 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime result = parseClockValue(value); 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cachedMax = (result.isUnresolved() || result < 0) ? SMILTime::indefinite() : result; 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::minValue() const 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_cachedMin != invalidCachedTime) 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cachedMin; 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const AtomicString& value = getAttribute(SVGNames::minAttr); 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime result = parseClockValue(value); 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_cachedMin = (result.isUnresolved() || result < 0) ? 0 : result; 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::simpleDuration() const 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return min(dur(), SMILTime::indefinite()); 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::addBeginTime(SMILTime time) 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_beginTimes.append(time); 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sortTimeList(m_beginTimes); 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project beginListChanged(); 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::addEndTime(SMILTime time) 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_endTimes.append(time); 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sortTimeList(m_endTimes); 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project endListChanged(); 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::findInstanceTime(BeginOrEnd beginOrEnd, SMILTime minimumTime, bool equalsMinimumOK) const 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This searches from the beginning which is inefficient. The list is usually not long 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (one entry in common cases) but you can construct a case where it does grow. 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Vector<SMILTime>& list = beginOrEnd == Begin ? m_beginTimes : m_endTimes; 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned n = 0; n < list.size(); ++n) { 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime time = list[n]; 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!time.isUnresolved()); 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (time.isIndefinite() && beginOrEnd == Begin) { 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // "The special value "indefinite" does not yield an instance time in the begin list." 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (equalsMinimumOK) { 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (time >= minimumTime) 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return time; 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (time > minimumTime) 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return time; 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SMILTime::unresolved(); 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::repeatingDuration() const 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Computing the active duration 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://www.w3.org/TR/SMIL2/smil-timing.html#Timing-ComputingActiveDur 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime repeatCount = this->repeatCount(); 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime repeatDur = this->repeatDur(); 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime simpleDuration = this->simpleDuration(); 651cad810f21b803229eb11403f9209855525a25d57Steve Block if (!simpleDuration || (repeatDur.isUnresolved() && repeatCount.isUnresolved())) 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return simpleDuration; 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime repeatCountDuration = simpleDuration * repeatCount; 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return min(repeatCountDuration, min(repeatDur, SMILTime::indefinite())); 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::resolveActiveEnd(SMILTime resolvedBegin, SMILTime resolvedEnd) const 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Computing the active duration 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://www.w3.org/TR/SMIL2/smil-timing.html#Timing-ComputingActiveDur 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime preliminaryActiveDuration; 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!resolvedEnd.isUnresolved() && dur().isUnresolved() && repeatDur().isUnresolved() && repeatCount().isUnresolved()) 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project preliminaryActiveDuration = resolvedEnd - resolvedBegin; 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (!resolvedEnd.isFinite()) 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project preliminaryActiveDuration = repeatingDuration(); 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project preliminaryActiveDuration = min(repeatingDuration(), resolvedEnd - resolvedBegin); 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime minValue = this->minValue(); 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime maxValue = this->maxValue(); 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (minValue > maxValue) { 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Ignore both. 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://www.w3.org/TR/2001/REC-smil-animation-20010904/#MinMax 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project minValue = 0; 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maxValue = SMILTime::indefinite(); 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return resolvedBegin + min(maxValue, max(minValue, preliminaryActiveDuration)); 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::resolveInterval(bool first, SMILTime& beginResult, SMILTime& endResult) const 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // See the pseudocode in 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://www.w3.org/TR/2001/REC-smil-animation-20010904/#Timing-BeginEnd-LifeCycle 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime beginAfter = first ? -numeric_limits<double>::infinity() : m_intervalEnd; 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime lastIntervalTempEnd = numeric_limits<double>::infinity(); 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (true) { 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime tempBegin = findInstanceTime(Begin, beginAfter, true); 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (tempBegin.isUnresolved()) 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime tempEnd; 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_endTimes.isEmpty()) 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tempEnd = resolveActiveEnd(tempBegin, SMILTime::indefinite()); 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tempEnd = findInstanceTime(End, tempBegin, true); 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((first && tempBegin == tempEnd && tempEnd == lastIntervalTempEnd) || (!first && tempEnd == m_intervalEnd)) 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tempEnd = findInstanceTime(End, tempBegin, false); 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (tempEnd.isUnresolved()) { 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_endTimes.isEmpty() && !m_hasEndEventConditions) 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tempEnd = resolveActiveEnd(tempBegin, tempEnd); 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (tempEnd > 0 || !first) { 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project beginResult = tempBegin; 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project endResult = tempEnd; 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 707cad810f21b803229eb11403f9209855525a25d57Steve Block } 708cad810f21b803229eb11403f9209855525a25d57Steve Block if (restart() == RestartNever) 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 710cad810f21b803229eb11403f9209855525a25d57Steve Block 711cad810f21b803229eb11403f9209855525a25d57Steve Block beginAfter = tempEnd; 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lastIntervalTempEnd = tempEnd; 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project beginResult = SMILTime::unresolved(); 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project endResult = SMILTime::unresolved(); 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::resolveFirstInterval() 7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime begin; 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime end; 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resolveInterval(true, begin, end); 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!begin.isIndefinite()); 7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!begin.isUnresolved() && (begin != m_intervalBegin || end != m_intervalEnd)) { 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool wasUnresolved = m_intervalBegin.isUnresolved(); 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_intervalBegin = begin; 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_intervalEnd = end; 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notifyDependentsIntervalChanged(wasUnresolved ? NewInterval : ExistingInterval); 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_nextProgressTime = min(m_nextProgressTime, m_intervalBegin); 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reschedule(); 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::resolveNextInterval() 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime begin; 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime end; 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resolveInterval(false, begin, end); 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!begin.isIndefinite()); 7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!begin.isUnresolved() && begin != m_intervalBegin) { 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_intervalBegin = begin; 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_intervalEnd = end; 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notifyDependentsIntervalChanged(NewInterval); 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_nextProgressTime = min(m_nextProgressTime, m_intervalBegin); 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::nextProgressTime() const 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_nextProgressTime; 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::beginListChanged() 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime elapsed = this->elapsed(); 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_isWaitingForFirstInterval) 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resolveFirstInterval(); 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (elapsed < m_intervalBegin) { 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime newBegin = findInstanceTime(Begin, elapsed, false); 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newBegin < m_intervalBegin) { 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Begin time changed, re-resolve the interval. 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime oldBegin = m_intervalBegin; 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_intervalBegin = elapsed; 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resolveInterval(false, m_intervalBegin, m_intervalEnd); 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_intervalBegin.isUnresolved()); 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_intervalBegin != oldBegin) 7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notifyDependentsIntervalChanged(ExistingInterval); 7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_nextProgressTime = elapsed; 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reschedule(); 7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::endListChanged() 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime elapsed = this->elapsed(); 7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_isWaitingForFirstInterval) 7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resolveFirstInterval(); 7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (elapsed < m_intervalEnd && m_intervalBegin.isFinite()) { 7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime newEnd = findInstanceTime(End, m_intervalBegin, false); 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newEnd < m_intervalEnd) { 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newEnd = resolveActiveEnd(m_intervalBegin, newEnd); 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newEnd != m_intervalEnd) { 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_intervalEnd = newEnd; 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notifyDependentsIntervalChanged(ExistingInterval); 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_nextProgressTime = elapsed; 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reschedule(); 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::checkRestart(SMILTime elapsed) 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_isWaitingForFirstInterval); 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(elapsed >= m_intervalBegin); 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Restart restart = this->restart(); 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (restart == RestartNever) 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elapsed < m_intervalEnd) { 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (restart != RestartAlways) 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime nextBegin = findInstanceTime(Begin, m_intervalBegin, false); 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nextBegin < m_intervalEnd) { 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_intervalEnd = nextBegin; 8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notifyDependentsIntervalChanged(ExistingInterval); 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elapsed >= m_intervalEnd) 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resolveNextInterval(); 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SVGSMILElement::calculateAnimationPercentAndRepeat(SMILTime elapsed, unsigned& repeat) const 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime simpleDuration = this->simpleDuration(); 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repeat = 0; 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (simpleDuration.isIndefinite()) { 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repeat = 0; 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0.f; 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 825cad810f21b803229eb11403f9209855525a25d57Steve Block if (!simpleDuration) { 8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repeat = 0; 8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1.f; 8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_intervalBegin.isFinite()); 8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(simpleDuration.isFinite()); 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime activeTime = elapsed - m_intervalBegin; 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime repeatingDuration = this->repeatingDuration(); 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elapsed >= m_intervalEnd || activeTime > repeatingDuration) { 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repeat = static_cast<unsigned>(repeatingDuration.value() / simpleDuration.value()); 835cad810f21b803229eb11403f9209855525a25d57Steve Block if (fmod(repeatingDuration.value(), !simpleDuration.value())) 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repeat--; 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1.f; 8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repeat = static_cast<unsigned>(activeTime.value() / simpleDuration.value()); 8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime simpleTime = fmod(activeTime.value(), simpleDuration.value()); 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return narrowPrecisionToFloat(simpleTime.value() / simpleDuration.value()); 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSMILTime SVGSMILElement::calculateNextProgressTime(SMILTime elapsed) const 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_activeState == Active) { 8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If duration is indefinite the value does not actually change over time. Same is true for <set>. 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime simpleDuration = this->simpleDuration(); 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (simpleDuration.isIndefinite() || hasTagName(SVGNames::setTag)) { 8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime repeatCount = this->repeatCount(); 8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime repeatingDurationEnd = m_intervalBegin + repeatingDuration(); 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We are supposed to do freeze semantics when repeating ends, even if the element is still active. 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Take care that we get a timer callback at that point. 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elapsed < repeatingDurationEnd && repeatingDurationEnd < m_intervalEnd && repeatingDurationEnd.isFinite()) 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return repeatingDurationEnd; 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_intervalEnd; 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return elapsed + 0.025; 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_intervalBegin >= elapsed ? m_intervalBegin : SMILTime::unresolved(); 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSMILElement::ActiveState SVGSMILElement::determineActiveState(SMILTime elapsed) const 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elapsed >= m_intervalBegin && elapsed < m_intervalEnd) 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Active; 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_activeState == Active) 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return fill() == FillFreeze ? Frozen : Inactive; 8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_activeState; 8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSMILElement::isContributing(SMILTime elapsed) const 8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Animation does not contribute during the active time if it is past its repeating duration and has fill=remove. 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (m_activeState == Active && (fill() == FillFreeze || elapsed <= m_intervalBegin + repeatingDuration())) || m_activeState == Frozen; 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement) 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_timeContainer); 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_isWaitingForFirstInterval || m_intervalBegin.isFinite()); 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_conditionsConnected) 8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project connectConditions(); 8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_intervalBegin.isFinite()) { 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_activeState == Inactive); 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_nextProgressTime = SMILTime::unresolved(); 8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elapsed < m_intervalBegin) { 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_activeState != Active); 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_activeState == Frozen && resultElement) 8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateAnimation(m_lastPercent, m_lastRepeat, resultElement); 8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_nextProgressTime = m_intervalBegin; 8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_previousIntervalBegin = m_intervalBegin; 9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_activeState == Inactive) { 9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isWaitingForFirstInterval = false; 9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_activeState = Active; 9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project startedActiveInterval(); 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned repeat; 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float percent = calculateAnimationPercentAndRepeat(elapsed, repeat); 9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkRestart(elapsed); 9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ActiveState oldActiveState = m_activeState; 9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_activeState = determineActiveState(elapsed); 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isContributing(elapsed)) { 9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (resultElement) 9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project updateAnimation(percent, repeat, resultElement); 9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastPercent = percent; 9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastRepeat = repeat; 9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (oldActiveState == Active && m_activeState != Active) 9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project endedActiveInterval(); 9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_nextProgressTime = calculateNextProgressTime(elapsed); 9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::notifyDependentsIntervalChanged(NewOrExistingInterval newOrExisting) 9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_intervalBegin.isFinite()); 934635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(HashSet<SVGSMILElement*>, loopBreaker, ()); 9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (loopBreaker.contains(this)) 9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loopBreaker.add(this); 9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TimeDependentSet::iterator end = m_timeDependents.end(); 9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (TimeDependentSet::iterator it = m_timeDependents.begin(); it != end; ++it) { 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGSMILElement* dependent = *it; 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dependent->createInstanceTimesFromSyncbase(this, newOrExisting); 9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loopBreaker.remove(this); 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 948635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SVGSMILElement::createInstanceTimesFromSyncbase(SVGSMILElement* syncbase, NewOrExistingInterval) 9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: To be really correct, this should handle updating exising interval by changing 9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the associated times instead of creating new ones. 9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned n = 0; n < m_conditions.size(); ++n) { 9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Condition& condition = m_conditions[n]; 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (condition.m_type == Condition::Syncbase && condition.m_syncbase == syncbase) { 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(condition.m_name == "begin" || condition.m_name == "end"); 9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // No nested time containers in SVG, no need for crazy time space conversions. Phew! 9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SMILTime time = 0; 9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (condition.m_name == "begin") 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project time = syncbase->m_intervalBegin + condition.m_offset; 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project time = syncbase->m_intervalEnd + condition.m_offset; 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(time.isFinite()); 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (condition.m_beginOrEnd == Begin) 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addBeginTime(time); 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addEndTime(time); 9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::addTimeDependent(SVGSMILElement* animation) 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_timeDependents.add(animation); 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_intervalBegin.isFinite()) 9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project animation->createInstanceTimesFromSyncbase(this, NewInterval); 9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::removeTimeDependent(SVGSMILElement* animation) 9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_timeDependents.remove(animation); 9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 983635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SVGSMILElement::handleConditionEvent(Event*, Condition* condition) 9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (condition->m_beginOrEnd == Begin) 9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addBeginTime(elapsed() + condition->m_offset); 9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addEndTime(elapsed() + condition->m_offset); 9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSMILElement::beginByLinkActivation() 9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addBeginTime(elapsed()); 9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 999