27 #include "wtf/Platform.h"
32 #include "RenderPath.h"
38 SVGResource::SVGResource()
45 for (
int i = 0; i < _ResourceTypeCount; i++)
48 SVGResource* resources[_ResourceTypeCount];
51 static HashMap<SVGStyledElement*, ResourceSet*>& clientMap() {
52 static HashMap<SVGStyledElement*, ResourceSet*> map;
56 SVGResource::~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;
88 void 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();
103 void 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();
118 void 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);
136 void 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);
160 SVGResource* 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();