summaryrefslogtreecommitdiff
path: root/Source/WebCore/svg/SVGPolyElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/svg/SVGPolyElement.cpp')
-rw-r--r--Source/WebCore/svg/SVGPolyElement.cpp95
1 files changed, 33 insertions, 62 deletions
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<QualifiedName>, supportedAttributes, ());
- if (supportedAttributes.isEmpty()) {
- SVGLangSpace::addSupportedAttributes(supportedAttributes);
- SVGExternalResourcesRequired::addSupportedAttributes(supportedAttributes);
- supportedAttributes.add(SVGNames::pointsAttr);
- }
- return supportedAttributes.contains<SVGAttributeHashTranslator>(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<SVGPolyElement, SVGAnimatedPointList>(this, pointsPropertyInfo()))
- static_cast<SVGAnimatedPointList*>(wrapper)->detachListWrappers(newList.size());
+ if (auto wrapper = SVGAnimatedProperty::lookupWrapper<SVGPolyElement, SVGAnimatedPointList>(this, pointsPropertyInfo()))
+ static_pointer_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();
+ 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<RenderSVGPath>(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<RenderSVGPath>(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<SVGPolyElement>(*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<SVGAnimatedProperty> SVGPolyElement::lookupOrCreatePointsWrapper(SVGElement* contextElement)
+Ref<SVGAnimatedProperty> SVGPolyElement::lookupOrCreatePointsWrapper(SVGElement* contextElement)
{
ASSERT(contextElement);
- SVGPolyElement* ownerType = toSVGPolyElement(contextElement);
- return SVGAnimatedProperty::lookupOrCreateWrapper<SVGPolyElement, SVGAnimatedPointList, SVGPointList>
- (ownerType, pointsPropertyInfo(), ownerType->m_points.value);
+ SVGPolyElement& ownerType = downcast<SVGPolyElement>(*contextElement);
+ return SVGAnimatedProperty::lookupOrCreateWrapper<SVGPolyElement, SVGAnimatedPointList, SVGPointListValues>(&ownerType, pointsPropertyInfo(), ownerType.m_points.value);
}
-SVGListPropertyTearOff<SVGPointList>* SVGPolyElement::points()
+Ref<SVGPointList> SVGPolyElement::points()
{
m_points.shouldSynchronize = true;
- return static_cast<SVGListPropertyTearOff<SVGPointList>*>(static_pointer_cast<SVGAnimatedPointList>(lookupOrCreatePointsWrapper(this))->baseVal());
+ return static_reference_cast<SVGAnimatedPointList>(lookupOrCreatePointsWrapper(this))->baseVal();
}
-SVGListPropertyTearOff<SVGPointList>* SVGPolyElement::animatedPoints()
+Ref<SVGPointList> SVGPolyElement::animatedPoints()
{
m_points.shouldSynchronize = true;
- return static_cast<SVGListPropertyTearOff<SVGPointList>*>(static_pointer_cast<SVGAnimatedPointList>(lookupOrCreatePointsWrapper(this))->animVal());
+ return static_reference_cast<SVGAnimatedPointList>(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)