2 * Copyright (C) 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "wtf/Platform.h"
30 #include "SVGResource.h"
32 #include "RenderPath.h"
33 #include "SVGElement.h"
34 #include "SVGStyledElement.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
);
155 /*TextStream& SVGResource::externalRepresentation(TextStream& ts) const
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();
176 /*TextStream& operator<<(TextStream& ts, const SVGResource& r)
178 return r.externalRepresentation(ts);