• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KHTML

  • khtml
  • svg
  • graphics
SVGResource.cpp
Go to the documentation of this file.
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#include "wtf/Platform.h"
28
29#if ENABLE(SVG)
30#include "SVGResource.h"
31
32#include "RenderPath.h"
33#include "SVGElement.h"
34#include "SVGStyledElement.h"
35
36namespace WebCore {
37
38SVGResource::SVGResource()
39{
40}
41
42struct ResourceSet {
43 ResourceSet()
44 {
45 for (int i = 0; i < _ResourceTypeCount; i++)
46 resources[i] = 0;
47 }
48 SVGResource* resources[_ResourceTypeCount];
49};
50
51static HashMap<SVGStyledElement*, ResourceSet*>& clientMap() {
52 static HashMap<SVGStyledElement*, ResourceSet*> map;
53 return map;
54}
55
56SVGResource::~SVGResource()
57{
58 int type = -1;
59 HashSet<SVGStyledElement*>::iterator itr = m_clients.begin();
60
61 for (; type < 0 && itr != m_clients.end(); ++itr) {
62 ResourceSet* target = clientMap().get(*itr);
63 if (!target)
64 continue;
65
66 for (int i = 0; i < _ResourceTypeCount; i++) {
67 if (target->resources[i] != this)
68 continue;
69 type = i;
70 target->resources[i] = 0;
71 break;
72 }
73 }
74
75 if (type < 0)
76 return;
77
78 for (; itr != m_clients.end(); ++itr) {
79 ResourceSet* target = clientMap().get(*itr);
80 if (!target)
81 continue;
82
83 if (target->resources[type] == this)
84 target->resources[type] = 0;
85 }
86}
87
88void SVGResource::invalidate()
89{
90 HashSet<SVGStyledElement*>::const_iterator it = m_clients.begin();
91 const HashSet<SVGStyledElement*>::const_iterator end = m_clients.end();
92
93 for (; it != end; ++it) {
94 SVGStyledElement* cur = *it;
95
96 if (cur->renderer())
97 cur->renderer()->setNeedsLayout(true);
98
99 cur->invalidateResourcesInAncestorChain();
100 }
101}
102
103void SVGResource::invalidateClients(HashSet<SVGStyledElement*> clients)
104{
105 HashSet<SVGStyledElement*>::const_iterator it = clients.begin();
106 const HashSet<SVGStyledElement*>::const_iterator end = clients.end();
107
108 for (; it != end; ++it) {
109 SVGStyledElement* cur = *it;
110
111 if (cur->renderer())
112 cur->renderer()->setNeedsLayout(true);
113
114 cur->invalidateResourcesInAncestorChain();
115 }
116}
117
118void SVGResource::removeClient(SVGStyledElement* item)
119{
120 HashMap<SVGStyledElement*, ResourceSet*>::iterator resourcePtr = clientMap().find(item);
121 if (resourcePtr == clientMap().end())
122 return;
123
124 ResourceSet* set = resourcePtr->second;
125 ASSERT(set);
126
127 clientMap().remove(resourcePtr);
128
129 for (int i = 0; i < _ResourceTypeCount; i++)
130 if (set->resources[i])
131 set->resources[i]->m_clients.remove(item);
132
133 delete set;
134}
135
136void SVGResource::addClient(SVGStyledElement* item)
137{
138 if (m_clients.contains(item))
139 return;
140
141 m_clients.add(item);
142
143 ResourceSet* target = clientMap().get(item);
144 if (!target)
145 target = new ResourceSet;
146
147 SVGResourceType type = resourceType();
148 if (SVGResource* oldResource = target->resources[type])
149 oldResource->m_clients.remove(item);
150
151 target->resources[type] = this;
152 clientMap().set(item, target);
153}
154
155/*TextStream& SVGResource::externalRepresentation(TextStream& ts) const
156{
157 return ts;
158}*/
159
160SVGResource* getResourceById(Document* document, const AtomicString& id)
161{
162 if (id.isEmpty())
163 return 0;
164
165 Element* element = document->getElementById(id);
166 SVGElement* svgElement = 0;
167 if (element && element->isSVGElement())
168 svgElement = static_cast<SVGElement*>(element);
169
170 if (svgElement && svgElement->isStyled())
171 return static_cast<SVGStyledElement*>(svgElement)->canvasResource();
172
173 return 0;
174}
175
176/*TextStream& operator<<(TextStream& ts, const SVGResource& r)
177{
178 return r.externalRepresentation(ts);
179}*/
180
181}
182
183#endif
SVGElement.h
SVGResource.h
SVGStyledElement.h
end
const KShortcut & end()
WebCore
Definition: CSSHelper.h:7
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KHTML

Skip menu "KHTML"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal