1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef Keyframe_h
6#define Keyframe_h
7
8#include "core/CSSPropertyNames.h"
9#include "core/animation/AnimationEffect.h"
10#include "core/animation/AnimationNode.h"
11#include "core/animation/animatable/AnimatableValue.h"
12
13namespace blink {
14
15typedef HashSet<CSSPropertyID> PropertySet;
16
17class Element;
18
19// FIXME: Make Keyframe immutable
20class Keyframe : public RefCountedWillBeGarbageCollectedFinalized<Keyframe> {
21public:
22    virtual ~Keyframe() { }
23
24    void setOffset(double offset) { m_offset = offset; }
25    double offset() const { return m_offset; }
26
27    void setComposite(AnimationEffect::CompositeOperation composite) { m_composite = composite; }
28    AnimationEffect::CompositeOperation composite() const { return m_composite; }
29
30    void setEasing(PassRefPtr<TimingFunction> easing) { m_easing = easing; }
31    TimingFunction& easing() const { return *m_easing; }
32
33    static bool compareOffsets(const RefPtrWillBeMember<Keyframe>& a, const RefPtrWillBeMember<Keyframe>& b)
34    {
35        return a->offset() < b->offset();
36    }
37
38    virtual PropertySet properties() const = 0;
39
40    virtual PassRefPtrWillBeRawPtr<Keyframe> clone() const = 0;
41    PassRefPtrWillBeRawPtr<Keyframe> cloneWithOffset(double offset) const
42    {
43        RefPtrWillBeRawPtr<Keyframe> theClone = clone();
44        theClone->setOffset(offset);
45        return theClone.release();
46    }
47
48    virtual bool isAnimatableValueKeyframe() const { return false; }
49    virtual bool isStringKeyframe() const { return false; }
50
51    virtual void trace(Visitor*) { }
52
53    class PropertySpecificKeyframe : public NoBaseWillBeGarbageCollectedFinalized<PropertySpecificKeyframe> {
54    public:
55        virtual ~PropertySpecificKeyframe() { }
56        double offset() const { return m_offset; }
57        TimingFunction& easing() const { return *m_easing; }
58        AnimationEffect::CompositeOperation composite() const { return m_composite; }
59        virtual PassOwnPtrWillBeRawPtr<PropertySpecificKeyframe> cloneWithOffset(double offset) const = 0;
60
61        virtual const PassRefPtrWillBeRawPtr<AnimatableValue> getAnimatableValue() const = 0;
62
63        virtual bool isAnimatableValuePropertySpecificKeyframe() const { return false; }
64        virtual bool isStringPropertySpecificKeyframe() const { return false; }
65
66        virtual PassOwnPtrWillBeRawPtr<PropertySpecificKeyframe> neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const = 0;
67        virtual PassRefPtrWillBeRawPtr<Interpolation> createInterpolation(CSSPropertyID, blink::Keyframe::PropertySpecificKeyframe* end, Element*) const = 0;
68
69        virtual void trace(Visitor*) { }
70
71    protected:
72        PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, AnimationEffect::CompositeOperation);
73
74        double m_offset;
75        RefPtr<TimingFunction> m_easing;
76        AnimationEffect::CompositeOperation m_composite;
77    };
78
79    virtual PassOwnPtrWillBeRawPtr<PropertySpecificKeyframe> createPropertySpecificKeyframe(CSSPropertyID) const = 0;
80
81protected:
82    Keyframe()
83        : m_offset(nullValue())
84        , m_composite(AnimationEffect::CompositeReplace)
85        , m_easing(LinearTimingFunction::shared())
86    {
87    }
88    Keyframe(double offset, AnimationEffect::CompositeOperation composite, PassRefPtr<TimingFunction> easing)
89        : m_offset(offset)
90        , m_composite(composite)
91        , m_easing(easing)
92    {
93    }
94
95    double m_offset;
96    AnimationEffect::CompositeOperation m_composite;
97    RefPtr<TimingFunction> m_easing;
98};
99
100}
101
102#endif
103