📄 svganimatedproperty.h
字号:
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> template<typename T1, typename T2> SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::SVGAnimatedProperty(const OwnerType* owner, const QualifiedName& attributeName, const T1& arg1, const T2& arg2) : m_ownerType(owner) , m_attributeName(attributeName) , m_attributeIdentifier(attributeName.localName()) , m_value(arg1, arg2) { ASSERT(m_ownerType); } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> template<typename T1, typename T2> SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::SVGAnimatedProperty(const OwnerType* owner, const QualifiedName& attributeName, const AtomicString& attributeIdentifier, const T1& arg1, const T2& arg2) : m_ownerType(owner) , m_attributeName(attributeName) , m_attributeIdentifier(attributeIdentifier) , m_value(arg1, arg2) { ASSERT(m_ownerType); } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> template<typename T1, typename T2, typename T3> SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::SVGAnimatedProperty(const OwnerType* owner, const QualifiedName& attributeName, const T1& arg1, const T2& arg2, const T3& arg3) : m_ownerType(owner) , m_attributeName(attributeName) , m_attributeIdentifier(attributeName.localName()) , m_value(arg1, arg2, arg3) { ASSERT(m_ownerType); } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> template<typename T1, typename T2, typename T3> SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::SVGAnimatedProperty(const OwnerType* owner, const QualifiedName& attributeName, const AtomicString& attributeIdentifier, const T1& arg1, const T2& arg2, const T3& arg3) : m_ownerType(owner) , m_attributeName(attributeName) , m_attributeIdentifier(attributeIdentifier) , m_value(arg1, arg2, arg3) { ASSERT(m_ownerType); } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> typename SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::DecoratedType SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::value() const { return m_value; } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::setValue(typename SVGAnimatedProperty::DecoratedType newValue) { m_value = newValue; ownerElement()->setSynchronizedSVGAttributes(false); } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> typename SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::DecoratedType SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::baseValue() const { const OwnerElement* ownerElement = this->ownerElement(); SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions(); if (extensions && extensions->hasBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier)) return extensions->baseValue<DecoratedType>(ownerElement, m_attributeIdentifier); return m_value; } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::setBaseValue(typename SVGAnimatedProperty::DecoratedType newValue) { const OwnerElement* ownerElement = this->ownerElement(); SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions(); if (extensions && extensions->hasBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier)) { extensions->setBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier, newValue); return; } // Only update stored property, if not animating m_value = newValue; ownerElement->setSynchronizedSVGAttributes(false); } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> PassRefPtr<typename SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::TearOff> SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::animatedTearOff() const { return lookupOrCreateWrapper<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName, TearOff, OwnerElement>(*this, ownerElement(), m_attributeName, m_attributeIdentifier); } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::synchronize() const { if (!m_value.needsSynchronization()) return; synchronizeProperty<OwnerElement, DecoratedType>(ownerElement(), m_attributeName, baseValue()); m_value.setSynchronized(); } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::startAnimation() const { const OwnerElement* ownerElement = this->ownerElement(); SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions(); if (extensions) { ASSERT(!extensions->hasBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier)); extensions->setBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier, m_value); } } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::stopAnimation() { const OwnerElement* ownerElement = this->ownerElement(); SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions(); if (extensions) { ASSERT(extensions->hasBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier)); setValue(extensions->baseValue<DecoratedType>(ownerElement, m_attributeIdentifier)); extensions->removeBaseValue<AnimatedType>(ownerElement, m_attributeIdentifier); } } template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName> const typename SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::OwnerElement* SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::ownerElement() const { return OwnerElementForType::ownerElement(m_ownerType); } // GetOwnerElementForType implementation template<typename OwnerType> struct GetOwnerElementForType<OwnerType, true> : Noncopyable { typedef OwnerType OwnerElement; static const OwnerElement* ownerElement(const OwnerType* type) { return type; } }; template<typename OwnerType> struct GetOwnerElementForType<OwnerType, false> : Noncopyable { typedef SVGElement OwnerElement; static const OwnerElement* ownerElement(const OwnerType* type) { const OwnerElement* context = type->contextElement(); ASSERT(context); return context; } }; // IsDerivedFromSVGElement implementation template<typename OwnerType> struct IsDerivedFromSVGElement : Noncopyable { static const bool value = true; }; class SVGExternalResourcesRequired; template<> struct IsDerivedFromSVGElement<SVGExternalResourcesRequired> : Noncopyable { static const bool value = false; }; class SVGFitToViewBox; template<> struct IsDerivedFromSVGElement<SVGFitToViewBox> : Noncopyable { static const bool value = false; }; class SVGURIReference; template<> struct IsDerivedFromSVGElement<SVGURIReference> : Noncopyable { static const bool value = false; }; // Central function handling the main SVG<->XML synchronization part. template<typename OwnerElement, typename DecoratedType> void synchronizeProperty(const OwnerElement* ownerElement, const QualifiedName& attributeName, DecoratedType baseValue) { AtomicString value(SVGAnimatedTypeValue<DecoratedType>::toString(baseValue)); NamedAttrMap* namedAttrMap = ownerElement->attributes(false); Attribute* old = namedAttrMap->getAttributeItem(attributeName); if (old && value.isNull()) namedAttrMap->removeAttribute(old->name()); else if (!old && !value.isNull()) namedAttrMap->addAttribute(const_cast<OwnerElement*>(ownerElement)->createAttribute(QualifiedName(nullAtom, attributeName.localName(), nullAtom), value)); else if (old && !value.isNull()) old->setValue(value); } // Helper macro used to register animated properties within SVG* classes #define ANIMATED_PROPERTY_DECLARATIONS(OwnerType, ElementTag, AttributeTag, AnimatedType, UpperProperty, LowerProperty) \ private: \ typedef SVGAnimatedProperty<OwnerType, AnimatedType, ElementTag, AttributeTag> SVGAnimatedProperty##UpperProperty; \ typedef SVGAnimatedTypeValue<AnimatedType>::DecoratedType DecoratedTypeFor##UpperProperty; \ SVGAnimatedProperty##UpperProperty m_##LowerProperty; \ public: \ DecoratedTypeFor##UpperProperty LowerProperty() const { return m_##LowerProperty.value(); } \ void set##UpperProperty(DecoratedTypeFor##UpperProperty type) { m_##LowerProperty.setValue(type); } \ DecoratedTypeFor##UpperProperty LowerProperty##BaseValue() const { return m_##LowerProperty.baseValue(); } \ void set##UpperProperty##BaseValue(DecoratedTypeFor##UpperProperty type) { m_##LowerProperty.setBaseValue(type); } \ PassRefPtr<SVGAnimatedProperty##UpperProperty::TearOff> LowerProperty##Animated() const { return m_##LowerProperty.animatedTearOff(); } \ void synchronize##UpperProperty() const { m_##LowerProperty.synchronize(); }};#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -