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();