diff options
| author | Steve Block <steveblock@google.com> | 2011-05-06 11:45:16 +0100 | 
|---|---|---|
| committer | Steve Block <steveblock@google.com> | 2011-05-12 13:44:10 +0100 | 
| commit | cad810f21b803229eb11403f9209855525a25d57 (patch) | |
| tree | 29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h | |
| parent | 121b0cf4517156d0ac5111caf9830c51b69bae8f (diff) | |
| download | external_webkit-cad810f21b803229eb11403f9209855525a25d57.zip external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2 | |
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h')
| -rw-r--r-- | Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h | 151 | 
1 files changed, 151 insertions, 0 deletions
| diff --git a/Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h b/Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h new file mode 100644 index 0000000..d5ba21a --- /dev/null +++ b/Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> + * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> + * Copyright (C) Research In Motion Limited 2010. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB.  If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef SVGAnimatedPropertyMacros_h +#define SVGAnimatedPropertyMacros_h + +#if ENABLE(SVG) +#include "SVGAnimatedPropertySynchronizer.h" +#include "SVGPropertyTraits.h" + +namespace WebCore { + +// GetOwnerElementForType implementation +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; +    } +}; + +// IsDerivedFromSVGElement implementation +template<typename OwnerType> +struct IsDerivedFromSVGElement { +    static const bool value = true; +}; + +class SVGViewSpec; +template<> +struct IsDerivedFromSVGElement<SVGViewSpec> { +    static const bool value = false; +}; + +// SVGSynchronizableAnimatedProperty implementation +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 | 
