27#include "wtf/Platform.h"
32#include "RenderPath.h"
38SVGResource::SVGResource()
45 for (
int i = 0; i < _ResourceTypeCount; i++)
48 SVGResource* resources[_ResourceTypeCount];
51static HashMap<SVGStyledElement*, ResourceSet*>& clientMap() {
52 static HashMap<SVGStyledElement*, ResourceSet*> map;
56SVGResource::~SVGResource()
59 HashSet<SVGStyledElement*>::iterator itr = m_clients.begin();
61 for (; type < 0 && itr != m_clients.end(); ++itr) {
62 ResourceSet* target = clientMap().get(*itr);
66 for (
int i = 0; i < _ResourceTypeCount; i++) {
67 if (target->resources[i] !=
this)
70 target->resources[i] = 0;
78 for (; itr != m_clients.end(); ++itr) {
79 ResourceSet* target = clientMap().get(*itr);
83 if (target->resources[type] ==
this)
84 target->resources[type] = 0;
88void SVGResource::invalidate()
90 HashSet<SVGStyledElement*>::const_iterator it = m_clients.begin();
91 const HashSet<SVGStyledElement*>::const_iterator
end = m_clients.end();
93 for (; it !=
end; ++it) {
94 SVGStyledElement* cur = *it;
97 cur->renderer()->setNeedsLayout(
true);
99 cur->invalidateResourcesInAncestorChain();
103void SVGResource::invalidateClients(HashSet<SVGStyledElement*> clients)
105 HashSet<SVGStyledElement*>::const_iterator it = clients.begin();
106 const HashSet<SVGStyledElement*>::const_iterator
end = clients.end();
108 for (; it !=
end; ++it) {
109 SVGStyledElement* cur = *it;
112 cur->renderer()->setNeedsLayout(
true);
114 cur->invalidateResourcesInAncestorChain();
118void SVGResource::removeClient(SVGStyledElement* item)
120 HashMap<SVGStyledElement*, ResourceSet*>::iterator resourcePtr = clientMap().find(item);
121 if (resourcePtr == clientMap().
end())
124 ResourceSet* set = resourcePtr->second;
127 clientMap().remove(resourcePtr);
129 for (
int i = 0; i < _ResourceTypeCount; i++)
130 if (set->resources[i])
131 set->resources[i]->m_clients.remove(item);
136void SVGResource::addClient(SVGStyledElement* item)
138 if (m_clients.contains(item))
143 ResourceSet* target = clientMap().get(item);
145 target =
new ResourceSet;
147 SVGResourceType type = resourceType();
148 if (SVGResource* oldResource = target->resources[type])
149 oldResource->m_clients.remove(item);
151 target->resources[type] =
this;
152 clientMap().set(item, target);
160SVGResource* getResourceById(Document* document,
const AtomicString&
id)
165 Element* element = document->getElementById(
id);
166 SVGElement* svgElement = 0;
167 if (element && element->isSVGElement())
168 svgElement =
static_cast<SVGElement*
>(element);
170 if (svgElement && svgElement->isStyled())
171 return static_cast<SVGStyledElement*
>(svgElement)->canvasResource();