#ifndef AnimationBase_h
#define AnimationBase_h
#include "Animation.h"
#include "CSSPropertyNames.h"
#include "RenderStyleConstants.h"
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/RefCounted.h>
#include <wtf/text/AtomicString.h>
namespace WebCore {
class AnimationBase;
class AnimationController;
class CompositeAnimation;
class Element;
class Node;
class RenderObject;
class RenderStyle;
class TimingFunction;
class AnimationBase : public RefCounted<AnimationBase> {
friend class CompositeAnimation;
friend class CSSPropertyAnimation;
public:
AnimationBase(const Animation* transition, RenderObject* renderer, CompositeAnimation* compAnim);
virtual ~AnimationBase() { }
RenderObject* renderer() const { return m_object; }
void clear()
{
endAnimation();
m_object = 0;
m_compAnim = 0;
}
double duration() const;
enum AnimState {
AnimationStateNew, AnimationStateStartWaitTimer, AnimationStateStartWaitStyleAvailable, AnimationStateStartWaitResponse, AnimationStateLooping, AnimationStateEnding, AnimationStatePausedNew, AnimationStatePausedWaitTimer, AnimationStatePausedWaitStyleAvailable, AnimationStatePausedWaitResponse, AnimationStatePausedRun, AnimationStateDone, AnimationStateFillingForwards };
enum AnimStateInput {
AnimationStateInputMakeNew, AnimationStateInputStartAnimation, AnimationStateInputRestartAnimation, AnimationStateInputStartTimerFired, AnimationStateInputStyleAvailable, AnimationStateInputStartTimeSet, AnimationStateInputLoopTimerFired, AnimationStateInputEndTimerFired, AnimationStateInputPauseOverride, AnimationStateInputResumeOverride, AnimationStateInputPlayStateRunning, AnimationStateInputPlayStatePaused, AnimationStateInputEndAnimation };
void updateStateMachine(AnimStateInput, double param);
void onAnimationStartResponse(double startTime)
{
updateStateMachine(AnimationBase::AnimationStateInputStartTimeSet, startTime);
}
void updatePlayState(EAnimPlayState);
bool playStatePlaying() const;
bool waitingToStart() const { return m_animState == AnimationStateNew || m_animState == AnimationStateStartWaitTimer || m_animState == AnimationStatePausedNew; }
bool preActive() const
{
return m_animState == AnimationStateNew || m_animState == AnimationStateStartWaitTimer || m_animState == AnimationStateStartWaitStyleAvailable || m_animState == AnimationStateStartWaitResponse;
}
bool postActive() const { return m_animState == AnimationStateDone; }
bool active() const { return !postActive() && !preActive(); }
bool running() const { return !isNew() && !postActive(); }
bool paused() const { return m_pauseTime >= 0 || m_animState == AnimationStatePausedNew; }
bool isNew() const { return m_animState == AnimationStateNew || m_animState == AnimationStatePausedNew; }
bool waitingForStartTime() const { return m_animState == AnimationStateStartWaitResponse; }
bool waitingForStyleAvailable() const { return m_animState == AnimationStateStartWaitStyleAvailable; }
virtual double timeToNextService();
double progress(double scale, double offset, const TimingFunction*) const;
virtual void animate(CompositeAnimation*, RenderObject*, const RenderStyle* , RenderStyle* , RefPtr<RenderStyle>& ) = 0;
virtual void getAnimatedStyle(RefPtr<RenderStyle>& ) = 0;
virtual bool shouldFireEvents() const { return false; }
void fireAnimationEventsIfNeeded();
bool animationsMatch(const Animation*) const;
void setAnimation(const Animation* anim) { m_animation = const_cast<Animation*>(anim); }
virtual bool overridden() const { return false; }
virtual bool affectsProperty(CSSPropertyID ) const { return false; }
bool isAnimatingProperty(CSSPropertyID property, bool acceleratedOnly, bool isRunningNow) const
{
if (acceleratedOnly && !m_isAccelerated)
return false;
if (isRunningNow)
return (!waitingToStart() && !postActive()) && affectsProperty(property);
return !postActive() && affectsProperty(property);
}
bool isTransformFunctionListValid() const { return m_transformFunctionListValid; }
#if ENABLE(CSS_FILTERS)
bool filterFunctionListsMatch() const { return m_filterFunctionListsMatch; }
#endif
void freezeAtTime(double t);
void play();
void pause();
double beginAnimationUpdateTime() const;
double getElapsedTime() const;
void setElapsedTime(double);
void styleAvailable()
{
ASSERT(waitingForStyleAvailable());
updateStateMachine(AnimationBase::AnimationStateInputStyleAvailable, -1);
}
const Animation* animation() const { return m_animation.get(); }
protected:
virtual void overrideAnimations() { }
virtual void resumeOverriddenAnimations() { }
CompositeAnimation* compositeAnimation() { return m_compAnim; }
virtual void onAnimationStart(double ) { }
virtual void onAnimationIteration(double ) { }
virtual void onAnimationEnd(double ) { }
virtual bool startAnimation(double ) { return false; }
virtual void pauseAnimation(double ) { }
virtual void endAnimation() { }
void goIntoEndingOrLoopingState();
bool isAccelerated() const { return m_isAccelerated; }
static void setNeedsStyleRecalc(Node*);
void getTimeToNextEvent(double& time, bool& isLooping) const;
double fractionalTime(double scale, double elapsedTime, double offset) const;
AnimState m_animState;
bool m_isAccelerated;
bool m_transformFunctionListValid;
#if ENABLE(CSS_FILTERS)
bool m_filterFunctionListsMatch;
#endif
double m_startTime;
double m_pauseTime;
double m_requestedStartTime;
double m_totalDuration;
double m_nextIterationDuration;
RenderObject* m_object;
RefPtr<Animation> m_animation;
CompositeAnimation* m_compAnim;
};
}
#endif // AnimationBase_h