| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org> |
| 3 * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org> |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "core/svg/SVGPolyElement.h" | 23 #include "core/svg/SVGPolyElement.h" |
| 24 | 24 |
| 25 #include "core/dom/Document.h" | 25 #include "core/dom/Document.h" |
| 26 #include "core/rendering/svg/RenderSVGResource.h" | 26 #include "core/rendering/svg/RenderSVGResource.h" |
| 27 #include "core/svg/SVGAnimatedPointList.h" | 27 #include "core/svg/SVGAnimatedPointList.h" |
| 28 #include "core/svg/SVGElementInstance.h" | 28 #include "core/svg/SVGElementInstance.h" |
| 29 #include "core/svg/SVGParserUtilities.h" | 29 #include "core/svg/SVGParserUtilities.h" |
| 30 | 30 |
| 31 namespace WebCore { | 31 namespace WebCore { |
| 32 | 32 |
| 33 // Define custom animated property 'points'. | |
| 34 const SVGPropertyInfo* SVGPolyElement::pointsPropertyInfo() | |
| 35 { | |
| 36 static const SVGPropertyInfo* s_propertyInfo = 0; | |
| 37 if (!s_propertyInfo) { | |
| 38 s_propertyInfo = new SVGPropertyInfo(AnimatedPoints, | |
| 39 PropertyIsReadWrite, | |
| 40 SVGNames::pointsAttr, | |
| 41 SVGNames::pointsAttr.localName(), | |
| 42 &SVGPolyElement::synchronizePoints, | |
| 43 &SVGPolyElement::lookupOrCreatePoin
tsWrapper); | |
| 44 } | |
| 45 return s_propertyInfo; | |
| 46 } | |
| 47 | |
| 48 SVGPointList& SVGPolyElement::pointsCurrentValue() | |
| 49 { | |
| 50 SVGAnimatedProperty* wrapper = SVGAnimatedProperty::lookupWrapper<SVGPolyEle
ment, SVGAnimatedPointList>(this, pointsPropertyInfo()); | |
| 51 if (wrapper && wrapper->isAnimating()) { | |
| 52 if (SVGListPropertyTearOff<SVGPointList>* ap = animatedPoints()) | |
| 53 return ap->values(); | |
| 54 } | |
| 55 | |
| 56 return m_points.value; | |
| 57 } | |
| 58 | |
| 59 // Animated property definitions | 33 // Animated property definitions |
| 60 | 34 |
| 61 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGPolyElement) | 35 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGPolyElement) |
| 62 REGISTER_LOCAL_ANIMATED_PROPERTY(points) | |
| 63 REGISTER_PARENT_ANIMATED_PROPERTIES(SVGGraphicsElement) | 36 REGISTER_PARENT_ANIMATED_PROPERTIES(SVGGraphicsElement) |
| 64 END_REGISTER_ANIMATED_PROPERTIES | 37 END_REGISTER_ANIMATED_PROPERTIES |
| 65 | 38 |
| 66 SVGPolyElement::SVGPolyElement(const QualifiedName& tagName, Document& document) | 39 SVGPolyElement::SVGPolyElement(const QualifiedName& tagName, Document& document) |
| 67 : SVGGeometryElement(tagName, document) | 40 : SVGGeometryElement(tagName, document) |
| 41 , m_points(SVGAnimatedPointList::create(this, SVGNames::pointsAttr, SVGPoint
List::create())) |
| 68 { | 42 { |
| 43 addToPropertyMap(m_points); |
| 69 registerAnimatedPropertiesForSVGPolyElement(); | 44 registerAnimatedPropertiesForSVGPolyElement(); |
| 70 } | 45 } |
| 71 | 46 |
| 72 bool SVGPolyElement::isSupportedAttribute(const QualifiedName& attrName) | 47 bool SVGPolyElement::isSupportedAttribute(const QualifiedName& attrName) |
| 73 { | 48 { |
| 74 DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ()); | 49 DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ()); |
| 75 if (supportedAttributes.isEmpty()) { | 50 if (supportedAttributes.isEmpty()) { |
| 76 supportedAttributes.add(SVGNames::pointsAttr); | 51 supportedAttributes.add(SVGNames::pointsAttr); |
| 77 } | 52 } |
| 78 return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); | 53 return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); |
| 79 } | 54 } |
| 80 | 55 |
| 81 void SVGPolyElement::parseAttribute(const QualifiedName& name, const AtomicStrin
g& value) | 56 void SVGPolyElement::parseAttribute(const QualifiedName& name, const AtomicStrin
g& value) |
| 82 { | 57 { |
| 83 if (!isSupportedAttribute(name)) { | 58 if (!isSupportedAttribute(name)) { |
| 84 SVGGeometryElement::parseAttribute(name, value); | 59 SVGGeometryElement::parseAttribute(name, value); |
| 85 return; | 60 return; |
| 86 } | 61 } |
| 87 | 62 |
| 88 if (name == SVGNames::pointsAttr) { | 63 if (name == SVGNames::pointsAttr) { |
| 89 SVGPointList newList; | 64 SVGParsingError parseError = NoError; |
| 90 if (!pointsListFromSVGData(newList, value)) | 65 m_points->setBaseValueAsString(value, parseError); |
| 91 document().accessSVGExtensions()->reportError("Problem parsing point
s=\"" + value + "\""); | 66 reportAttributeParsingError(parseError, name, value); |
| 92 | |
| 93 if (SVGAnimatedProperty* wrapper = SVGAnimatedProperty::lookupWrapper<SV
GPolyElement, SVGAnimatedPointList>(this, pointsPropertyInfo())) | |
| 94 static_cast<SVGAnimatedPointList*>(wrapper)->detachListWrappers(newL
ist.size()); | |
| 95 | |
| 96 m_points.value = newList; | |
| 97 return; | 67 return; |
| 98 } | 68 } |
| 99 | 69 |
| 100 ASSERT_NOT_REACHED(); | 70 ASSERT_NOT_REACHED(); |
| 101 } | 71 } |
| 102 | 72 |
| 103 void SVGPolyElement::svgAttributeChanged(const QualifiedName& attrName) | 73 void SVGPolyElement::svgAttributeChanged(const QualifiedName& attrName) |
| 104 { | 74 { |
| 105 if (!isSupportedAttribute(attrName)) { | 75 if (!isSupportedAttribute(attrName)) { |
| 106 SVGGeometryElement::svgAttributeChanged(attrName); | 76 SVGGeometryElement::svgAttributeChanged(attrName); |
| 107 return; | 77 return; |
| 108 } | 78 } |
| 109 | 79 |
| 110 SVGElementInstance::InvalidationGuard invalidationGuard(this); | 80 SVGElementInstance::InvalidationGuard invalidationGuard(this); |
| 111 | 81 |
| 112 RenderSVGShape* renderer = toRenderSVGShape(this->renderer()); | 82 RenderSVGShape* renderer = toRenderSVGShape(this->renderer()); |
| 113 if (!renderer) | 83 if (!renderer) |
| 114 return; | 84 return; |
| 115 | 85 |
| 116 if (attrName == SVGNames::pointsAttr) { | 86 if (attrName == SVGNames::pointsAttr) { |
| 117 renderer->setNeedsShapeUpdate(); | 87 renderer->setNeedsShapeUpdate(); |
| 118 RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer); | 88 RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer); |
| 119 return; | 89 return; |
| 120 } | 90 } |
| 121 | 91 |
| 122 ASSERT_NOT_REACHED(); | 92 ASSERT_NOT_REACHED(); |
| 123 } | 93 } |
| 124 | 94 |
| 125 void SVGPolyElement::synchronizePoints(SVGElement* contextElement) | |
| 126 { | |
| 127 ASSERT(contextElement); | |
| 128 SVGPolyElement* ownerType = toSVGPolyElement(contextElement); | |
| 129 if (!ownerType->m_points.shouldSynchronize) | |
| 130 return; | |
| 131 ownerType->m_points.synchronize(ownerType, pointsPropertyInfo()->attributeNa
me, AtomicString(ownerType->m_points.value.valueAsString())); | |
| 132 } | 95 } |
| 133 | |
| 134 PassRefPtr<SVGAnimatedProperty> SVGPolyElement::lookupOrCreatePointsWrapper(SVGE
lement* contextElement) | |
| 135 { | |
| 136 ASSERT(contextElement); | |
| 137 SVGPolyElement* ownerType = toSVGPolyElement(contextElement); | |
| 138 return SVGAnimatedProperty::lookupOrCreateWrapper<SVGPolyElement, SVGAnimate
dPointList, SVGPointList> | |
| 139 (ownerType, pointsPropertyInfo(), ownerType->m_points.value); | |
| 140 } | |
| 141 | |
| 142 SVGListPropertyTearOff<SVGPointList>* SVGPolyElement::points() | |
| 143 { | |
| 144 m_points.shouldSynchronize = true; | |
| 145 return static_cast<SVGListPropertyTearOff<SVGPointList>*>(static_pointer_cas
t<SVGAnimatedPointList>(lookupOrCreatePointsWrapper(this))->baseVal()); | |
| 146 } | |
| 147 | |
| 148 SVGListPropertyTearOff<SVGPointList>* SVGPolyElement::animatedPoints() | |
| 149 { | |
| 150 m_points.shouldSynchronize = true; | |
| 151 return static_cast<SVGListPropertyTearOff<SVGPointList>*>(static_pointer_cas
t<SVGAnimatedPointList>(lookupOrCreatePointsWrapper(this))->animVal()); | |
| 152 } | |
| 153 | |
| 154 } | |
| OLD | NEW |