Index: Source/core/animation/AnimationEffect.h |
diff --git a/Source/core/animation/AnimationEffect.h b/Source/core/animation/AnimationEffect.h |
index ff659913b6b960d45c763fe41fec2a33425c42f7..a7409cf2f924da9e6c61eb10a80cfeba0f734602 100644 |
--- a/Source/core/animation/AnimationEffect.h |
+++ b/Source/core/animation/AnimationEffect.h |
@@ -32,34 +32,139 @@ |
#define AnimationEffect_h |
#include "bindings/core/v8/ScriptWrappable.h" |
-#include "core/CSSPropertyNames.h" |
#include "core/CoreExport.h" |
-#include "core/animation/PropertyHandle.h" |
+#include "core/animation/Timing.h" |
#include "platform/heap/Handle.h" |
-#include "wtf/HashMap.h" |
+#include "wtf/OwnPtr.h" |
#include "wtf/PassOwnPtr.h" |
#include "wtf/RefCounted.h" |
namespace blink { |
-class Interpolation; |
+class Animation; |
+class AnimationEffect; |
+class AnimationEffectTiming; |
+class ComputedTimingProperties; |
+ |
+enum TimingUpdateReason { |
+ TimingUpdateOnDemand, |
+ TimingUpdateForAnimationFrame |
+}; |
+ |
+static inline bool isNull(double value) |
+{ |
+ return std::isnan(value); |
+} |
+ |
+static inline double nullValue() |
+{ |
+ return std::numeric_limits<double>::quiet_NaN(); |
+} |
class CORE_EXPORT AnimationEffect : public RefCountedWillBeGarbageCollectedFinalized<AnimationEffect>, public ScriptWrappable { |
DEFINE_WRAPPERTYPEINFO(); |
+ friend class Animation; // Calls attach/detach, updateInheritedTime. |
public: |
- enum CompositeOperation { |
- CompositeReplace, |
- CompositeAdd, |
+ // Note that logic in CSSAnimations depends on the order of these values. |
+ enum Phase { |
+ PhaseBefore, |
+ PhaseActive, |
+ PhaseAfter, |
+ PhaseNone, |
+ }; |
+ |
+ class EventDelegate : public NoBaseWillBeGarbageCollectedFinalized<EventDelegate> { |
+ public: |
+ virtual ~EventDelegate() { } |
+ virtual bool requiresIterationEvents(const AnimationEffect&) = 0; |
+ virtual void onEventCondition(const AnimationEffect&) = 0; |
+ DEFINE_INLINE_VIRTUAL_TRACE() { } |
}; |
- AnimationEffect() { } |
virtual ~AnimationEffect() { } |
- virtual void sample(int iteration, double fraction, double iterationDuration, OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation>>>&) const = 0; |
- virtual bool affects(PropertyHandle) const { return false; }; |
- virtual bool isKeyframeEffectModel() const { return false; } |
+ virtual bool isAnimation() const { return false; } |
+ |
+ Phase phase() const { return ensureCalculated().phase; } |
+ bool isCurrent() const { return ensureCalculated().isCurrent; } |
+ bool isInEffect() const { return ensureCalculated().isInEffect; } |
+ bool isInPlay() const { return ensureCalculated().isInPlay; } |
+ double currentIteration() const { return ensureCalculated().currentIteration; } |
+ double timeFraction() const { return ensureCalculated().timeFraction; } |
+ double timeToForwardsEffectChange() const { return ensureCalculated().timeToForwardsEffectChange; } |
+ double timeToReverseEffectChange() const { return ensureCalculated().timeToReverseEffectChange; } |
+ |
+ double iterationDuration() const; |
+ double activeDurationInternal() const; |
+ double startTimeInternal() const { return m_startTime; } |
+ double endTimeInternal() const { return std::max(startTimeInternal(), startTimeInternal() + specifiedTiming().startDelay + activeDurationInternal() + specifiedTiming().endDelay); } |
+ |
+ const Animation* animation() const { return m_animation; } |
+ Animation* animation() { return m_animation; } |
+ const Timing& specifiedTiming() const { return m_timing; } |
+ PassRefPtrWillBeRawPtr<AnimationEffectTiming> timing(); |
+ void updateSpecifiedTiming(const Timing&); |
+ |
+ void computedTiming(ComputedTimingProperties&); |
+ ComputedTimingProperties computedTiming(); |
+ |
+ void setName(const String& name) { m_name = name; } |
+ const String& name() const { return m_name; } |
+ |
+ DECLARE_VIRTUAL_TRACE(); |
+ |
+protected: |
+ explicit AnimationEffect(const Timing&, PassOwnPtrWillBeRawPtr<EventDelegate> = nullptr); |
+ |
+ // When AnimationEffect receives a new inherited time via updateInheritedTime |
+ // it will (if necessary) recalculate timings and (if necessary) call |
+ // updateChildrenAndEffects. |
+ void updateInheritedTime(double inheritedTime, TimingUpdateReason) const; |
+ void invalidate() const { m_needsUpdate = true; }; |
+ bool requiresIterationEvents() const { return m_eventDelegate && m_eventDelegate->requiresIterationEvents(*this); } |
+ void clearEventDelegate() { m_eventDelegate = nullptr; } |
+ |
+ virtual void attach(Animation* animation) |
+ { |
+ m_animation = animation; |
+ } |
+ |
+ virtual void detach() |
+ { |
+ ASSERT(m_animation); |
+ m_animation = nullptr; |
+ } |
+ |
+ double repeatedDuration() const; |
+ |
+ virtual void updateChildrenAndEffects() const = 0; |
+ virtual double intrinsicIterationDuration() const { return 0; }; |
+ virtual double calculateTimeToEffectChange(bool forwards, double localTime, double timeToNextIteration) const = 0; |
+ virtual void specifiedTimingChanged() { } |
+ |
+ // FIXME: m_parent and m_startTime are placeholders, they depend on timing groups. |
+ RawPtrWillBeMember<AnimationEffect> m_parent; |
+ const double m_startTime; |
+ RawPtrWillBeMember<Animation> m_animation; |
+ Timing m_timing; |
+ OwnPtrWillBeMember<EventDelegate> m_eventDelegate; |
+ |
+ mutable struct CalculatedTiming { |
+ Phase phase; |
+ double currentIteration; |
+ double timeFraction; |
+ bool isCurrent; |
+ bool isInEffect; |
+ bool isInPlay; |
+ double localTime; |
+ double timeToForwardsEffectChange; |
+ double timeToReverseEffectChange; |
+ } m_calculated; |
+ mutable bool m_needsUpdate; |
+ mutable double m_lastUpdateTime; |
+ String m_name; |
- DEFINE_INLINE_VIRTUAL_TRACE() { } |
+ const CalculatedTiming& ensureCalculated() const; |
}; |
} // namespace blink |