Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: Source/core/rendering/svg/SVGResourcesCache.cpp

Issue 899163003: Move rendering/RenderObject to layout/LayoutObject. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 2 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
3 * 3 *
4 * This library is free software; you can redistribute it and/or 4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public 5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either 6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version. 7 * version 2 of the License, or (at your option) any later version.
8 * 8 *
9 * This library is distributed in the hope that it will be useful, 9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 18 matching lines...) Expand all
29 namespace blink { 29 namespace blink {
30 30
31 SVGResourcesCache::SVGResourcesCache() 31 SVGResourcesCache::SVGResourcesCache()
32 { 32 {
33 } 33 }
34 34
35 SVGResourcesCache::~SVGResourcesCache() 35 SVGResourcesCache::~SVGResourcesCache()
36 { 36 {
37 } 37 }
38 38
39 void SVGResourcesCache::addResourcesFromRenderObject(RenderObject* object, const RenderStyle* style) 39 void SVGResourcesCache::addResourcesFromLayoutObject(LayoutObject* object, const RenderStyle* style)
40 { 40 {
41 ASSERT(object); 41 ASSERT(object);
42 ASSERT(style); 42 ASSERT(style);
43 ASSERT(!m_cache.contains(object)); 43 ASSERT(!m_cache.contains(object));
44 44
45 const SVGRenderStyle& svgStyle = style->svgStyle(); 45 const SVGRenderStyle& svgStyle = style->svgStyle();
46 46
47 // Build a list of all resources associated with the passed RenderObject 47 // Build a list of all resources associated with the passed LayoutObject
48 OwnPtr<SVGResources> newResources = SVGResources::buildResources(object, svg Style); 48 OwnPtr<SVGResources> newResources = SVGResources::buildResources(object, svg Style);
49 if (!newResources) 49 if (!newResources)
50 return; 50 return;
51 51
52 // Put object in cache. 52 // Put object in cache.
53 SVGResources* resources = m_cache.set(object, newResources.release()).stored Value->value.get(); 53 SVGResources* resources = m_cache.set(object, newResources.release()).stored Value->value.get();
54 54
55 // Run cycle-detection _afterwards_, so self-references can be caught as wel l. 55 // Run cycle-detection _afterwards_, so self-references can be caught as wel l.
56 SVGResourcesCycleSolver solver(object, resources); 56 SVGResourcesCycleSolver solver(object, resources);
57 solver.resolveCycles(); 57 solver.resolveCycles();
58 58
59 // Walk resources and register the render object at each resources. 59 // Walk resources and register the render object at each resources.
60 HashSet<RenderSVGResourceContainer*> resourceSet; 60 HashSet<RenderSVGResourceContainer*> resourceSet;
61 resources->buildSetOfResources(resourceSet); 61 resources->buildSetOfResources(resourceSet);
62 62
63 for (auto* resourceContainer : resourceSet) 63 for (auto* resourceContainer : resourceSet)
64 resourceContainer->addClient(object); 64 resourceContainer->addClient(object);
65 } 65 }
66 66
67 void SVGResourcesCache::removeResourcesFromRenderObject(RenderObject* object) 67 void SVGResourcesCache::removeResourcesFromLayoutObject(LayoutObject* object)
68 { 68 {
69 OwnPtr<SVGResources> resources = m_cache.take(object); 69 OwnPtr<SVGResources> resources = m_cache.take(object);
70 if (!resources) 70 if (!resources)
71 return; 71 return;
72 72
73 // Walk resources and register the render object at each resources. 73 // Walk resources and register the render object at each resources.
74 HashSet<RenderSVGResourceContainer*> resourceSet; 74 HashSet<RenderSVGResourceContainer*> resourceSet;
75 resources->buildSetOfResources(resourceSet); 75 resources->buildSetOfResources(resourceSet);
76 76
77 for (auto* resourceContainer : resourceSet) 77 for (auto* resourceContainer : resourceSet)
78 resourceContainer->removeClient(object); 78 resourceContainer->removeClient(object);
79 } 79 }
80 80
81 static inline SVGResourcesCache* resourcesCacheFromRenderObject(const RenderObje ct* renderer) 81 static inline SVGResourcesCache* resourcesCacheFromLayoutObject(const LayoutObje ct* renderer)
82 { 82 {
83 Document& document = renderer->document(); 83 Document& document = renderer->document();
84 84
85 SVGDocumentExtensions& extensions = document.accessSVGExtensions(); 85 SVGDocumentExtensions& extensions = document.accessSVGExtensions();
86 SVGResourcesCache* cache = extensions.resourcesCache(); 86 SVGResourcesCache* cache = extensions.resourcesCache();
87 ASSERT(cache); 87 ASSERT(cache);
88 88
89 return cache; 89 return cache;
90 } 90 }
91 91
92 SVGResources* SVGResourcesCache::cachedResourcesForRenderObject(const RenderObje ct* renderer) 92 SVGResources* SVGResourcesCache::cachedResourcesForLayoutObject(const LayoutObje ct* renderer)
93 { 93 {
94 ASSERT(renderer); 94 ASSERT(renderer);
95 return resourcesCacheFromRenderObject(renderer)->m_cache.get(renderer); 95 return resourcesCacheFromLayoutObject(renderer)->m_cache.get(renderer);
96 } 96 }
97 97
98 void SVGResourcesCache::clientLayoutChanged(RenderObject* object) 98 void SVGResourcesCache::clientLayoutChanged(LayoutObject* object)
99 { 99 {
100 SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject( object); 100 SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject( object);
101 if (!resources) 101 if (!resources)
102 return; 102 return;
103 103
104 // Invalidate the resources if either the RenderObject itself changed, 104 // Invalidate the resources if either the LayoutObject itself changed,
105 // or we have filter resources, which could depend on the layout of children . 105 // or we have filter resources, which could depend on the layout of children .
106 if (object->selfNeedsLayout() || resources->filter()) 106 if (object->selfNeedsLayout() || resources->filter())
107 resources->removeClientFromCache(object); 107 resources->removeClientFromCache(object);
108 } 108 }
109 109
110 static inline bool rendererCanHaveResources(RenderObject* renderer) 110 static inline bool rendererCanHaveResources(LayoutObject* renderer)
111 { 111 {
112 ASSERT(renderer); 112 ASSERT(renderer);
113 return renderer->node() && renderer->node()->isSVGElement() && !renderer->is SVGInlineText(); 113 return renderer->node() && renderer->node()->isSVGElement() && !renderer->is SVGInlineText();
114 } 114 }
115 115
116 void SVGResourcesCache::clientStyleChanged(RenderObject* renderer, StyleDifferen ce diff, const RenderStyle* newStyle) 116 void SVGResourcesCache::clientStyleChanged(LayoutObject* renderer, StyleDifferen ce diff, const RenderStyle* newStyle)
117 { 117 {
118 ASSERT(renderer); 118 ASSERT(renderer);
119 ASSERT(renderer->node()); 119 ASSERT(renderer->node());
120 ASSERT(renderer->node()->isSVGElement()); 120 ASSERT(renderer->node()->isSVGElement());
121 121
122 if (!diff.hasDifference() || !renderer->parent()) 122 if (!diff.hasDifference() || !renderer->parent())
123 return; 123 return;
124 124
125 // In this case the proper SVGFE*Element will decide whether the modified CS S properties require a relayout or paintInvalidation. 125 // In this case the proper SVGFE*Element will decide whether the modified CS S properties require a relayout or paintInvalidation.
126 if (renderer->isSVGResourceFilterPrimitive() && !diff.needsLayout()) 126 if (renderer->isSVGResourceFilterPrimitive() && !diff.needsLayout())
127 return; 127 return;
128 128
129 // Dynamic changes of CSS properties like 'clip-path' may require us to reco mpute the associated resources for a renderer. 129 // Dynamic changes of CSS properties like 'clip-path' may require us to reco mpute the associated resources for a renderer.
130 // FIXME: Avoid passing in a useless StyleDifference, but instead compare ol dStyle/newStyle to see which resources changed 130 // FIXME: Avoid passing in a useless StyleDifference, but instead compare ol dStyle/newStyle to see which resources changed
131 // to be able to selectively rebuild individual resources, instead of all of them. 131 // to be able to selectively rebuild individual resources, instead of all of them.
132 if (rendererCanHaveResources(renderer)) { 132 if (rendererCanHaveResources(renderer)) {
133 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); 133 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(renderer);
134 cache->removeResourcesFromRenderObject(renderer); 134 cache->removeResourcesFromLayoutObject(renderer);
135 cache->addResourcesFromRenderObject(renderer, newStyle); 135 cache->addResourcesFromLayoutObject(renderer, newStyle);
136 } 136 }
137 137
138 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende rer, false); 138 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende rer, false);
139 } 139 }
140 140
141 void SVGResourcesCache::clientWasAddedToTree(RenderObject* renderer, const Rende rStyle* newStyle) 141 void SVGResourcesCache::clientWasAddedToTree(LayoutObject* renderer, const Rende rStyle* newStyle)
142 { 142 {
143 if (!renderer->node()) 143 if (!renderer->node())
144 return; 144 return;
145 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende rer, false); 145 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende rer, false);
146 146
147 if (!rendererCanHaveResources(renderer)) 147 if (!rendererCanHaveResources(renderer))
148 return; 148 return;
149 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); 149 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(renderer);
150 cache->addResourcesFromRenderObject(renderer, newStyle); 150 cache->addResourcesFromLayoutObject(renderer, newStyle);
151 } 151 }
152 152
153 void SVGResourcesCache::clientWillBeRemovedFromTree(RenderObject* renderer) 153 void SVGResourcesCache::clientWillBeRemovedFromTree(LayoutObject* renderer)
154 { 154 {
155 if (!renderer->node()) 155 if (!renderer->node())
156 return; 156 return;
157 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende rer, false); 157 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende rer, false);
158 158
159 if (!rendererCanHaveResources(renderer)) 159 if (!rendererCanHaveResources(renderer))
160 return; 160 return;
161 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); 161 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(renderer);
162 cache->removeResourcesFromRenderObject(renderer); 162 cache->removeResourcesFromLayoutObject(renderer);
163 } 163 }
164 164
165 void SVGResourcesCache::clientDestroyed(RenderObject* renderer) 165 void SVGResourcesCache::clientDestroyed(LayoutObject* renderer)
166 { 166 {
167 ASSERT(renderer); 167 ASSERT(renderer);
168 168
169 SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject( renderer); 169 SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject( renderer);
170 if (resources) 170 if (resources)
171 resources->removeClientFromCache(renderer); 171 resources->removeClientFromCache(renderer);
172 172
173 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); 173 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(renderer);
174 cache->removeResourcesFromRenderObject(renderer); 174 cache->removeResourcesFromLayoutObject(renderer);
175 } 175 }
176 176
177 void SVGResourcesCache::resourceDestroyed(RenderSVGResourceContainer* resource) 177 void SVGResourcesCache::resourceDestroyed(RenderSVGResourceContainer* resource)
178 { 178 {
179 ASSERT(resource); 179 ASSERT(resource);
180 SVGResourcesCache* cache = resourcesCacheFromRenderObject(resource); 180 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(resource);
181 181
182 // The resource itself may have clients, that need to be notified. 182 // The resource itself may have clients, that need to be notified.
183 cache->removeResourcesFromRenderObject(resource); 183 cache->removeResourcesFromLayoutObject(resource);
184 184
185 for (auto& objectResources : cache->m_cache) { 185 for (auto& objectResources : cache->m_cache) {
186 objectResources.value->resourceDestroyed(resource); 186 objectResources.value->resourceDestroyed(resource);
187 187
188 // Mark users of destroyed resources as pending resolution based on the id of the old resource. 188 // Mark users of destroyed resources as pending resolution based on the id of the old resource.
189 Element* resourceElement = resource->element(); 189 Element* resourceElement = resource->element();
190 Element* clientElement = toElement(objectResources.key->node()); 190 Element* clientElement = toElement(objectResources.key->node());
191 SVGDocumentExtensions& extensions = clientElement->document().accessSVGE xtensions(); 191 SVGDocumentExtensions& extensions = clientElement->document().accessSVGE xtensions();
192 192
193 extensions.addPendingResource(resourceElement->fastGetAttribute(HTMLName s::idAttr), clientElement); 193 extensions.addPendingResource(resourceElement->fastGetAttribute(HTMLName s::idAttr), clientElement);
194 } 194 }
195 } 195 }
196 196
197 } 197 }
OLDNEW
« no previous file with comments | « Source/core/rendering/svg/SVGResourcesCache.h ('k') | Source/core/rendering/svg/SVGResourcesCycleSolver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698