1e131a27036e285e6277199b8c9781a85a314371
[WebKit-https.git] / Source / WebCore / platform / animation / AnimationTrigger.h
1 /*
2  * Copyright (C) 2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef AnimationTrigger_h
27 #define AnimationTrigger_h
28
29 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
30
31 #include "Length.h"
32 #include <wtf/RefCounted.h>
33 #include <wtf/RefPtr.h>
34
35 namespace WebCore {
36
37 class AnimationTrigger : public RefCounted<AnimationTrigger> {
38 public:
39
40     virtual PassRefPtr<AnimationTrigger> clone() const = 0;
41
42     enum class AnimationTriggerType {
43         AutoAnimationTriggerType, ScrollAnimationTriggerType
44     };
45
46     virtual ~AnimationTrigger() { }
47
48     AnimationTriggerType type() const { return m_type; }
49
50     bool isAutoAnimationTrigger() const { return m_type == AnimationTriggerType::AutoAnimationTriggerType; }
51     bool isScrollAnimationTrigger() const { return m_type == AnimationTriggerType::ScrollAnimationTriggerType; }
52
53     virtual bool operator==(const AnimationTrigger& other) = 0;
54
55 protected:
56     AnimationTrigger(AnimationTriggerType type)
57         : m_type(type)
58     {
59     }
60
61     AnimationTriggerType m_type;
62 };
63
64 class AutoAnimationTrigger : public AnimationTrigger {
65 public:
66     static PassRefPtr<AutoAnimationTrigger> create()
67     {
68         return adoptRef(new AutoAnimationTrigger);
69     }
70
71     virtual ~AutoAnimationTrigger() { }
72
73     virtual bool operator==(const AnimationTrigger& other) override
74     {
75         return other.isAutoAnimationTrigger();
76     }
77
78 private:
79     AutoAnimationTrigger()
80         : AnimationTrigger(AnimationTriggerType::AutoAnimationTriggerType)
81     {
82     }
83
84     virtual PassRefPtr<AnimationTrigger> clone() const override
85     {
86         return adoptRef(new AutoAnimationTrigger);
87     }
88 };
89
90 class ScrollAnimationTrigger : public AnimationTrigger {
91 public:
92     static PassRefPtr<ScrollAnimationTrigger> create(Length startValue, Length endValue , bool hasEndValue = false)
93     {
94         return adoptRef(new ScrollAnimationTrigger(startValue, endValue, hasEndValue));
95     }
96
97     virtual ~ScrollAnimationTrigger() { }
98
99     virtual bool operator==(const AnimationTrigger& other) override
100     {
101         if (!other.isScrollAnimationTrigger())
102             return false;
103
104         const ScrollAnimationTrigger* otherTrigger = static_cast<const ScrollAnimationTrigger*>(&other);
105         return m_startValue == otherTrigger->m_startValue
106             && m_endValue == otherTrigger->m_endValue
107             && m_hasEndValue == otherTrigger->m_hasEndValue;
108     }
109
110     Length startValue() const { return m_startValue; }
111
112     void setStartValue(Length value)
113     {
114         m_startValue = value;
115     }
116
117     Length endValue() const { return m_endValue; }
118
119     void setEndValue(Length value)
120     {
121         m_endValue = value;
122     }
123
124     bool hasEndValue() const { return m_hasEndValue; }
125
126     void setHasEndValue(bool value)
127     {
128         m_hasEndValue = value;
129     }
130
131 private:
132     explicit ScrollAnimationTrigger(Length startValue, Length endValue, bool hasEndValue)
133         : AnimationTrigger(AnimationTriggerType::ScrollAnimationTriggerType)
134         , m_startValue(startValue)
135         , m_endValue(endValue)
136         , m_hasEndValue(hasEndValue)
137     {
138     }
139
140     virtual PassRefPtr<AnimationTrigger> clone() const override
141     {
142         return adoptRef(new ScrollAnimationTrigger(m_startValue, m_endValue, m_hasEndValue));
143     }
144
145     Length m_startValue;
146     Length m_endValue;
147     bool m_hasEndValue;
148 };
149
150 } // namespace WebCore
151
152 #endif
153
154 #endif // AnimationTrigger_h