Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: Source/core/animation/AnimationConversion.h

Issue 1153943003: Add foundation for removing AnimatableValues from StyleInterpolation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: PassOwnPtr Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2015 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 AnimationConversion_h
6 #define AnimationConversion_h
7
8 #include "core/animation/AnimationValue.h"
9 #include "platform/heap/Handle.h"
10 #include "wtf/Vector.h"
11 #include <cmath>
12
13 namespace blink {
14
15 class StyleResolverState;
16
17 class AnimationConversion : public NoBaseWillBeGarbageCollectedFinalized<Animati onConversion> {
18 public:
19 virtual ~AnimationConversion() { }
20
21 bool isInvalid(const StyleResolverState& state) const
22 {
23 for (const auto& invalidator : m_invalidators) {
24 if (invalidator->isInvalid(state))
25 return true;
26 }
27 return false;
28 }
29
30 virtual void interpolate(double fraction, AnimationValue& result) const = 0;
31
32 DEFINE_INLINE_VIRTUAL_TRACE() { visitor->trace(m_invalidators); }
33
34 class Invalidator : public NoBaseWillBeGarbageCollectedFinalized<Invalidator > {
35 public:
36 virtual ~Invalidator() { }
37 virtual bool isInvalid(const StyleResolverState&) const = 0;
38 DEFINE_INLINE_VIRTUAL_TRACE() { }
39 };
40 using Invalidators = WillBeHeapVector<OwnPtrWillBeMember<Invalidator>>;
41
42 protected:
43 AnimationConversion(WillBeHeapVector<OwnPtrWillBeMember<Invalidator>>& inval idators)
44 {
45 m_invalidators.swap(invalidators);
46 }
47
48 Invalidators m_invalidators;
49 };
50
51 class PairwiseAnimationConversion : public AnimationConversion {
52 public:
53 virtual ~PairwiseAnimationConversion() { }
54
55 static PassOwnPtrWillBeRawPtr<PairwiseAnimationConversion> create(PassOwnPtr WillBeRawPtr<InterpolableValue> start, PassOwnPtrWillBeRawPtr<InterpolableValue> end, PassRefPtrWillBeRawPtr<NonInterpolableValue> nonInterpolableValue, Invalid ators& invalidators)
56 {
57 return adoptPtrWillBeNoop(new PairwiseAnimationConversion(start, end, no nInterpolableValue, invalidators));
58 }
59
60 void initialiseAnimationValue(AnimationValue& value)
61 {
62 value.interpolableValue = m_start->clone();
63 value.nonInterpolableValue = m_nonInterpolableValue;
64 }
65
66 private:
67 virtual void interpolate(double fraction, AnimationValue& result) const over ride final
68 {
69 ASSERT(result.nonInterpolableValue == m_nonInterpolableValue);
70 m_start->interpolate(*m_end, fraction, *result.interpolableValue);
71 }
72
73 DEFINE_INLINE_VIRTUAL_TRACE()
74 {
75 AnimationConversion::trace(visitor);
76 visitor->trace(m_start);
77 visitor->trace(m_end);
78 visitor->trace(m_nonInterpolableValue);
79 }
80
81 PairwiseAnimationConversion(PassOwnPtrWillBeRawPtr<InterpolableValue> start, PassOwnPtrWillBeRawPtr<InterpolableValue> end, PassRefPtrWillBeRawPtr<NonInterp olableValue> nonInterpolableValue, Invalidators& invalidators)
82 : AnimationConversion(invalidators)
83 , m_start(start)
84 , m_end(end)
85 , m_nonInterpolableValue(nonInterpolableValue)
86 { }
87 OwnPtrWillBeRawPtr<InterpolableValue> m_start;
88 OwnPtrWillBeRawPtr<InterpolableValue> m_end;
89 RefPtrWillBeRawPtr<NonInterpolableValue> m_nonInterpolableValue;
90 };
91
92 struct AnimationConversionHalf : public NoBaseWillBeGarbageCollectedFinalized<An imationConversionHalf> {
shans 2015/06/04 00:15:15 Not sure about this name.
alancutter (OOO until 2018) 2015/06/11 04:15:13 Renamed: AnimationConversion -> InterpolationPrimi
93 const AnimationType* type;
94 OwnPtrWillBeMember<InterpolableValue> interpolableValue;
95 RefPtrWillBeMember<NonInterpolableValue> nonInterpolableValue;
96 AnimationConversion::Invalidators invalidators;
97
98 static PassOwnPtrWillBeRawPtr<AnimationConversionHalf> create() { return ado ptPtrWillBeNoop(new AnimationConversionHalf()); }
99
100 DEFINE_INLINE_TRACE()
101 {
102 visitor->trace(interpolableValue);
103 visitor->trace(nonInterpolableValue);
104 visitor->trace(invalidators);
105 }
106
107 private:
108 AnimationConversionHalf()
109 : type(nullptr)
110 { }
111 };
112
113 class DefaultAnimationConversion : public AnimationConversion {
114 public:
115 virtual ~DefaultAnimationConversion() { }
116
117 static PassOwnPtrWillBeRawPtr<DefaultAnimationConversion> create(PassOwnPtrW illBeRawPtr<AnimationConversionHalf> start, PassOwnPtrWillBeRawPtr<AnimationConv ersionHalf> end)
118 {
119 ASSERT(start->type);
120 ASSERT(end->type);
121 Invalidators invalidators;
122 for (auto& invalidator : start->invalidators)
123 invalidators.append(invalidator.release());
124 for (auto& invalidator : end->invalidators)
125 invalidators.append(invalidator.release());
126 return adoptPtrWillBeNoop(new DefaultAnimationConversion(start, end, inv alidators));
127 }
128
129 private:
130 virtual void interpolate(double fraction, AnimationValue& result) const over ride final
131 {
132 if (!std::isnan(m_lastFraction) && (fraction < 0.5) == (m_lastFraction < 0.5))
133 return;
134 result.copy((fraction < 0.5) ? m_start : m_end);
135 m_lastFraction = fraction;
136 }
137
138 DEFINE_INLINE_VIRTUAL_TRACE()
139 {
140 AnimationConversion::trace(visitor);
141 visitor->trace(m_start);
142 visitor->trace(m_end);
143 }
144
145 DefaultAnimationConversion(PassOwnPtrWillBeRawPtr<AnimationConversionHalf> s tart, PassOwnPtrWillBeRawPtr<AnimationConversionHalf> end, Invalidators& invalid ators)
146 : AnimationConversion(invalidators)
147 , m_start(start->type, start->interpolableValue.release(), start->nonInt erpolableValue.release())
148 , m_end(end->type, end->interpolableValue.release(), end->nonInterpolabl eValue.release())
149 , m_lastFraction(std::numeric_limits<double>::quiet_NaN())
150 { }
151
152 AnimationValue m_start;
153 AnimationValue m_end;
154 mutable double m_lastFraction;
155 };
156
157 } // namespace blink
158
159 #endif // AnimationConversion_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698