Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 | |
| OLD | NEW |