void SVGPolyElement::parseAttribute(const QualifiedName& name, const AtomicString& value) { if (!isSupportedAttribute(name)) { SVGGeometryElement::parseAttribute(name, value); return; } if (name == SVGNames::pointsAttr) { SVGPointList newList; if (!pointsListFromSVGData(newList, value)) document().accessSVGExtensions()->reportError("Problem parsing points=\"" + value + "\""); if (SVGAnimatedProperty* wrapper = SVGAnimatedProperty::lookupWrapper<SVGPolyElement, SVGAnimatedPointList>(this, pointsPropertyInfo())) static_cast<SVGAnimatedPointList*>(wrapper)->detachListWrappers(newList.size()); m_points.value = newList; return; } if (SVGLangSpace::parseAttribute(name, value)) return; if (SVGExternalResourcesRequired::parseAttribute(name, value)) return; ASSERT_NOT_REACHED(); }
void SVGPolyElement::parseMappedAttribute(MappedAttribute* attr) { const AtomicString& value = attr->value(); if (attr->name() == SVGNames::pointsAttr) { ExceptionCode ec = 0; points()->clear(ec); if (!pointsListFromSVGData(points(), value)) { points()->clear(ec); document()->accessSVGExtensions()->reportError("Problem parsing points=\"" + value + "\""); } } else { if (SVGTests::parseMappedAttribute(attr)) return; if (SVGLangSpace::parseMappedAttribute(attr)) return; if (SVGExternalResourcesRequired::parseMappedAttribute(attr)) return; SVGStyledTransformableElement::parseMappedAttribute(attr); } }
void SVGPolyElement::parseMappedAttribute(Attribute* attr) { const AtomicString& value = attr->value(); if (attr->name() == SVGNames::pointsAttr) { SVGPointList newList; if (!pointsListFromSVGData(newList, value)) document()->accessSVGExtensions()->reportError("Problem parsing points=\"" + value + "\""); if (SVGAnimatedListPropertyTearOff<SVGPointList>* list = m_animatablePointsList.get()) list->detachListWrappers(newList.size()); m_points.value = newList; } else { if (SVGTests::parseMappedAttribute(attr)) return; if (SVGLangSpace::parseMappedAttribute(attr)) return; if (SVGExternalResourcesRequired::parseMappedAttribute(attr)) return; SVGStyledTransformableElement::parseMappedAttribute(attr); } }
PassOwnPtr<SVGAnimatedType> SVGAnimatedPointListAnimator::constructFromString(const String& string) { OwnPtr<SVGAnimatedType> animtedType = SVGAnimatedType::createPointList(new SVGPointList); pointsListFromSVGData(animtedType->pointList(), string); return animtedType.release(); }
bool SVGAnimatedType::setValueAsString(const QualifiedName& attrName, const String& value) { ExceptionCode ec = 0; switch (m_type) { case AnimatedAngle: ASSERT(m_data.angle); m_data.angle->setValueAsString(value, ec); break; case AnimatedBoolean: ASSERT(m_data.boolean); *m_data.boolean = value == "true" ? true : false; break; case AnimatedColor: ASSERT(m_data.color); *m_data.color = value.isEmpty() ? Color() : SVGColor::colorFromRGBColorString(value); break; case AnimatedInteger: { ASSERT(m_data.integer); bool ok; *m_data.integer = value.toIntStrict(&ok); if (!ok) ec = 1; // Arbitary value > 0, it doesn't matter as we don't report the exception code. break; } case AnimatedLength: ASSERT(m_data.length); m_data.length->setValueAsString(value, SVGLength::lengthModeForAnimatedLengthAttribute(attrName), ec); break; case AnimatedLengthList: ASSERT(m_data.lengthList); m_data.lengthList->parse(value, SVGLength::lengthModeForAnimatedLengthAttribute(attrName)); break; case AnimatedNumber: ASSERT(m_data.number); parseNumberFromString(value, *m_data.number); break; case AnimatedNumberList: ASSERT(m_data.numberList); m_data.numberList->parse(value); break; case AnimatedNumberOptionalNumber: ASSERT(m_data.numberOptionalNumber); parseNumberOptionalNumber(value, m_data.numberOptionalNumber->first, m_data.numberOptionalNumber->second); break; case AnimatedPath: { ASSERT(m_data.path); OwnPtr<SVGPathByteStream> pathByteStream = adoptPtr(m_data.path); if (!SVGPathParserFactory::self()->buildSVGPathByteStreamFromString(value, pathByteStream, UnalteredParsing)) ec = 1; // Arbitary value > 0, it doesn't matter as we don't report the exception code. m_data.path = pathByteStream.leakPtr(); break; } case AnimatedPoints: ASSERT(m_data.pointList); m_data.pointList->clear(); pointsListFromSVGData(*m_data.pointList, value); break; case AnimatedPreserveAspectRatio: ASSERT(m_data.preserveAspectRatio); SVGPreserveAspectRatio::parsePreserveAspectRatio(this, value); break; case AnimatedRect: ASSERT(m_data.rect); parseRect(value, *m_data.rect); break; case AnimatedString: ASSERT(m_data.string); *m_data.string = value; break; default: ASSERT_NOT_REACHED(); break; } return !ec; }