diff options
Diffstat (limited to 'WebCore/rendering/RenderSVGResource.h')
-rw-r--r-- | WebCore/rendering/RenderSVGResource.h | 71 |
1 files changed, 56 insertions, 15 deletions
diff --git a/WebCore/rendering/RenderSVGResource.h b/WebCore/rendering/RenderSVGResource.h index 38c6c09..1665404 100644 --- a/WebCore/rendering/RenderSVGResource.h +++ b/WebCore/rendering/RenderSVGResource.h @@ -28,12 +28,58 @@ namespace WebCore { enum RenderSVGResourceType { - MaskerResourceType + MaskerResourceType, + MarkerResourceType, + FilterResourceType, + ClipperResourceType }; class RenderSVGResource : public RenderSVGHiddenContainer { public: - RenderSVGResource(SVGStyledElement* node) : RenderSVGHiddenContainer(node) { } + RenderSVGResource(SVGStyledElement* node) + : RenderSVGHiddenContainer(node) + , m_id(node->getIDAttribute()) + { + ASSERT(node->document()); + node->document()->accessSVGExtensions()->addResource(m_id, this); + } + + virtual ~RenderSVGResource() + { + ASSERT(node()); + ASSERT(node()->document()); + node()->document()->accessSVGExtensions()->removeResource(m_id); + } + + void idChanged() + { + ASSERT(node()); + ASSERT(node()->document()); + SVGDocumentExtensions* extensions = node()->document()->accessSVGExtensions(); + + // Remove old id, that is guaranteed to be present in cache + extensions->removeResource(m_id); + + m_id = static_cast<Element*>(node())->getIDAttribute(); + + // It's possible that an element is referencing us with the new id, and has to be notified that we're existing now + if (extensions->isPendingResource(m_id)) { + OwnPtr<HashSet<SVGStyledElement*> > clients(extensions->removePendingResource(m_id)); + if (clients->isEmpty()) + return; + + HashSet<SVGStyledElement*>::const_iterator it = clients->begin(); + const HashSet<SVGStyledElement*>::const_iterator end = clients->end(); + + for (; it != end; ++it) { + if (RenderObject* renderer = (*it)->renderer()) + renderer->setNeedsLayout(true); + } + } + + // Recache us with the new id + extensions->addResource(m_id, this); + } template<class Renderer> Renderer* cast() @@ -51,10 +97,14 @@ public: virtual void invalidateClients() = 0; virtual void invalidateClient(RenderObject*) = 0; - virtual bool applyResource(RenderObject*, GraphicsContext*) = 0; + virtual bool applyResource(RenderObject*, GraphicsContext*&) = 0; + virtual void postApplyResource(RenderObject*, GraphicsContext*&) { } virtual FloatRect resourceBoundingBox(const FloatRect&) const = 0; virtual RenderSVGResourceType resourceType() const = 0; + +private: + AtomicString m_id; }; template<typename Renderer> @@ -63,19 +113,10 @@ Renderer* getRenderSVGResourceById(Document* document, const AtomicString& id) if (id.isEmpty()) return 0; - Element* element = document->getElementById(id); - if (!element || !element->isSVGElement()) - return 0; - - RenderObject* renderer = element->renderer(); - if (!renderer) - return 0; - - RenderSVGResource* renderResource = renderer->toRenderSVGResource(); - if (!renderResource) - return 0; + if (RenderSVGResource* renderResource = document->accessSVGExtensions()->resourceById(id)) + return renderResource->cast<Renderer>(); - return renderResource->cast<Renderer>(); + return 0; } } |