From 6882a04fb36642862b11efe514251d32070c3d65 Mon Sep 17 00:00:00 2001 From: Konstantin Tokarev Date: Thu, 25 Aug 2016 19:20:41 +0300 Subject: Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443) Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f Reviewed-by: Konstantin Tokarev --- .../rendering/svg/RenderSVGResourceContainer.cpp | 104 +++++++++------------ 1 file changed, 46 insertions(+), 58 deletions(-) (limited to 'Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp') diff --git a/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp b/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp index 38bd67a63..5e5200818 100644 --- a/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp @@ -18,30 +18,25 @@ */ #include "config.h" - -#if ENABLE(SVG) #include "RenderSVGResourceContainer.h" #include "RenderLayer.h" #include "RenderSVGRoot.h" #include "RenderView.h" -#include "SVGGraphicsElement.h" #include "SVGRenderingContext.h" #include "SVGResourcesCache.h" #include namespace WebCore { -static inline SVGDocumentExtensions* svgExtensionsFromNode(Node* node) +static inline SVGDocumentExtensions& svgExtensionsFromElement(SVGElement& element) { - ASSERT(node); - ASSERT(node->document()); - return node->document()->accessSVGExtensions(); + return element.document().accessSVGExtensions(); } -RenderSVGResourceContainer::RenderSVGResourceContainer(SVGStyledElement* node) - : RenderSVGHiddenContainer(node) - , m_id(node->getIdAttribute()) +RenderSVGResourceContainer::RenderSVGResourceContainer(SVGElement& element, Ref&& style) + : RenderSVGHiddenContainer(element, WTFMove(style)) + , m_id(element.getIdAttribute()) , m_registered(false) , m_isInvalidating(false) { @@ -50,14 +45,14 @@ RenderSVGResourceContainer::RenderSVGResourceContainer(SVGStyledElement* node) RenderSVGResourceContainer::~RenderSVGResourceContainer() { if (m_registered) - svgExtensionsFromNode(node())->removeResource(m_id); + 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(); @@ -65,7 +60,7 @@ void RenderSVGResourceContainer::layout() void RenderSVGResourceContainer::willBeDestroyed() { - SVGResourcesCache::resourceDestroyed(this); + SVGResourcesCache::resourceDestroyed(*this); RenderSVGHiddenContainer::willBeDestroyed(); } @@ -85,9 +80,8 @@ void RenderSVGResourceContainer::idChanged() removeAllClientsFromCache(); // Remove old id, that is guaranteed to be present in cache. - SVGDocumentExtensions* extensions = svgExtensionsFromNode(node()); - extensions->removeResource(m_id); - m_id = toElement(node())->getIdAttribute(); + svgExtensionsFromElement(element()).removeResource(m_id); + m_id = element().getIdAttribute(); registerResource(); } @@ -100,19 +94,22 @@ 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) { + // We should not mark any client outside the current root for invalidation + if (root != SVGRenderSupport::findTreeRootObject(*client)) + continue; - HashSet::iterator end = m_clients.end(); - for (HashSet::iterator it = m_clients.begin(); it != end; ++it) { - RenderObject* client = *it; - if (client->isSVGResourceContainer()) { - client->toRenderSVGResourceContainer()->removeAllClientsFromCache(markForInvalidation); + if (is(*client)) { + downcast(*client).removeAllClientsFromCache(markForInvalidation); continue; } if (markForInvalidation) - markClientForInvalidation(client, mode); + markClientForInvalidation(*client, mode); - RenderSVGResource::markForLayoutAndParentResourceInvalidation(client, needsLayout); + RenderSVGResource::markForLayoutAndParentResourceInvalidation(*client, needsLayout); } markAllClientLayersForInvalidation(); @@ -122,43 +119,37 @@ void RenderSVGResourceContainer::markAllClientsForInvalidation(InvalidationMode void RenderSVGResourceContainer::markAllClientLayersForInvalidation() { -#if ENABLE(CSS_FILTERS) - HashSet::iterator layerEnd = m_clientLayers.end(); - for (HashSet::iterator it = m_clientLayers.begin(); it != layerEnd; ++it) - (*it)->filterNeedsRepaint(); -#endif + for (auto* clientLayer : m_clientLayers) + clientLayer->filterNeedsRepaint(); } -void RenderSVGResourceContainer::markClientForInvalidation(RenderObject* client, InvalidationMode mode) +void RenderSVGResourceContainer::markClientForInvalidation(RenderObject& client, InvalidationMode mode) { - ASSERT(client); ASSERT(!m_clients.isEmpty()); switch (mode) { case LayoutAndBoundariesInvalidation: case BoundariesInvalidation: - client->setNeedsBoundariesUpdate(); + client.setNeedsBoundariesUpdate(); break; case RepaintInvalidation: - if (client->view()) - client->repaint(); + if (!client.documentBeingDestroyed()) + client.repaint(); break; case ParentOnlyInvalidation: break; } } -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); + m_clients.remove(&client); } void RenderSVGResourceContainer::addClientRenderLayer(RenderLayer* client) @@ -175,44 +166,43 @@ void RenderSVGResourceContainer::removeClientRenderLayer(RenderLayer* client) void RenderSVGResourceContainer::registerResource() { - SVGDocumentExtensions* extensions = svgExtensionsFromNode(node()); - if (!extensions->hasPendingResource(m_id)) { - extensions->addResource(m_id, this); + SVGDocumentExtensions& extensions = svgExtensionsFromElement(element()); + if (!extensions.isIdOfPendingResource(m_id)) { + extensions.addResource(m_id, this); return; } - OwnPtr clients(extensions->removePendingResource(m_id)); + std::unique_ptr clients = extensions.removePendingResource(m_id); // Cache us with the new id. - extensions->addResource(m_id, this); + extensions.addResource(m_id, this); // Update cached resources of pending clients. - const SVGDocumentExtensions::SVGPendingElements::const_iterator end = clients->end(); - for (SVGDocumentExtensions::SVGPendingElements::const_iterator it = clients->begin(); it != end; ++it) { - ASSERT((*it)->hasPendingResources()); - extensions->clearHasPendingResourcesIfPossible(*it); - RenderObject* 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()); - renderer->setNeedsLayout(true); + SVGResourcesCache::clientStyleChanged(*renderer, StyleDifferenceLayout, renderer->style()); + renderer->setNeedsLayout(); } } -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); @@ -226,12 +216,10 @@ AffineTransform RenderSVGResourceContainer::transformOnNonScalingStroke(RenderOb if (!object->isSVGShape()) return resourceTransform; - SVGGraphicsElement* element = toSVGGraphicsElement(object->node()); + SVGGraphicsElement* element = downcast(object->node()); AffineTransform transform = element->getScreenCTM(SVGLocatable::DisallowStyleUpdate); transform *= resourceTransform; return transform; } } - -#endif -- cgit v1.2.1