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 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 hasPendingResource = true; | 176 hasPendingResource = true; |
177 return nullptr; | 177 return nullptr; |
178 } | 178 } |
179 | 179 |
180 if (!container->isSVGPaintServer()) | 180 if (!container->isSVGPaintServer()) |
181 return nullptr; | 181 return nullptr; |
182 | 182 |
183 return toLayoutSVGResourcePaintServer(container); | 183 return toLayoutSVGResourcePaintServer(container); |
184 } | 184 } |
185 | 185 |
186 static inline void registerPendingResource(SVGDocumentExtensions& extensions, co
nst AtomicString& id, SVGElement* element) | 186 static inline void registerPendingResource(SVGTreeScopeResources& treeScopeResou
rces, const AtomicString& id, SVGElement* element) |
187 { | 187 { |
188 ASSERT(element); | 188 ASSERT(element); |
189 extensions.addPendingResource(id, element); | 189 treeScopeResources.addPendingResource(id, element); |
190 } | 190 } |
191 | 191 |
192 bool SVGResources::hasResourceData() const | 192 bool SVGResources::hasResourceData() const |
193 { | 193 { |
194 return m_clipperFilterMaskerData | 194 return m_clipperFilterMaskerData |
195 || m_markerData | 195 || m_markerData |
196 || m_fillStrokeData | 196 || m_fillStrokeData |
197 || m_linkedResource; | 197 || m_linkedResource; |
198 } | 198 } |
199 | 199 |
(...skipping 13 matching lines...) Expand all Loading... |
213 ASSERT(node); | 213 ASSERT(node); |
214 ASSERT_WITH_SECURITY_IMPLICATION(node->isSVGElement()); | 214 ASSERT_WITH_SECURITY_IMPLICATION(node->isSVGElement()); |
215 | 215 |
216 SVGElement* element = toSVGElement(node); | 216 SVGElement* element = toSVGElement(node); |
217 ASSERT(element); | 217 ASSERT(element); |
218 | 218 |
219 const AtomicString& tagName = element->localName(); | 219 const AtomicString& tagName = element->localName(); |
220 ASSERT(!tagName.isNull()); | 220 ASSERT(!tagName.isNull()); |
221 | 221 |
222 TreeScope& treeScope = element->treeScope(); | 222 TreeScope& treeScope = element->treeScope(); |
223 SVGDocumentExtensions& extensions = element->document().accessSVGExtensions(
); | 223 SVGTreeScopeResources& treeScopeResources = element->treeScope().accessSVGTr
eeScopedResources(); |
224 | |
225 const SVGComputedStyle& style = computedStyle.svgStyle(); | 224 const SVGComputedStyle& style = computedStyle.svgStyle(); |
226 | 225 |
227 std::unique_ptr<SVGResources> resources; | 226 std::unique_ptr<SVGResources> resources; |
228 if (clipperFilterMaskerTags().contains(tagName)) { | 227 if (clipperFilterMaskerTags().contains(tagName)) { |
229 if (style.hasClipper()) { | 228 if (style.hasClipper()) { |
230 AtomicString id = style.clipperResource(); | 229 AtomicString id = style.clipperResource(); |
231 if (!ensureResources(resources).setClipper(getLayoutSVGResourceById<
LayoutSVGResourceClipper>(treeScope, id))) | 230 if (!ensureResources(resources).setClipper(getLayoutSVGResourceById<
LayoutSVGResourceClipper>(treeScope, id))) |
232 registerPendingResource(extensions, id, element); | 231 registerPendingResource(treeScopeResources, id, element); |
233 } | 232 } |
234 | 233 |
235 if (computedStyle.hasFilter() && !object->isSVGRoot()) { | 234 if (computedStyle.hasFilter() && !object->isSVGRoot()) { |
236 const FilterOperations& filterOperations = computedStyle.filter(); | 235 const FilterOperations& filterOperations = computedStyle.filter(); |
237 if (filterOperations.size() == 1) { | 236 if (filterOperations.size() == 1) { |
238 const FilterOperation& filterOperation = *filterOperations.at(0)
; | 237 const FilterOperation& filterOperation = *filterOperations.at(0)
; |
239 if (filterOperation.type() == FilterOperation::REFERENCE) { | 238 if (filterOperation.type() == FilterOperation::REFERENCE) { |
240 const auto& referenceFilterOperation = toReferenceFilterOper
ation(filterOperation); | 239 const auto& referenceFilterOperation = toReferenceFilterOper
ation(filterOperation); |
241 AtomicString id = SVGURIReference::fragmentIdentifierFromIRI
String(referenceFilterOperation.url(), treeScope); | 240 AtomicString id = SVGURIReference::fragmentIdentifierFromIRI
String(referenceFilterOperation.url(), treeScope); |
242 if (!ensureResources(resources).setFilter(getLayoutSVGResour
ceById<LayoutSVGResourceFilter>(treeScope, id))) | 241 if (!ensureResources(resources).setFilter(getLayoutSVGResour
ceById<LayoutSVGResourceFilter>(treeScope, id))) |
243 registerPendingResource(extensions, id, element); | 242 registerPendingResource(treeScopeResources, id, element)
; |
244 } | 243 } |
245 } | 244 } |
246 } | 245 } |
247 | 246 |
248 if (style.hasMasker()) { | 247 if (style.hasMasker()) { |
249 AtomicString id = style.maskerResource(); | 248 AtomicString id = style.maskerResource(); |
250 if (!ensureResources(resources).setMasker(getLayoutSVGResourceById<L
ayoutSVGResourceMasker>(treeScope, id))) | 249 if (!ensureResources(resources).setMasker(getLayoutSVGResourceById<L
ayoutSVGResourceMasker>(treeScope, id))) |
251 registerPendingResource(extensions, id, element); | 250 registerPendingResource(treeScopeResources, id, element); |
252 } | 251 } |
253 } | 252 } |
254 | 253 |
255 if (style.hasMarkers() && supportsMarkers(*element)) { | 254 if (style.hasMarkers() && supportsMarkers(*element)) { |
256 const AtomicString& markerStartId = style.markerStartResource(); | 255 const AtomicString& markerStartId = style.markerStartResource(); |
257 if (!ensureResources(resources).setMarkerStart(getLayoutSVGResourceById<
LayoutSVGResourceMarker>(treeScope, markerStartId))) | 256 if (!ensureResources(resources).setMarkerStart(getLayoutSVGResourceById<
LayoutSVGResourceMarker>(treeScope, markerStartId))) |
258 registerPendingResource(extensions, markerStartId, element); | 257 registerPendingResource(treeScopeResources, markerStartId, element); |
259 | 258 |
260 const AtomicString& markerMidId = style.markerMidResource(); | 259 const AtomicString& markerMidId = style.markerMidResource(); |
261 if (!ensureResources(resources).setMarkerMid(getLayoutSVGResourceById<La
youtSVGResourceMarker>(treeScope, markerMidId))) | 260 if (!ensureResources(resources).setMarkerMid(getLayoutSVGResourceById<La
youtSVGResourceMarker>(treeScope, markerMidId))) |
262 registerPendingResource(extensions, markerMidId, element); | 261 registerPendingResource(treeScopeResources, markerMidId, element); |
263 | 262 |
264 const AtomicString& markerEndId = style.markerEndResource(); | 263 const AtomicString& markerEndId = style.markerEndResource(); |
265 if (!ensureResources(resources).setMarkerEnd(getLayoutSVGResourceById<La
youtSVGResourceMarker>(treeScope, style.markerEndResource()))) | 264 if (!ensureResources(resources).setMarkerEnd(getLayoutSVGResourceById<La
youtSVGResourceMarker>(treeScope, style.markerEndResource()))) |
266 registerPendingResource(extensions, markerEndId, element); | 265 registerPendingResource(treeScopeResources, markerEndId, element); |
267 } | 266 } |
268 | 267 |
269 if (fillAndStrokeTags().contains(tagName)) { | 268 if (fillAndStrokeTags().contains(tagName)) { |
270 if (style.hasFill()) { | 269 if (style.hasFill()) { |
271 bool hasPendingResource = false; | 270 bool hasPendingResource = false; |
272 AtomicString id; | 271 AtomicString id; |
273 LayoutSVGResourcePaintServer* resource = paintingResourceFromSVGPain
t(treeScope, style.fillPaintType(), style.fillPaintUri(), id, hasPendingResource
); | 272 LayoutSVGResourcePaintServer* resource = paintingResourceFromSVGPain
t(treeScope, style.fillPaintType(), style.fillPaintUri(), id, hasPendingResource
); |
274 if (!ensureResources(resources).setFill(resource) && hasPendingResou
rce) | 273 if (!ensureResources(resources).setFill(resource) && hasPendingResou
rce) |
275 registerPendingResource(extensions, id, element); | 274 registerPendingResource(treeScopeResources, id, element); |
276 } | 275 } |
277 | 276 |
278 if (style.hasStroke()) { | 277 if (style.hasStroke()) { |
279 bool hasPendingResource = false; | 278 bool hasPendingResource = false; |
280 AtomicString id; | 279 AtomicString id; |
281 LayoutSVGResourcePaintServer* resource = paintingResourceFromSVGPain
t(treeScope, style.strokePaintType(), style.strokePaintUri(), id, hasPendingReso
urce); | 280 LayoutSVGResourcePaintServer* resource = paintingResourceFromSVGPain
t(treeScope, style.strokePaintType(), style.strokePaintUri(), id, hasPendingReso
urce); |
282 if (!ensureResources(resources).setStroke(resource) && hasPendingRes
ource) | 281 if (!ensureResources(resources).setStroke(resource) && hasPendingRes
ource) |
283 registerPendingResource(extensions, id, element); | 282 registerPendingResource(treeScopeResources, id, element); |
284 } | 283 } |
285 } | 284 } |
286 | 285 |
287 if (chainableResourceTags().contains(tagName)) { | 286 if (chainableResourceTags().contains(tagName)) { |
288 AtomicString id = targetReferenceFromResource(*element); | 287 AtomicString id = targetReferenceFromResource(*element); |
289 if (!ensureResources(resources).setLinkedResource(getLayoutSVGResourceCo
ntainerById(treeScope, id))) | 288 if (!ensureResources(resources).setLinkedResource(getLayoutSVGResourceCo
ntainerById(treeScope, id))) |
290 registerPendingResource(extensions, id, element); | 289 registerPendingResource(treeScopeResources, id, element); |
291 } | 290 } |
292 | 291 |
293 return (!resources || !resources->hasResourceData()) ? nullptr : std::move(r
esources); | 292 return (!resources || !resources->hasResourceData()) ? nullptr : std::move(r
esources); |
294 } | 293 } |
295 | 294 |
296 void SVGResources::layoutIfNeeded() | 295 void SVGResources::layoutIfNeeded() |
297 { | 296 { |
298 if (m_clipperFilterMaskerData) { | 297 if (m_clipperFilterMaskerData) { |
299 if (LayoutSVGResourceClipper* clipper = m_clipperFilterMaskerData->clipp
er) | 298 if (LayoutSVGResourceClipper* clipper = m_clipperFilterMaskerData->clipp
er) |
300 clipper->layoutIfNeeded(); | 299 clipper->layoutIfNeeded(); |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 if (LayoutSVGResourcePaintServer* stroke = m_fillStrokeData->stroke) | 674 if (LayoutSVGResourcePaintServer* stroke = m_fillStrokeData->stroke) |
676 fprintf(stderr, " |-> Stroke : %p (node=%p)\n", stroke, stroke->
element()); | 675 fprintf(stderr, " |-> Stroke : %p (node=%p)\n", stroke, stroke->
element()); |
677 } | 676 } |
678 | 677 |
679 if (m_linkedResource) | 678 if (m_linkedResource) |
680 fprintf(stderr, " |-> xlink:href : %p (node=%p)\n", m_linkedResource, m_
linkedResource->element()); | 679 fprintf(stderr, " |-> xlink:href : %p (node=%p)\n", m_linkedResource, m_
linkedResource->element()); |
681 } | 680 } |
682 #endif | 681 #endif |
683 | 682 |
684 } // namespace blink | 683 } // namespace blink |
OLD | NEW |