| 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 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 hasPendingResource = true; | 152 hasPendingResource = true; |
| 153 return nullptr; | 153 return nullptr; |
| 154 } | 154 } |
| 155 | 155 |
| 156 if (!container->isSVGPaintServer()) | 156 if (!container->isSVGPaintServer()) |
| 157 return nullptr; | 157 return nullptr; |
| 158 | 158 |
| 159 return toLayoutSVGResourcePaintServer(container); | 159 return toLayoutSVGResourcePaintServer(container); |
| 160 } | 160 } |
| 161 | 161 |
| 162 static inline void registerPendingResource(SVGDocumentExtensions& extensions, | 162 static inline void registerPendingResource( |
| 163 const AtomicString& id, | 163 SVGTreeScopeResources& treeScopeResources, |
| 164 SVGElement* element) { | 164 const AtomicString& id, |
| 165 ASSERT(element); | 165 SVGElement* element) { |
| 166 extensions.addPendingResource(id, element); | 166 DCHECK(element); |
| 167 treeScopeResources.addPendingResource(id, element); |
| 167 } | 168 } |
| 168 | 169 |
| 169 bool SVGResources::hasResourceData() const { | 170 bool SVGResources::hasResourceData() const { |
| 170 return m_clipperFilterMaskerData || m_markerData || m_fillStrokeData || | 171 return m_clipperFilterMaskerData || m_markerData || m_fillStrokeData || |
| 171 m_linkedResource; | 172 m_linkedResource; |
| 172 } | 173 } |
| 173 | 174 |
| 174 static inline SVGResources& ensureResources( | 175 static inline SVGResources& ensureResources( |
| 175 std::unique_ptr<SVGResources>& resources) { | 176 std::unique_ptr<SVGResources>& resources) { |
| 176 if (!resources) | 177 if (!resources) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 187 Node* node = object->node(); | 188 Node* node = object->node(); |
| 188 ASSERT(node); | 189 ASSERT(node); |
| 189 SECURITY_DCHECK(node->isSVGElement()); | 190 SECURITY_DCHECK(node->isSVGElement()); |
| 190 | 191 |
| 191 SVGElement* element = toSVGElement(node); | 192 SVGElement* element = toSVGElement(node); |
| 192 ASSERT(element); | 193 ASSERT(element); |
| 193 | 194 |
| 194 const AtomicString& tagName = element->localName(); | 195 const AtomicString& tagName = element->localName(); |
| 195 ASSERT(!tagName.isNull()); | 196 ASSERT(!tagName.isNull()); |
| 196 | 197 |
| 197 TreeScope& treeScope = element->treeScope(); | 198 TreeScope& treeScope = element->treeScopeForIdResolution(); |
| 198 SVGDocumentExtensions& extensions = element->document().accessSVGExtensions(); | 199 SVGTreeScopeResources& treeScopeResources = |
| 200 treeScope.ensureSVGTreeScopedResources(); |
| 199 | 201 |
| 200 const SVGComputedStyle& style = computedStyle.svgStyle(); | 202 const SVGComputedStyle& style = computedStyle.svgStyle(); |
| 201 | 203 |
| 202 std::unique_ptr<SVGResources> resources; | 204 std::unique_ptr<SVGResources> resources; |
| 203 if (clipperFilterMaskerTags().contains(tagName)) { | 205 if (clipperFilterMaskerTags().contains(tagName)) { |
| 204 if (computedStyle.clipPath() && !object->isSVGRoot()) { | 206 if (computedStyle.clipPath() && !object->isSVGRoot()) { |
| 205 ClipPathOperation* clipPathOperation = computedStyle.clipPath(); | 207 ClipPathOperation* clipPathOperation = computedStyle.clipPath(); |
| 206 if (clipPathOperation->type() == ClipPathOperation::REFERENCE) { | 208 if (clipPathOperation->type() == ClipPathOperation::REFERENCE) { |
| 207 const ReferenceClipPathOperation& clipPathReference = | 209 const ReferenceClipPathOperation& clipPathReference = |
| 208 toReferenceClipPathOperation(*clipPathOperation); | 210 toReferenceClipPathOperation(*clipPathOperation); |
| 209 AtomicString id = SVGURIReference::fragmentIdentifierFromIRIString( | 211 AtomicString id = SVGURIReference::fragmentIdentifierFromIRIString( |
| 210 clipPathReference.url(), treeScope); | 212 clipPathReference.url(), treeScope); |
| 211 if (!ensureResources(resources).setClipper( | 213 if (!ensureResources(resources).setClipper( |
| 212 getLayoutSVGResourceById<LayoutSVGResourceClipper>(treeScope, | 214 getLayoutSVGResourceById<LayoutSVGResourceClipper>(treeScope, |
| 213 id))) | 215 id))) |
| 214 registerPendingResource(extensions, id, element); | 216 registerPendingResource(treeScopeResources, id, element); |
| 215 } | 217 } |
| 216 } | 218 } |
| 217 | 219 |
| 218 if (computedStyle.hasFilter() && !object->isSVGRoot()) { | 220 if (computedStyle.hasFilter() && !object->isSVGRoot()) { |
| 219 const FilterOperations& filterOperations = computedStyle.filter(); | 221 const FilterOperations& filterOperations = computedStyle.filter(); |
| 220 if (filterOperations.size() == 1) { | 222 if (filterOperations.size() == 1) { |
| 221 const FilterOperation& filterOperation = *filterOperations.at(0); | 223 const FilterOperation& filterOperation = *filterOperations.at(0); |
| 222 if (filterOperation.type() == FilterOperation::REFERENCE) { | 224 if (filterOperation.type() == FilterOperation::REFERENCE) { |
| 223 const auto& referenceFilterOperation = | 225 const auto& referenceFilterOperation = |
| 224 toReferenceFilterOperation(filterOperation); | 226 toReferenceFilterOperation(filterOperation); |
| 225 AtomicString id = SVGURIReference::fragmentIdentifierFromIRIString( | 227 AtomicString id = SVGURIReference::fragmentIdentifierFromIRIString( |
| 226 referenceFilterOperation.url(), treeScope); | 228 referenceFilterOperation.url(), treeScope); |
| 227 if (!ensureResources(resources).setFilter( | 229 if (!ensureResources(resources).setFilter( |
| 228 getLayoutSVGResourceById<LayoutSVGResourceFilter>(treeScope, | 230 getLayoutSVGResourceById<LayoutSVGResourceFilter>(treeScope, |
| 229 id))) | 231 id))) |
| 230 registerPendingResource(extensions, id, element); | 232 registerPendingResource(treeScopeResources, id, element); |
| 231 } | 233 } |
| 232 } | 234 } |
| 233 } | 235 } |
| 234 | 236 |
| 235 if (style.hasMasker()) { | 237 if (style.hasMasker()) { |
| 236 AtomicString id = style.maskerResource(); | 238 AtomicString id = style.maskerResource(); |
| 237 if (!ensureResources(resources).setMasker( | 239 if (!ensureResources(resources).setMasker( |
| 238 getLayoutSVGResourceById<LayoutSVGResourceMasker>(treeScope, id))) | 240 getLayoutSVGResourceById<LayoutSVGResourceMasker>(treeScope, id))) |
| 239 registerPendingResource(extensions, id, element); | 241 registerPendingResource(treeScopeResources, id, element); |
| 240 } | 242 } |
| 241 } | 243 } |
| 242 | 244 |
| 243 if (style.hasMarkers() && supportsMarkers(*element)) { | 245 if (style.hasMarkers() && supportsMarkers(*element)) { |
| 244 const AtomicString& markerStartId = style.markerStartResource(); | 246 const AtomicString& markerStartId = style.markerStartResource(); |
| 245 if (!ensureResources(resources).setMarkerStart( | 247 if (!ensureResources(resources).setMarkerStart( |
| 246 getLayoutSVGResourceById<LayoutSVGResourceMarker>(treeScope, | 248 getLayoutSVGResourceById<LayoutSVGResourceMarker>(treeScope, |
| 247 markerStartId))) | 249 markerStartId))) |
| 248 registerPendingResource(extensions, markerStartId, element); | 250 registerPendingResource(treeScopeResources, markerStartId, element); |
| 249 | 251 |
| 250 const AtomicString& markerMidId = style.markerMidResource(); | 252 const AtomicString& markerMidId = style.markerMidResource(); |
| 251 if (!ensureResources(resources).setMarkerMid( | 253 if (!ensureResources(resources).setMarkerMid( |
| 252 getLayoutSVGResourceById<LayoutSVGResourceMarker>(treeScope, | 254 getLayoutSVGResourceById<LayoutSVGResourceMarker>(treeScope, |
| 253 markerMidId))) | 255 markerMidId))) |
| 254 registerPendingResource(extensions, markerMidId, element); | 256 registerPendingResource(treeScopeResources, markerMidId, element); |
| 255 | 257 |
| 256 const AtomicString& markerEndId = style.markerEndResource(); | 258 const AtomicString& markerEndId = style.markerEndResource(); |
| 257 if (!ensureResources(resources).setMarkerEnd( | 259 if (!ensureResources(resources).setMarkerEnd( |
| 258 getLayoutSVGResourceById<LayoutSVGResourceMarker>( | 260 getLayoutSVGResourceById<LayoutSVGResourceMarker>( |
| 259 treeScope, style.markerEndResource()))) | 261 treeScope, style.markerEndResource()))) |
| 260 registerPendingResource(extensions, markerEndId, element); | 262 registerPendingResource(treeScopeResources, markerEndId, element); |
| 261 } | 263 } |
| 262 | 264 |
| 263 if (fillAndStrokeTags().contains(tagName)) { | 265 if (fillAndStrokeTags().contains(tagName)) { |
| 264 if (style.hasFill()) { | 266 if (style.hasFill()) { |
| 265 bool hasPendingResource = false; | 267 bool hasPendingResource = false; |
| 266 AtomicString id; | 268 AtomicString id; |
| 267 LayoutSVGResourcePaintServer* resource = paintingResourceFromSVGPaint( | 269 LayoutSVGResourcePaintServer* resource = paintingResourceFromSVGPaint( |
| 268 treeScope, style.fillPaintType(), style.fillPaintUri(), id, | 270 treeScope, style.fillPaintType(), style.fillPaintUri(), id, |
| 269 hasPendingResource); | 271 hasPendingResource); |
| 270 if (!ensureResources(resources).setFill(resource) && hasPendingResource) | 272 if (!ensureResources(resources).setFill(resource) && hasPendingResource) |
| 271 registerPendingResource(extensions, id, element); | 273 registerPendingResource(treeScopeResources, id, element); |
| 272 } | 274 } |
| 273 | 275 |
| 274 if (style.hasStroke()) { | 276 if (style.hasStroke()) { |
| 275 bool hasPendingResource = false; | 277 bool hasPendingResource = false; |
| 276 AtomicString id; | 278 AtomicString id; |
| 277 LayoutSVGResourcePaintServer* resource = paintingResourceFromSVGPaint( | 279 LayoutSVGResourcePaintServer* resource = paintingResourceFromSVGPaint( |
| 278 treeScope, style.strokePaintType(), style.strokePaintUri(), id, | 280 treeScope, style.strokePaintType(), style.strokePaintUri(), id, |
| 279 hasPendingResource); | 281 hasPendingResource); |
| 280 if (!ensureResources(resources).setStroke(resource) && hasPendingResource) | 282 if (!ensureResources(resources).setStroke(resource) && hasPendingResource) |
| 281 registerPendingResource(extensions, id, element); | 283 registerPendingResource(treeScopeResources, id, element); |
| 282 } | 284 } |
| 283 } | 285 } |
| 284 | 286 |
| 285 if (chainableResourceTags().contains(tagName)) { | 287 if (chainableResourceTags().contains(tagName)) { |
| 286 AtomicString id = targetReferenceFromResource(*element); | 288 AtomicString id = targetReferenceFromResource(*element); |
| 287 if (!ensureResources(resources).setLinkedResource( | 289 if (!ensureResources(resources).setLinkedResource( |
| 288 getLayoutSVGResourceContainerById(treeScope, id))) | 290 getLayoutSVGResourceContainerById(treeScope, id))) |
| 289 registerPendingResource(extensions, id, element); | 291 registerPendingResource(treeScopeResources, id, element); |
| 290 } | 292 } |
| 291 | 293 |
| 292 return (!resources || !resources->hasResourceData()) ? nullptr | 294 return (!resources || !resources->hasResourceData()) ? nullptr |
| 293 : std::move(resources); | 295 : std::move(resources); |
| 294 } | 296 } |
| 295 | 297 |
| 296 void SVGResources::layoutIfNeeded() { | 298 void SVGResources::layoutIfNeeded() { |
| 297 if (m_clipperFilterMaskerData) { | 299 if (m_clipperFilterMaskerData) { |
| 298 if (LayoutSVGResourceClipper* clipper = m_clipperFilterMaskerData->clipper) | 300 if (LayoutSVGResourceClipper* clipper = m_clipperFilterMaskerData->clipper) |
| 299 clipper->layoutIfNeeded(); | 301 clipper->layoutIfNeeded(); |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 676 stroke->element()); | 678 stroke->element()); |
| 677 } | 679 } |
| 678 | 680 |
| 679 if (m_linkedResource) | 681 if (m_linkedResource) |
| 680 fprintf(stderr, " |-> xlink:href : %p (node=%p)\n", m_linkedResource, | 682 fprintf(stderr, " |-> xlink:href : %p (node=%p)\n", m_linkedResource, |
| 681 m_linkedResource->element()); | 683 m_linkedResource->element()); |
| 682 } | 684 } |
| 683 #endif | 685 #endif |
| 684 | 686 |
| 685 } // namespace blink | 687 } // namespace blink |
| OLD | NEW |