void SVGAnimatedPathAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGAnimatedType* type) { ASSERT(animatedTypes.size() >= 1); ASSERT(type); ASSERT(type->type() == m_type); const SVGPathSegList& baseValue = castAnimatedPropertyToActualType<SVGAnimatedPathSegListPropertyTearOff>(animatedTypes[0].properties[0].get())->currentBaseValue(); buildSVGPathByteStreamFromSVGPathSegList(baseValue, type->path(), UnalteredParsing); }
SVGElementAnimatedPropertyList SVGAnimatedTypeAnimator::findAnimatedPropertiesForAttributeName(SVGElement* targetElement, const QualifiedName& attributeName) { ASSERT(targetElement); SVGElementAnimatedPropertyList propertiesByInstance; Vector<RefPtr<SVGAnimatedProperty> > targetProperties; targetElement->localAttributeToPropertyMap().animatedPropertiesForAttribute(targetElement, attributeName, targetProperties); if (!SVGAnimatedType::supportsAnimVal(m_type)) return SVGElementAnimatedPropertyList(); SVGElementAnimatedProperties propertiesPair(targetElement, targetProperties); propertiesByInstance.append(propertiesPair); const HashSet<SVGElementInstance*>& instances = targetElement->instancesForElement(); const HashSet<SVGElementInstance*>::const_iterator end = instances.end(); for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it != end; ++it) { SVGElement* shadowTreeElement = (*it)->shadowTreeElement(); if (!shadowTreeElement) continue; Vector<RefPtr<SVGAnimatedProperty> > instanceProperties; targetElement->localAttributeToPropertyMap().animatedPropertiesForAttribute(shadowTreeElement, attributeName, instanceProperties); SVGElementAnimatedProperties instancePropertiesPair(shadowTreeElement, instanceProperties); propertiesByInstance.append(instancePropertiesPair); } #if !ASSERT_DISABLED SVGElementAnimatedPropertyList::const_iterator propertiesEnd = propertiesByInstance.end(); for (SVGElementAnimatedPropertyList::const_iterator it = propertiesByInstance.begin(); it != propertiesEnd; ++it) { size_t propertiesSize = it->properties.size(); for (size_t i = 0; i < propertiesSize; ++i) { RefPtr<SVGAnimatedProperty> property = it->properties[i]; if (property->animatedPropertyType() != m_type) { ASSERT(m_type == AnimatedAngle); ASSERT(property->animatedPropertyType() == AnimatedEnumeration); } } } #endif return propertiesByInstance; }
PassOwnPtr<SVGAnimatedType> SVGAnimatedPathAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes) { ASSERT(animatedTypes.size() >= 1); SVGAnimatedPathSegListPropertyTearOff* property = castAnimatedPropertyToActualType<SVGAnimatedPathSegListPropertyTearOff>(animatedTypes[0].properties[0].get()); const SVGPathSegList& baseValue = property->currentBaseValue(); // Build initial path byte stream. OwnPtr<SVGPathByteStream> byteStream = SVGPathByteStream::create(); buildSVGPathByteStreamFromSVGPathSegList(baseValue, byteStream.get(), UnalteredParsing); Vector<RefPtr<SVGAnimatedPathSegListPropertyTearOff> > result; SVGElementAnimatedPropertyList::const_iterator end = animatedTypes.end(); for (SVGElementAnimatedPropertyList::const_iterator it = animatedTypes.begin(); it != end; ++it) result.append(castAnimatedPropertyToActualType<SVGAnimatedPathSegListPropertyTearOff>(it->properties[0].get())); SVGElementInstance::InstanceUpdateBlocker blocker(property->contextElement()); size_t resultSize = result.size(); for (size_t i = 0; i < resultSize; ++i) result[i]->animationStarted(byteStream.get(), &baseValue); return SVGAnimatedType::createPath(byteStream.release()); }