OLD | NEW |
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 14 matching lines...) Expand all Loading... |
25 #include "core/rendering/RenderLayer.h" | 25 #include "core/rendering/RenderLayer.h" |
26 #include "core/rendering/RenderView.h" | 26 #include "core/rendering/RenderView.h" |
27 #include "core/rendering/svg/SVGRenderingContext.h" | 27 #include "core/rendering/svg/SVGRenderingContext.h" |
28 #include "core/rendering/svg/SVGResourcesCache.h" | 28 #include "core/rendering/svg/SVGResourcesCache.h" |
29 #include "core/svg/SVGGraphicsElement.h" | 29 #include "core/svg/SVGGraphicsElement.h" |
30 | 30 |
31 #include "wtf/TemporaryChange.h" | 31 #include "wtf/TemporaryChange.h" |
32 | 32 |
33 namespace WebCore { | 33 namespace WebCore { |
34 | 34 |
35 static inline SVGDocumentExtensions* svgExtensionsFromElement(SVGElement* elemen
t) | 35 static inline SVGDocumentExtensions& svgExtensionsFromElement(SVGElement* elemen
t) |
36 { | 36 { |
37 ASSERT(element); | 37 ASSERT(element); |
38 return element->document().accessSVGExtensions(); | 38 return element->document().accessSVGExtensions(); |
39 } | 39 } |
40 | 40 |
41 RenderSVGResourceContainer::RenderSVGResourceContainer(SVGElement* node) | 41 RenderSVGResourceContainer::RenderSVGResourceContainer(SVGElement* node) |
42 : RenderSVGHiddenContainer(node) | 42 : RenderSVGHiddenContainer(node) |
43 , m_isInLayout(false) | 43 , m_isInLayout(false) |
44 , m_id(node->getIdAttribute()) | 44 , m_id(node->getIdAttribute()) |
45 , m_invalidationMask(0) | 45 , m_invalidationMask(0) |
46 , m_registered(false) | 46 , m_registered(false) |
47 , m_isInvalidating(false) | 47 , m_isInvalidating(false) |
48 { | 48 { |
49 } | 49 } |
50 | 50 |
51 RenderSVGResourceContainer::~RenderSVGResourceContainer() | 51 RenderSVGResourceContainer::~RenderSVGResourceContainer() |
52 { | 52 { |
53 if (m_registered) | 53 if (m_registered) |
54 svgExtensionsFromElement(element())->removeResource(m_id); | 54 svgExtensionsFromElement(element()).removeResource(m_id); |
55 } | 55 } |
56 | 56 |
57 void RenderSVGResourceContainer::layout() | 57 void RenderSVGResourceContainer::layout() |
58 { | 58 { |
59 // FIXME: Investigate a way to detect and break resource layout dependency c
ycles early. | 59 // FIXME: Investigate a way to detect and break resource layout dependency c
ycles early. |
60 // Then we can remove this method altogether, and fall back onto RenderSVGHi
ddenContainer::layout(). | 60 // Then we can remove this method altogether, and fall back onto RenderSVGHi
ddenContainer::layout(). |
61 ASSERT(needsLayout()); | 61 ASSERT(needsLayout()); |
62 if (m_isInLayout) | 62 if (m_isInLayout) |
63 return; | 63 return; |
64 | 64 |
(...skipping 20 matching lines...) Expand all Loading... |
85 registerResource(); | 85 registerResource(); |
86 } | 86 } |
87 } | 87 } |
88 | 88 |
89 void RenderSVGResourceContainer::idChanged() | 89 void RenderSVGResourceContainer::idChanged() |
90 { | 90 { |
91 // Invalidate all our current clients. | 91 // Invalidate all our current clients. |
92 removeAllClientsFromCache(); | 92 removeAllClientsFromCache(); |
93 | 93 |
94 // Remove old id, that is guaranteed to be present in cache. | 94 // Remove old id, that is guaranteed to be present in cache. |
95 SVGDocumentExtensions* extensions = svgExtensionsFromElement(element()); | 95 SVGDocumentExtensions& extensions = svgExtensionsFromElement(element()); |
96 extensions->removeResource(m_id); | 96 extensions.removeResource(m_id); |
97 m_id = element()->getIdAttribute(); | 97 m_id = element()->getIdAttribute(); |
98 | 98 |
99 registerResource(); | 99 registerResource(); |
100 } | 100 } |
101 | 101 |
102 void RenderSVGResourceContainer::markAllClientsForInvalidation(InvalidationMode
mode) | 102 void RenderSVGResourceContainer::markAllClientsForInvalidation(InvalidationMode
mode) |
103 { | 103 { |
104 if ((m_clients.isEmpty() && m_clientLayers.isEmpty()) || m_isInvalidating) | 104 if ((m_clients.isEmpty() && m_clientLayers.isEmpty()) || m_isInvalidating) |
105 return; | 105 return; |
106 | 106 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 return; | 203 return; |
204 | 204 |
205 setNeedsLayout(MarkContainingBlockChain, layoutScope); | 205 setNeedsLayout(MarkContainingBlockChain, layoutScope); |
206 | 206 |
207 if (everHadLayout()) | 207 if (everHadLayout()) |
208 removeAllClientsFromCache(); | 208 removeAllClientsFromCache(); |
209 } | 209 } |
210 | 210 |
211 void RenderSVGResourceContainer::registerResource() | 211 void RenderSVGResourceContainer::registerResource() |
212 { | 212 { |
213 SVGDocumentExtensions* extensions = svgExtensionsFromElement(element()); | 213 SVGDocumentExtensions& extensions = svgExtensionsFromElement(element()); |
214 if (!extensions->hasPendingResource(m_id)) { | 214 if (!extensions.hasPendingResource(m_id)) { |
215 extensions->addResource(m_id, this); | 215 extensions.addResource(m_id, this); |
216 return; | 216 return; |
217 } | 217 } |
218 | 218 |
219 OwnPtr<SVGDocumentExtensions::SVGPendingElements> clients(extensions->remove
PendingResource(m_id)); | 219 OwnPtr<SVGDocumentExtensions::SVGPendingElements> clients(extensions.removeP
endingResource(m_id)); |
220 | 220 |
221 // Cache us with the new id. | 221 // Cache us with the new id. |
222 extensions->addResource(m_id, this); | 222 extensions.addResource(m_id, this); |
223 | 223 |
224 // Update cached resources of pending clients. | 224 // Update cached resources of pending clients. |
225 const SVGDocumentExtensions::SVGPendingElements::const_iterator end = client
s->end(); | 225 const SVGDocumentExtensions::SVGPendingElements::const_iterator end = client
s->end(); |
226 for (SVGDocumentExtensions::SVGPendingElements::const_iterator it = clients-
>begin(); it != end; ++it) { | 226 for (SVGDocumentExtensions::SVGPendingElements::const_iterator it = clients-
>begin(); it != end; ++it) { |
227 ASSERT((*it)->hasPendingResources()); | 227 ASSERT((*it)->hasPendingResources()); |
228 extensions->clearHasPendingResourcesIfPossible(*it); | 228 extensions.clearHasPendingResourcesIfPossible(*it); |
229 RenderObject* renderer = (*it)->renderer(); | 229 RenderObject* renderer = (*it)->renderer(); |
230 if (!renderer) | 230 if (!renderer) |
231 continue; | 231 continue; |
232 SVGResourcesCache::clientStyleChanged(renderer, StyleDifferenceLayout, r
enderer->style()); | 232 SVGResourcesCache::clientStyleChanged(renderer, StyleDifferenceLayout, r
enderer->style()); |
233 renderer->setNeedsLayout(); | 233 renderer->setNeedsLayout(); |
234 } | 234 } |
235 } | 235 } |
236 | 236 |
237 bool RenderSVGResourceContainer::shouldTransformOnTextPainting(RenderObject* obj
ect, AffineTransform& resourceTransform) | 237 bool RenderSVGResourceContainer::shouldTransformOnTextPainting(RenderObject* obj
ect, AffineTransform& resourceTransform) |
238 { | 238 { |
(...skipping 18 matching lines...) Expand all Loading... |
257 if (!object->isSVGShape()) | 257 if (!object->isSVGShape()) |
258 return resourceTransform; | 258 return resourceTransform; |
259 | 259 |
260 SVGGraphicsElement* element = toSVGGraphicsElement(object->node()); | 260 SVGGraphicsElement* element = toSVGGraphicsElement(object->node()); |
261 AffineTransform transform = element->getScreenCTM(SVGGraphicsElement::Disall
owStyleUpdate); | 261 AffineTransform transform = element->getScreenCTM(SVGGraphicsElement::Disall
owStyleUpdate); |
262 transform *= resourceTransform; | 262 transform *= resourceTransform; |
263 return transform; | 263 return transform; |
264 } | 264 } |
265 | 265 |
266 } | 266 } |
OLD | NEW |