• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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.
24  */
25 
26 #include "config.h"
27 
28 #if ENABLE(SVG)
29 #include "SVGResource.h"
30 
31 #include "RenderPath.h"
32 #include "SVGElement.h"
33 #include "SVGStyledElement.h"
34 #include <wtf/HashSet.h>
35 #include <wtf/StdLibExtras.h>
36 
37 namespace WebCore {
38 
39 typedef HashSet<SVGResource*> ResourceSet;
40 
resourceSet()41 static ResourceSet& resourceSet()
42 {
43     DEFINE_STATIC_LOCAL(ResourceSet, set, ());
44     return set;
45 }
46 
SVGResource()47 SVGResource::SVGResource()
48 {
49     ASSERT(!resourceSet().contains(this));
50     resourceSet().add(this);
51 }
52 
53 
~SVGResource()54 SVGResource::~SVGResource()
55 {
56     ASSERT(resourceSet().contains(this));
57     resourceSet().remove(this);
58 }
59 
invalidate()60 void SVGResource::invalidate()
61 {
62     HashSet<SVGStyledElement*>::const_iterator it = m_clients.begin();
63     const HashSet<SVGStyledElement*>::const_iterator end = m_clients.end();
64 
65     for (; it != end; ++it) {
66         SVGStyledElement* cur = *it;
67 
68         if (cur->renderer())
69             cur->renderer()->setNeedsLayout(true);
70 
71         cur->invalidateResourcesInAncestorChain();
72     }
73 }
74 
invalidateClients(HashSet<SVGStyledElement * > clients)75 void SVGResource::invalidateClients(HashSet<SVGStyledElement*> clients)
76 {
77     HashSet<SVGStyledElement*>::const_iterator it = clients.begin();
78     const HashSet<SVGStyledElement*>::const_iterator end = clients.end();
79 
80     for (; it != end; ++it) {
81         SVGStyledElement* cur = *it;
82 
83         if (cur->renderer())
84             cur->renderer()->setNeedsLayout(true);
85 
86         cur->invalidateResourcesInAncestorChain();
87     }
88 }
89 
removeClient(SVGStyledElement * item)90 void SVGResource::removeClient(SVGStyledElement* item)
91 {
92     ResourceSet::iterator it = resourceSet().begin();
93     ResourceSet::iterator end = resourceSet().end();
94 
95     for (; it != end; ++it) {
96         SVGResource* resource = *it;
97         if (!resource->m_clients.contains(item))
98             continue;
99         resource->m_clients.remove(item);
100     }
101 }
102 
addClient(SVGStyledElement * item)103 void SVGResource::addClient(SVGStyledElement* item)
104 {
105     if (m_clients.contains(item))
106         return;
107 
108     m_clients.add(item);
109 }
110 
externalRepresentation(TextStream & ts) const111 TextStream& SVGResource::externalRepresentation(TextStream& ts) const
112 {
113     return ts;
114 }
115 
getResourceById(Document * document,const AtomicString & id,const RenderObject * object)116 SVGResource* getResourceById(Document* document, const AtomicString& id, const RenderObject* object)
117 {
118     if (id.isEmpty())
119         return 0;
120 
121     Element* element = document->getElementById(id);
122     SVGElement* svgElement = 0;
123     if (element && element->isSVGElement())
124         svgElement = static_cast<SVGElement*>(element);
125 
126     if (svgElement && svgElement->isStyled())
127         return static_cast<SVGStyledElement*>(svgElement)->canvasResource(object);
128 
129     return 0;
130 }
131 
operator <<(TextStream & ts,const SVGResource & r)132 TextStream& operator<<(TextStream& ts, const SVGResource& r)
133 {
134     return r.externalRepresentation(ts);
135 }
136 
137 }
138 
139 #endif
140