From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WebCore/svg/SVGPolyElement.cpp | 95 ++++++++++++----------------------- 1 file changed, 33 insertions(+), 62 deletions(-) (limited to 'Source/WebCore/svg/SVGPolyElement.cpp') diff --git a/Source/WebCore/svg/SVGPolyElement.cpp b/Source/WebCore/svg/SVGPolyElement.cpp index 56c90d9c8..7951a189f 100644 --- a/Source/WebCore/svg/SVGPolyElement.cpp +++ b/Source/WebCore/svg/SVGPolyElement.cpp @@ -19,26 +19,23 @@ */ #include "config.h" - -#if ENABLE(SVG) #include "SVGPolyElement.h" -#include "Attribute.h" #include "Document.h" -#include "FloatPoint.h" #include "RenderSVGPath.h" #include "RenderSVGResource.h" #include "SVGAnimatedPointList.h" -#include "SVGElementInstance.h" #include "SVGNames.h" #include "SVGParserUtilities.h" +#include "SVGPoint.h" +#include "SVGPointList.h" namespace WebCore { // Define custom animated property 'points'. const SVGPropertyInfo* SVGPolyElement::pointsPropertyInfo() { - static const SVGPropertyInfo* s_propertyInfo = 0; + static const SVGPropertyInfo* s_propertyInfo = nullptr; if (!s_propertyInfo) { s_propertyInfo = new SVGPropertyInfo(AnimatedPoints, PropertyIsReadWrite, @@ -65,105 +62,79 @@ SVGPolyElement::SVGPolyElement(const QualifiedName& tagName, Document& document) registerAnimatedPropertiesForSVGPolyElement(); } -bool SVGPolyElement::isSupportedAttribute(const QualifiedName& attrName) -{ - DEFINE_STATIC_LOCAL(HashSet, supportedAttributes, ()); - if (supportedAttributes.isEmpty()) { - SVGLangSpace::addSupportedAttributes(supportedAttributes); - SVGExternalResourcesRequired::addSupportedAttributes(supportedAttributes); - supportedAttributes.add(SVGNames::pointsAttr); - } - return supportedAttributes.contains(attrName); -} - void SVGPolyElement::parseAttribute(const QualifiedName& name, const AtomicString& value) { - if (!isSupportedAttribute(name)) { - SVGGraphicsElement::parseAttribute(name, value); - return; - } - if (name == SVGNames::pointsAttr) { - SVGPointList newList; + SVGPointListValues newList; if (!pointsListFromSVGData(newList, value)) - document().accessSVGExtensions()->reportError("Problem parsing points=\"" + value + "\""); + document().accessSVGExtensions().reportError("Problem parsing points=\"" + value + "\""); - if (SVGAnimatedProperty* wrapper = SVGAnimatedProperty::lookupWrapper(this, pointsPropertyInfo())) - static_cast(wrapper)->detachListWrappers(newList.size()); + if (auto wrapper = SVGAnimatedProperty::lookupWrapper(this, pointsPropertyInfo())) + static_pointer_cast(wrapper)->detachListWrappers(newList.size()); m_points.value = newList; return; } - if (SVGLangSpace::parseAttribute(name, value)) - return; - if (SVGExternalResourcesRequired::parseAttribute(name, value)) - return; - - ASSERT_NOT_REACHED(); + SVGGraphicsElement::parseAttribute(name, value); + SVGExternalResourcesRequired::parseAttribute(name, value); } void SVGPolyElement::svgAttributeChanged(const QualifiedName& attrName) { - if (!isSupportedAttribute(attrName)) { - SVGGraphicsElement::svgAttributeChanged(attrName); - return; - } - - SVGElementInstance::InvalidationGuard invalidationGuard(this); - - RenderSVGShape* renderer = toRenderSVGShape(this->renderer()); - if (!renderer) - return; - if (attrName == SVGNames::pointsAttr) { - renderer->setNeedsShapeUpdate(); - RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); + if (auto* renderer = downcast(this->renderer())) { + InstanceInvalidationGuard guard(*this); + renderer->setNeedsShapeUpdate(); + RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); + } return; } if (SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName)) { - RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); + if (auto* renderer = downcast(this->renderer())) { + InstanceInvalidationGuard guard(*this); + RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); + } return; } - ASSERT_NOT_REACHED(); + SVGGraphicsElement::svgAttributeChanged(attrName); } void SVGPolyElement::synchronizePoints(SVGElement* contextElement) { ASSERT(contextElement); - SVGPolyElement* ownerType = toSVGPolyElement(contextElement); - if (!ownerType->m_points.shouldSynchronize) + SVGPolyElement& ownerType = downcast(*contextElement); + if (!ownerType.m_points.shouldSynchronize) return; - ownerType->m_points.synchronize(ownerType, pointsPropertyInfo()->attributeName, ownerType->m_points.value.valueAsString()); + ownerType.m_points.synchronize(&ownerType, pointsPropertyInfo()->attributeName, ownerType.m_points.value.valueAsString()); } -PassRefPtr SVGPolyElement::lookupOrCreatePointsWrapper(SVGElement* contextElement) +Ref SVGPolyElement::lookupOrCreatePointsWrapper(SVGElement* contextElement) { ASSERT(contextElement); - SVGPolyElement* ownerType = toSVGPolyElement(contextElement); - return SVGAnimatedProperty::lookupOrCreateWrapper - (ownerType, pointsPropertyInfo(), ownerType->m_points.value); + SVGPolyElement& ownerType = downcast(*contextElement); + return SVGAnimatedProperty::lookupOrCreateWrapper(&ownerType, pointsPropertyInfo(), ownerType.m_points.value); } -SVGListPropertyTearOff* SVGPolyElement::points() +Ref SVGPolyElement::points() { m_points.shouldSynchronize = true; - return static_cast*>(static_pointer_cast(lookupOrCreatePointsWrapper(this))->baseVal()); + return static_reference_cast(lookupOrCreatePointsWrapper(this))->baseVal(); } -SVGListPropertyTearOff* SVGPolyElement::animatedPoints() +Ref SVGPolyElement::animatedPoints() { m_points.shouldSynchronize = true; - return static_cast*>(static_pointer_cast(lookupOrCreatePointsWrapper(this))->animVal()); + return static_reference_cast(lookupOrCreatePointsWrapper(this))->animVal(); } -bool isSVGPolyElement(const Node& node) +size_t SVGPolyElement::approximateMemoryCost() const { - return node.hasTagName(SVGNames::polygonTag) || node.hasTagName(SVGNames::polylineTag); + size_t pointsCost = pointList().size() * sizeof(FloatPoint); + // We need to account for the memory which is allocated by the RenderSVGPath::m_path. + return sizeof(*this) + (renderer() ? pointsCost * 2 + sizeof(RenderSVGPath) : pointsCost); } } - -#endif // ENABLE(SVG) -- cgit v1.2.1