SVGAnimatedPropertyList.h [plain text]
#pragma once
#include "SVGAnimatedProperty.h"
namespace WebCore {
template<typename ListType>
class SVGAnimatedPropertyList : public SVGAnimatedProperty {
public:
template<typename... Arguments>
static Ref<SVGAnimatedPropertyList> create(SVGElement* contextElement, Arguments&&... arguments)
{
return adoptRef(*new SVGAnimatedPropertyList(contextElement, std::forward<Arguments>(arguments)...));
}
~SVGAnimatedPropertyList()
{
m_baseVal->detach();
if (m_animVal)
m_animVal->detach();
}
const Ref<ListType>& baseVal() const { return m_baseVal; }
Ref<ListType>& baseVal() { return m_baseVal; }
const RefPtr<ListType>& animVal() const { return const_cast<SVGAnimatedPropertyList*>(this)->ensureAnimVal(); }
RefPtr<ListType>& animVal() { return ensureAnimVal(); }
String baseValAsString() const override { return m_baseVal->valueAsString(); }
String animValAsString() const override
{
ASSERT(isAnimating());
return m_animVal->valueAsString();
}
void setDirty() override { m_baseVal->setDirty(); }
bool isDirty() const override { return m_baseVal->isDirty(); }
Optional<String> synchronize() override { return m_baseVal->synchronize(); }
const ListType& currentValue() const
{
ASSERT_IMPLIES(isAnimating(), m_animVal);
return isAnimating() ? *m_animVal : m_baseVal.get();
}
void startAnimation() override
{
if (m_animVal)
*m_animVal = m_baseVal;
else
ensureAnimVal();
SVGAnimatedProperty::startAnimation();
}
void stopAnimation() override
{
if (m_animVal)
*m_animVal = m_baseVal;
SVGAnimatedProperty::stopAnimation();
}
void instanceStartAnimation(SVGAnimatedProperty& animated) override
{
m_animVal = static_cast<SVGAnimatedPropertyList&>(animated).animVal();
SVGAnimatedProperty::instanceStartAnimation(animated);
}
void instanceStopAnimation() override
{
m_animVal = nullptr;
SVGAnimatedProperty::instanceStopAnimation();
}
#if !COMPILER(MSVC)
protected:
#endif
template<typename... Arguments>
SVGAnimatedPropertyList(SVGElement* contextElement, Arguments&&... arguments)
: SVGAnimatedProperty(contextElement)
, m_baseVal(ListType::create(this, SVGPropertyAccess::ReadWrite, std::forward<Arguments>(arguments)...))
{
}
RefPtr<ListType>& ensureAnimVal()
{
if (!m_animVal)
m_animVal = ListType::create(m_baseVal, SVGPropertyAccess::ReadOnly);
return m_animVal;
}
void commitPropertyChange(SVGProperty* property) override
{
if (m_animVal)
*m_animVal = m_baseVal;
SVGAnimatedProperty::commitPropertyChange(property);
}
Ref<ListType> m_baseVal;
mutable RefPtr<ListType> m_animVal;
};
}