1cad810f21b803229eb11403f9209855525a25d57Steve Block/*
2cad810f21b803229eb11403f9209855525a25d57Steve Block * Copyright (C) 2008 Apple Inc. All rights reserved.
3cad810f21b803229eb11403f9209855525a25d57Steve Block *
4cad810f21b803229eb11403f9209855525a25d57Steve Block * Redistribution and use in source and binary forms, with or without
5cad810f21b803229eb11403f9209855525a25d57Steve Block * modification, are permitted provided that the following conditions
6cad810f21b803229eb11403f9209855525a25d57Steve Block * are met:
7cad810f21b803229eb11403f9209855525a25d57Steve Block * 1. Redistributions of source code must retain the above copyright
8cad810f21b803229eb11403f9209855525a25d57Steve Block *    notice, this list of conditions and the following disclaimer.
9cad810f21b803229eb11403f9209855525a25d57Steve Block * 2. Redistributions in binary form must reproduce the above copyright
10cad810f21b803229eb11403f9209855525a25d57Steve Block *    notice, this list of conditions and the following disclaimer in the
11cad810f21b803229eb11403f9209855525a25d57Steve Block *    documentation and/or other materials provided with the distribution.
12cad810f21b803229eb11403f9209855525a25d57Steve Block *
13cad810f21b803229eb11403f9209855525a25d57Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14cad810f21b803229eb11403f9209855525a25d57Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15cad810f21b803229eb11403f9209855525a25d57Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16cad810f21b803229eb11403f9209855525a25d57Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17cad810f21b803229eb11403f9209855525a25d57Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18cad810f21b803229eb11403f9209855525a25d57Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19cad810f21b803229eb11403f9209855525a25d57Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20cad810f21b803229eb11403f9209855525a25d57Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21cad810f21b803229eb11403f9209855525a25d57Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22cad810f21b803229eb11403f9209855525a25d57Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23cad810f21b803229eb11403f9209855525a25d57Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24cad810f21b803229eb11403f9209855525a25d57Steve Block */
25cad810f21b803229eb11403f9209855525a25d57Steve Block
26cad810f21b803229eb11403f9209855525a25d57Steve Block#ifndef SMILTimeContainer_h
27cad810f21b803229eb11403f9209855525a25d57Steve Block#define SMILTimeContainer_h
28cad810f21b803229eb11403f9209855525a25d57Steve Block
29cad810f21b803229eb11403f9209855525a25d57Steve Block#if ENABLE(SVG)
30cad810f21b803229eb11403f9209855525a25d57Steve Block
3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "QualifiedName.h"
32cad810f21b803229eb11403f9209855525a25d57Steve Block#include "PlatformString.h"
33cad810f21b803229eb11403f9209855525a25d57Steve Block#include "SMILTime.h"
34cad810f21b803229eb11403f9209855525a25d57Steve Block#include "Timer.h"
35cad810f21b803229eb11403f9209855525a25d57Steve Block#include <wtf/HashMap.h>
36cad810f21b803229eb11403f9209855525a25d57Steve Block#include <wtf/HashSet.h>
37cad810f21b803229eb11403f9209855525a25d57Steve Block#include <wtf/PassRefPtr.h>
38cad810f21b803229eb11403f9209855525a25d57Steve Block#include <wtf/RefCounted.h>
39cad810f21b803229eb11403f9209855525a25d57Steve Block#include <wtf/text/StringHash.h>
40cad810f21b803229eb11403f9209855525a25d57Steve Block
41cad810f21b803229eb11403f9209855525a25d57Steve Blocknamespace WebCore {
42cad810f21b803229eb11403f9209855525a25d57Steve Block
43cad810f21b803229eb11403f9209855525a25d57Steve Blockclass SVGElement;
44cad810f21b803229eb11403f9209855525a25d57Steve Blockclass SVGSMILElement;
45cad810f21b803229eb11403f9209855525a25d57Steve Blockclass SVGSVGElement;
46cad810f21b803229eb11403f9209855525a25d57Steve Block
47cad810f21b803229eb11403f9209855525a25d57Steve Blockclass SMILTimeContainer : public RefCounted<SMILTimeContainer>  {
48cad810f21b803229eb11403f9209855525a25d57Steve Blockpublic:
49cad810f21b803229eb11403f9209855525a25d57Steve Block    static PassRefPtr<SMILTimeContainer> create(SVGSVGElement* owner) { return adoptRef(new SMILTimeContainer(owner)); }
50cad810f21b803229eb11403f9209855525a25d57Steve Block
51cad810f21b803229eb11403f9209855525a25d57Steve Block    void schedule(SVGSMILElement*);
52cad810f21b803229eb11403f9209855525a25d57Steve Block    void unschedule(SVGSMILElement*);
53cad810f21b803229eb11403f9209855525a25d57Steve Block
54cad810f21b803229eb11403f9209855525a25d57Steve Block    SMILTime elapsed() const;
55cad810f21b803229eb11403f9209855525a25d57Steve Block
56cad810f21b803229eb11403f9209855525a25d57Steve Block    bool isActive() const;
57cad810f21b803229eb11403f9209855525a25d57Steve Block    bool isPaused() const;
58cad810f21b803229eb11403f9209855525a25d57Steve Block
59cad810f21b803229eb11403f9209855525a25d57Steve Block    void begin();
60cad810f21b803229eb11403f9209855525a25d57Steve Block    void pause();
61cad810f21b803229eb11403f9209855525a25d57Steve Block    void resume();
62cad810f21b803229eb11403f9209855525a25d57Steve Block
63cad810f21b803229eb11403f9209855525a25d57Steve Block    void setDocumentOrderIndexesDirty() { m_documentOrderIndexesDirty = true; }
64cad810f21b803229eb11403f9209855525a25d57Steve Block
65cad810f21b803229eb11403f9209855525a25d57Steve Block    // Move to a specific time. Only used for DRT testing purposes.
66cad810f21b803229eb11403f9209855525a25d57Steve Block    void sampleAnimationAtTime(const String& elementId, double seconds);
67cad810f21b803229eb11403f9209855525a25d57Steve Block
68cad810f21b803229eb11403f9209855525a25d57Steve Blockprivate:
69cad810f21b803229eb11403f9209855525a25d57Steve Block    SMILTimeContainer(SVGSVGElement* owner);
70cad810f21b803229eb11403f9209855525a25d57Steve Block
71cad810f21b803229eb11403f9209855525a25d57Steve Block    void timerFired(Timer<SMILTimeContainer>*);
72cad810f21b803229eb11403f9209855525a25d57Steve Block    void startTimer(SMILTime fireTime, SMILTime minimumDelay = 0);
73cad810f21b803229eb11403f9209855525a25d57Steve Block    void updateAnimations(SMILTime elapsed);
74cad810f21b803229eb11403f9209855525a25d57Steve Block
75cad810f21b803229eb11403f9209855525a25d57Steve Block    void updateDocumentOrderIndexes();
76cad810f21b803229eb11403f9209855525a25d57Steve Block    void sortByPriority(Vector<SVGSMILElement*>& smilElements, SMILTime elapsed);
77cad810f21b803229eb11403f9209855525a25d57Steve Block
7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    typedef pair<SVGElement*, QualifiedName> ElementAttributePair;
79cad810f21b803229eb11403f9209855525a25d57Steve Block    String baseValueFor(ElementAttributePair);
80cad810f21b803229eb11403f9209855525a25d57Steve Block
81cad810f21b803229eb11403f9209855525a25d57Steve Block    double m_beginTime;
82cad810f21b803229eb11403f9209855525a25d57Steve Block    double m_pauseTime;
83cad810f21b803229eb11403f9209855525a25d57Steve Block    double m_accumulatedPauseTime;
84cad810f21b803229eb11403f9209855525a25d57Steve Block    double m_nextManualSampleTime;
85cad810f21b803229eb11403f9209855525a25d57Steve Block    String m_nextSamplingTarget;
86cad810f21b803229eb11403f9209855525a25d57Steve Block
87cad810f21b803229eb11403f9209855525a25d57Steve Block    bool m_documentOrderIndexesDirty;
88cad810f21b803229eb11403f9209855525a25d57Steve Block
89cad810f21b803229eb11403f9209855525a25d57Steve Block    Timer<SMILTimeContainer> m_timer;
90cad810f21b803229eb11403f9209855525a25d57Steve Block
91cad810f21b803229eb11403f9209855525a25d57Steve Block    typedef HashSet<SVGSMILElement*> TimingElementSet;
92cad810f21b803229eb11403f9209855525a25d57Steve Block    TimingElementSet m_scheduledAnimations;
93cad810f21b803229eb11403f9209855525a25d57Steve Block
94cad810f21b803229eb11403f9209855525a25d57Steve Block    typedef HashMap<ElementAttributePair, String> BaseValueMap;
95cad810f21b803229eb11403f9209855525a25d57Steve Block    BaseValueMap m_savedBaseValues;
96cad810f21b803229eb11403f9209855525a25d57Steve Block
97cad810f21b803229eb11403f9209855525a25d57Steve Block    SVGSVGElement* m_ownerSVGElement;
98cad810f21b803229eb11403f9209855525a25d57Steve Block};
99cad810f21b803229eb11403f9209855525a25d57Steve Block}
100cad810f21b803229eb11403f9209855525a25d57Steve Block
101cad810f21b803229eb11403f9209855525a25d57Steve Block#endif // ENABLE(SVG)
102cad810f21b803229eb11403f9209855525a25d57Steve Block#endif // SMILTimeContainer_h
103