diff options
Diffstat (limited to 'Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp')
-rw-r--r-- | Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp | 69 |
1 files changed, 34 insertions, 35 deletions
diff --git a/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp b/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp index 2d8a73138..3d44c6aaa 100644 --- a/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp @@ -18,8 +18,6 @@ */ #include "config.h" - -#if ENABLE(SVG) #include "RenderSVGResourceContainer.h" #include "RenderLayer.h" @@ -33,12 +31,11 @@ namespace WebCore { static inline SVGDocumentExtensions& svgExtensionsFromElement(SVGElement& element) { - // FIXME: accessSVGExtensions() should return a reference. - return *element.document().accessSVGExtensions(); + return element.document().accessSVGExtensions(); } -RenderSVGResourceContainer::RenderSVGResourceContainer(SVGElement& element, PassRef<RenderStyle> style) - : RenderSVGHiddenContainer(element, std::move(style)) +RenderSVGResourceContainer::RenderSVGResourceContainer(SVGElement& element, RenderStyle&& style) + : RenderSVGHiddenContainer(element, WTFMove(style)) , m_id(element.getIdAttribute()) , m_registered(false) , m_isInvalidating(false) @@ -47,15 +44,13 @@ RenderSVGResourceContainer::RenderSVGResourceContainer(SVGElement& element, Pass RenderSVGResourceContainer::~RenderSVGResourceContainer() { - if (m_registered) - svgExtensionsFromElement(element()).removeResource(m_id); } void RenderSVGResourceContainer::layout() { StackStats::LayoutCheckPoint layoutCheckPoint; // Invalidate all resources if our layout changed. - if (everHadLayout() && selfNeedsLayout()) + if (selfNeedsClientInvalidation()) RenderSVGRoot::addResourceForClientInvalidation(this); RenderSVGHiddenContainer::layout(); @@ -64,6 +59,12 @@ void RenderSVGResourceContainer::layout() void RenderSVGResourceContainer::willBeDestroyed() { SVGResourcesCache::resourceDestroyed(*this); + + if (m_registered) { + svgExtensionsFromElement(element()).removeResource(m_id); + m_registered = false; + } + RenderSVGHiddenContainer::willBeDestroyed(); } @@ -97,10 +98,15 @@ void RenderSVGResourceContainer::markAllClientsForInvalidation(InvalidationMode m_isInvalidating = true; bool needsLayout = mode == LayoutAndBoundariesInvalidation; bool markForInvalidation = mode != ParentOnlyInvalidation; + auto* root = SVGRenderSupport::findTreeRootObject(*this); - for (auto client : m_clients) { - if (client->isSVGResourceContainer()) { - client->toRenderSVGResourceContainer()->removeAllClientsFromCache(markForInvalidation); + for (auto* client : m_clients) { + // We should not mark any client outside the current root for invalidation + if (root != SVGRenderSupport::findTreeRootObject(*client)) + continue; + + if (is<RenderSVGResourceContainer>(*client)) { + downcast<RenderSVGResourceContainer>(*client).removeAllClientsFromCache(markForInvalidation); continue; } @@ -117,10 +123,8 @@ void RenderSVGResourceContainer::markAllClientsForInvalidation(InvalidationMode void RenderSVGResourceContainer::markAllClientLayersForInvalidation() { -#if ENABLE(CSS_FILTERS) - for (auto clientLayer : m_clientLayers) + for (auto* clientLayer : m_clientLayers) clientLayer->filterNeedsRepaint(); -#endif } void RenderSVGResourceContainer::markClientForInvalidation(RenderObject& client, InvalidationMode mode) @@ -133,7 +137,7 @@ void RenderSVGResourceContainer::markClientForInvalidation(RenderObject& client, client.setNeedsBoundariesUpdate(); break; case RepaintInvalidation: - if (!client.documentBeingDestroyed()) + if (!client.renderTreeBeingDestroyed()) client.repaint(); break; case ParentOnlyInvalidation: @@ -141,17 +145,15 @@ void RenderSVGResourceContainer::markClientForInvalidation(RenderObject& client, } } -void RenderSVGResourceContainer::addClient(RenderObject* client) +void RenderSVGResourceContainer::addClient(RenderElement& client) { - ASSERT(client); - m_clients.add(client); + m_clients.add(&client); } -void RenderSVGResourceContainer::removeClient(RenderObject* client) +void RenderSVGResourceContainer::removeClient(RenderElement& client) { - ASSERT(client); - removeClientFromCache(*client, false); - m_clients.remove(client); + removeClientFromCache(client, false); + m_clients.remove(&client); } void RenderSVGResourceContainer::addClientRenderLayer(RenderLayer* client) @@ -180,11 +182,10 @@ void RenderSVGResourceContainer::registerResource() extensions.addResource(m_id, this); // Update cached resources of pending clients. - auto end = clients->end(); - for (auto it = clients->begin(); it != end; ++it) { - ASSERT((*it)->hasPendingResources()); - extensions.clearHasPendingResourcesIfPossible(*it); - auto renderer = (*it)->renderer(); + for (auto* client : *clients) { + ASSERT(client->hasPendingResources()); + extensions.clearHasPendingResourcesIfPossible(client); + auto* renderer = client->renderer(); if (!renderer) continue; SVGResourcesCache::clientStyleChanged(*renderer, StyleDifferenceLayout, renderer->style()); @@ -192,20 +193,20 @@ void RenderSVGResourceContainer::registerResource() } } -bool RenderSVGResourceContainer::shouldTransformOnTextPainting(RenderObject* object, AffineTransform& resourceTransform) +bool RenderSVGResourceContainer::shouldTransformOnTextPainting(const RenderElement& renderer, AffineTransform& resourceTransform) { - ASSERT_UNUSED(object, object); #if USE(CG) + UNUSED_PARAM(renderer); UNUSED_PARAM(resourceTransform); return false; #else // This method should only be called for RenderObjects that deal with text rendering. Cmp. RenderObject.h's is*() methods. - ASSERT(object->isSVGText() || object->isSVGTextPath() || object->isSVGInline()); + ASSERT(renderer.isSVGText() || renderer.isSVGTextPath() || renderer.isSVGInline()); // In text drawing, the scaling part of the graphics context CTM is removed, compare SVGInlineTextBox::paintTextWithShadows. // So, we use that scaling factor here, too, and then push it down to pattern or gradient space // in order to keep the pattern or gradient correctly scaled. - float scalingFactor = SVGRenderingContext::calculateScreenFontSizeScalingFactor(object); + float scalingFactor = SVGRenderingContext::calculateScreenFontSizeScalingFactor(renderer); if (scalingFactor == 1) return false; resourceTransform.scale(scalingFactor); @@ -219,12 +220,10 @@ AffineTransform RenderSVGResourceContainer::transformOnNonScalingStroke(RenderOb if (!object->isSVGShape()) return resourceTransform; - SVGGraphicsElement* element = toSVGGraphicsElement(object->node()); + SVGGraphicsElement* element = downcast<SVGGraphicsElement>(object->node()); AffineTransform transform = element->getScreenCTM(SVGLocatable::DisallowStyleUpdate); transform *= resourceTransform; return transform; } } - -#endif |