1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef Keyframe_h
#define Keyframe_h
#include "core/CoreExport.h"
#include "core/animation/AnimationEffectReadOnly.h"
#include "core/animation/EffectModel.h"
#include "core/animation/PropertyHandle.h"
#include "core/animation/animatable/AnimatableValue.h"
#include "wtf/Allocator.h"
#include "wtf/Forward.h"
#include "wtf/RefCounted.h"
#include "wtf/RefPtr.h"
namespace blink {
using PropertyHandleSet = HashSet<PropertyHandle>;
class Element;
class ComputedStyle;
// Represents a user specificed keyframe in a KeyframeEffect.
// http://w3c.github.io/web-animations/#keyframe
// FIXME: Make Keyframe immutable
class CORE_EXPORT Keyframe : public RefCounted<Keyframe> {
USING_FAST_MALLOC(Keyframe);
WTF_MAKE_NONCOPYABLE(Keyframe);
public:
virtual ~Keyframe() {}
void setOffset(double offset) { m_offset = offset; }
double offset() const { return m_offset; }
void setComposite(EffectModel::CompositeOperation composite) {
m_composite = composite;
}
EffectModel::CompositeOperation composite() const { return m_composite; }
void setEasing(PassRefPtr<TimingFunction> easing) { m_easing = easing; }
TimingFunction& easing() const { return *m_easing; }
static bool compareOffsets(const RefPtr<Keyframe>& a,
const RefPtr<Keyframe>& b) {
return a->offset() < b->offset();
}
virtual PropertyHandleSet properties() const = 0;
virtual PassRefPtr<Keyframe> clone() const = 0;
PassRefPtr<Keyframe> cloneWithOffset(double offset) const {
RefPtr<Keyframe> theClone = clone();
theClone->setOffset(offset);
return theClone.release();
}
virtual bool isAnimatableValueKeyframe() const { return false; }
virtual bool isStringKeyframe() const { return false; }
// Represents a property-value pair in a keyframe.
class PropertySpecificKeyframe : public RefCounted<PropertySpecificKeyframe> {
USING_FAST_MALLOC(PropertySpecificKeyframe);
WTF_MAKE_NONCOPYABLE(PropertySpecificKeyframe);
public:
virtual ~PropertySpecificKeyframe() {}
double offset() const { return m_offset; }
TimingFunction& easing() const { return *m_easing; }
EffectModel::CompositeOperation composite() const { return m_composite; }
double underlyingFraction() const {
return m_composite == EffectModel::CompositeReplace ? 0 : 1;
}
virtual bool isNeutral() const = 0;
virtual PassRefPtr<PropertySpecificKeyframe> cloneWithOffset(
double offset) const = 0;
// FIXME: Remove this once CompositorAnimations no longer depends on
// AnimatableValues
virtual bool populateAnimatableValue(
CSSPropertyID,
Element&,
const ComputedStyle& baseStyle,
const ComputedStyle* parentStyle) const {
return false;
}
virtual PassRefPtr<AnimatableValue> getAnimatableValue() const = 0;
virtual bool isAnimatableValuePropertySpecificKeyframe() const {
return false;
}
virtual bool isCSSPropertySpecificKeyframe() const { return false; }
virtual bool isSVGPropertySpecificKeyframe() const { return false; }
virtual PassRefPtr<PropertySpecificKeyframe> neutralKeyframe(
double offset,
PassRefPtr<TimingFunction> easing) const = 0;
virtual PassRefPtr<Interpolation> createInterpolation(
PropertyHandle,
const Keyframe::PropertySpecificKeyframe& end) const;
protected:
PropertySpecificKeyframe(double offset,
PassRefPtr<TimingFunction> easing,
EffectModel::CompositeOperation);
double m_offset;
RefPtr<TimingFunction> m_easing;
EffectModel::CompositeOperation m_composite;
};
virtual PassRefPtr<PropertySpecificKeyframe> createPropertySpecificKeyframe(
PropertyHandle) const = 0;
protected:
Keyframe()
: m_offset(nullValue()),
m_composite(EffectModel::CompositeReplace),
m_easing(LinearTimingFunction::shared()) {}
Keyframe(double offset,
EffectModel::CompositeOperation composite,
PassRefPtr<TimingFunction> easing)
: m_offset(offset), m_composite(composite), m_easing(easing) {}
double m_offset;
EffectModel::CompositeOperation m_composite;
RefPtr<TimingFunction> m_easing;
};
using PropertySpecificKeyframe = Keyframe::PropertySpecificKeyframe;
} // namespace blink
#endif // Keyframe_h
|