SVGAnimatedPropertyMacros.h [plain text]
#ifndef SVGAnimatedPropertyMacros_h
#define SVGAnimatedPropertyMacros_h
#if ENABLE(SVG)
#include "SVGAnimatedPropertySynchronizer.h"
#include "SVGPropertyTraits.h"
namespace WebCore {
template<typename OwnerType, bool isDerivedFromSVGElement>
struct GetOwnerElementForType;
template<typename OwnerType>
struct GetOwnerElementForType<OwnerType, true> {
static SVGElement* ownerElement(OwnerType* type)
{
return type;
}
};
template<typename OwnerType>
struct GetOwnerElementForType<OwnerType, false> {
static SVGElement* ownerElement(OwnerType* type)
{
SVGElement* context = type->contextElement();
ASSERT(context);
return context;
}
};
template<typename OwnerType>
struct IsDerivedFromSVGElement {
static const bool value = true;
};
class SVGViewSpec;
template<>
struct IsDerivedFromSVGElement<SVGViewSpec> {
static const bool value = false;
};
template<typename PropertyType>
struct SVGSynchronizableAnimatedProperty {
SVGSynchronizableAnimatedProperty()
: value(SVGPropertyTraits<PropertyType>::initialValue())
, shouldSynchronize(false)
{
}
template<typename ConstructorParameter1>
SVGSynchronizableAnimatedProperty(const ConstructorParameter1& value1)
: value(value1)
, shouldSynchronize(false)
{
}
template<typename ConstructorParameter1, typename ConstructorParameter2>
SVGSynchronizableAnimatedProperty(const ConstructorParameter1& value1, const ConstructorParameter2& value2)
: value(value1, value2)
, shouldSynchronize(false)
{
}
PropertyType value;
bool shouldSynchronize : 1;
};
#define DEFINE_ANIMATED_PROPERTY(OwnerType, DOMAttribute, SVGDOMAttributeIdentifier, TearOffType, PropertyType, UpperProperty, LowerProperty) \
void OwnerType::synchronize##UpperProperty() \
{ \
if (!m_##LowerProperty.shouldSynchronize) \
return; \
AtomicString value(SVGPropertyTraits<PropertyType>::toString(LowerProperty##BaseValue())); \
SVGElement* contextElement = GetOwnerElementForType<OwnerType, IsDerivedFromSVGElement<OwnerType>::value>::ownerElement(this); \
SVGAnimatedPropertySynchronizer<IsDerivedFromSVGElement<OwnerType>::value>::synchronize(contextElement, DOMAttribute, value); \
} \
\
PassRefPtr<TearOffType> OwnerType::LowerProperty##Animated() \
{ \
m_##LowerProperty.shouldSynchronize = true; \
SVGElement* contextElement = GetOwnerElementForType<OwnerType, IsDerivedFromSVGElement<OwnerType>::value>::ownerElement(this); \
return SVGAnimatedProperty::lookupOrCreateWrapper<TearOffType, PropertyType>(contextElement, DOMAttribute, SVGDOMAttributeIdentifier, m_##LowerProperty.value); \
}
#define DECLARE_ANIMATED_PROPERTY(TearOffType, PropertyType, UpperProperty, LowerProperty) \
public: \
PropertyType& LowerProperty() const \
{ \
return m_##LowerProperty.value; \
} \
\
PropertyType& LowerProperty##BaseValue() const \
{ \
return m_##LowerProperty.value; \
} \
\
void set##UpperProperty##BaseValue(const PropertyType& type) \
{ \
m_##LowerProperty.value = type; \
} \
\
PassRefPtr<TearOffType> LowerProperty##Animated(); \
\
private: \
void synchronize##UpperProperty(); \
\
mutable SVGSynchronizableAnimatedProperty<PropertyType> m_##LowerProperty;
#define DECLARE_ANIMATED_LIST_PROPERTY(TearOffType, PropertyType, UpperProperty, LowerProperty) \
DECLARE_ANIMATED_PROPERTY(TearOffType, PropertyType, UpperProperty, LowerProperty) \
void detachAnimated##UpperProperty##ListWrappers(unsigned newListSize);
#define DEFINE_ANIMATED_LIST_PROPERTY(OwnerType, DOMAttribute, SVGDOMAttributeIdentifier, TearOffType, PropertyType, UpperProperty, LowerProperty) \
DEFINE_ANIMATED_PROPERTY(OwnerType, DOMAttribute, SVGDOMAttributeIdentifier, TearOffType, PropertyType, UpperProperty, LowerProperty) \
void OwnerType::detachAnimated##UpperProperty##ListWrappers(unsigned newListSize) \
{ \
SVGElement* contextElement = GetOwnerElementForType<OwnerType, IsDerivedFromSVGElement<OwnerType>::value>::ownerElement(this); \
SVGAnimatedProperty* wrapper = SVGAnimatedProperty::lookupWrapper<TearOffType>(contextElement, DOMAttribute.localName()); \
if (!wrapper) \
return; \
static_cast<TearOffType*>(wrapper)->detachListWrappers(newListSize); \
}
}
#endif // ENABLE(SVG)
#endif // SVGAnimatedPropertyMacros_h