#ifndef Keyframe_h
#define Keyframe_h
#include "CSSPropertyNames.h"
#include "core/animation/AnimationEffect.h"
#include "core/animation/TimedItem.h"
namespace WebCore {
typedef HashSet<CSSPropertyID> PropertySet;
class Keyframe : public RefCountedWillBeGarbageCollectedFinalized<Keyframe> {
public:
virtual ~Keyframe() { }
void setOffset(double offset) { m_offset = offset; }
double offset() const { return m_offset; }
void setComposite(AnimationEffect::CompositeOperation composite) { m_composite = composite; }
AnimationEffect::CompositeOperation composite() const { return m_composite; }
void setEasing(PassRefPtr<TimingFunction> easing) { m_easing = easing; }
TimingFunction* easing() const { return m_easing.get(); }
static bool compareOffsets(const RefPtrWillBeMember<Keyframe>&, const RefPtrWillBeMember<Keyframe>&);
virtual PropertySet properties() const = 0;
virtual PassRefPtrWillBeRawPtr<Keyframe> clone() const = 0;
PassRefPtrWillBeRawPtr<Keyframe> cloneWithOffset(double offset) const
{
RefPtrWillBeRawPtr<Keyframe> theClone = clone();
theClone->setOffset(offset);
return theClone.release();
}
virtual bool isAnimatableValueKeyframe() const { return false; }
virtual bool isStringKeyframe() const { return false; }
virtual void trace(Visitor*) { }
class PropertySpecificKeyframe : public NoBaseWillBeGarbageCollectedFinalized<PropertySpecificKeyframe> {
public:
virtual ~PropertySpecificKeyframe() { }
double offset() const { return m_offset; }
TimingFunction* easing() const { return m_easing.get(); }
AnimationEffect::CompositeOperation composite() const { return m_composite; }
virtual PassOwnPtrWillBeRawPtr<PropertySpecificKeyframe> cloneWithOffset(double offset) const = 0;
virtual bool isAnimatableValuePropertySpecificKeyframe() const { return false; }
virtual bool isStringPropertySpecificKeyframe() const { return false; }
virtual PassOwnPtrWillBeRawPtr<PropertySpecificKeyframe> neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const = 0;
virtual PassRefPtrWillBeRawPtr<Interpolation> createInterpolation(CSSPropertyID, WebCore::Keyframe::PropertySpecificKeyframe* end) const = 0;
virtual void trace(Visitor*) = 0;
protected:
PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, AnimationEffect::CompositeOperation);
double m_offset;
RefPtr<TimingFunction> m_easing;
AnimationEffect::CompositeOperation m_composite;
};
virtual PassOwnPtrWillBeRawPtr<PropertySpecificKeyframe> createPropertySpecificKeyframe(CSSPropertyID) const = 0;
protected:
Keyframe()
: m_offset(nullValue())
, m_composite(AnimationEffect::CompositeReplace)
, m_easing(LinearTimingFunction::preset())
{
}
Keyframe(double offset, AnimationEffect::CompositeOperation composite, PassRefPtr<TimingFunction> easing)
: m_offset(offset)
, m_composite(composite)
, m_easing(easing)
{
}
double m_offset;
AnimationEffect::CompositeOperation m_composite;
RefPtr<TimingFunction> m_easing;
};
}
#endif