blob: 839fe75da8166b60e590fee3985754a2b18195b9 [file] [log] [blame]
// 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 StringKeyframe_h
#define StringKeyframe_h
#include "core/animation/Keyframe.h"
#include "core/css/StylePropertySet.h"
#include "wtf/HashMap.h"
namespace blink {
class StyleSheetContents;
class StringKeyframe : public Keyframe {
public:
static PassRefPtrWillBeRawPtr<StringKeyframe> create()
{
return adoptRefWillBeNoop(new StringKeyframe);
}
void setPropertyValue(CSSPropertyID, const String& value, Element*, StyleSheetContents*);
void setPropertyValue(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>);
void setPropertyValue(const QualifiedName&, const String& value, Element*);
CSSValue* cssPropertyValue(CSSPropertyID property) const
{
int index = m_propertySet->findPropertyIndex(property);
RELEASE_ASSERT(index >= 0);
return m_propertySet->propertyAt(static_cast<unsigned>(index)).value();
}
String svgPropertyValue(const QualifiedName& attributeName) const
{
return m_svgPropertyMap.get(&attributeName);
}
virtual PropertyHandleSet properties() const override;
DECLARE_VIRTUAL_TRACE();
class CSSPropertySpecificKeyframe : public Keyframe::PropertySpecificKeyframe {
public:
CSSPropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, CSSValue*, EffectModel::CompositeOperation);
CSSValue* value() const { return m_value.get(); }
virtual void populateAnimatableValue(CSSPropertyID, Element&, const ComputedStyle* baseStyle) const;
virtual const PassRefPtrWillBeRawPtr<AnimatableValue> getAnimatableValue() const override final { return m_animatableValueCache.get(); }
void setAnimatableValue(PassRefPtrWillBeRawPtr<AnimatableValue> value) { m_animatableValueCache = value; }
virtual PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const override final;
virtual PassRefPtrWillBeRawPtr<Interpolation> maybeCreateInterpolation(PropertyHandle, Keyframe::PropertySpecificKeyframe& end, Element*, const ComputedStyle* baseStyle) const override final;
DECLARE_VIRTUAL_TRACE();
private:
CSSPropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, CSSValue*);
virtual PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> cloneWithOffset(double offset) const;
virtual bool isCSSPropertySpecificKeyframe() const override { return true; }
static bool createInterpolationsFromCSSValues(CSSPropertyID, CSSValue* fromCSSValue, CSSValue* toCSSValue, Element*, OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation>>>& interpolations);
void populateAnimatableValueCaches(CSSPropertyID, Keyframe::PropertySpecificKeyframe&, Element*, CSSValue& fromCSSValue, CSSValue& toCSSValue) const;
RefPtrWillBeMember<CSSValue> m_value;
mutable RefPtrWillBeMember<AnimatableValue> m_animatableValueCache;
};
class SVGPropertySpecificKeyframe : public Keyframe::PropertySpecificKeyframe {
public:
SVGPropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, const String&, EffectModel::CompositeOperation);
const String& value() const { return m_value; }
virtual PassOwnPtrWillBeRawPtr<PropertySpecificKeyframe> cloneWithOffset(double offset) const override final;
virtual const PassRefPtrWillBeRawPtr<AnimatableValue> getAnimatableValue() const override final { return nullptr; }
virtual PassOwnPtrWillBeRawPtr<PropertySpecificKeyframe> neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const override final;
virtual PassRefPtrWillBeRawPtr<Interpolation> maybeCreateInterpolation(PropertyHandle, Keyframe::PropertySpecificKeyframe& end, Element*, const ComputedStyle* baseStyle) const override final;
DECLARE_VIRTUAL_TRACE();
private:
SVGPropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, const String&);
virtual bool isSVGPropertySpecificKeyframe() const override { return true; }
String m_value;
};
private:
StringKeyframe()
: m_propertySet(MutableStylePropertySet::create())
{ }
StringKeyframe(const StringKeyframe& copyFrom);
virtual PassRefPtrWillBeRawPtr<Keyframe> clone() const override;
virtual PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> createPropertySpecificKeyframe(PropertyHandle) const override;
virtual bool isStringKeyframe() const override { return true; }
RefPtrWillBeMember<MutableStylePropertySet> m_propertySet;
HashMap<const QualifiedName*, String> m_svgPropertyMap;
};
using CSSPropertySpecificKeyframe = StringKeyframe::CSSPropertySpecificKeyframe;
using SVGPropertySpecificKeyframe = StringKeyframe::SVGPropertySpecificKeyframe;
DEFINE_TYPE_CASTS(StringKeyframe, Keyframe, value, value->isStringKeyframe(), value.isStringKeyframe());
DEFINE_TYPE_CASTS(CSSPropertySpecificKeyframe, Keyframe::PropertySpecificKeyframe, value, value->isCSSPropertySpecificKeyframe(), value.isCSSPropertySpecificKeyframe());
DEFINE_TYPE_CASTS(SVGPropertySpecificKeyframe, Keyframe::PropertySpecificKeyframe, value, value->isSVGPropertySpecificKeyframe(), value.isSVGPropertySpecificKeyframe());
}
#endif