summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp')
-rw-r--r--Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp104
1 files changed, 46 insertions, 58 deletions
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 <wtf/StackStats.h>
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<RenderStyle>&& 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<RenderObject*>::iterator end = m_clients.end();
- for (HashSet<RenderObject*>::iterator it = m_clients.begin(); it != end; ++it) {
- RenderObject* client = *it;
- if (client->isSVGResourceContainer()) {
- client->toRenderSVGResourceContainer()->removeAllClientsFromCache(markForInvalidation);
+ if (is<RenderSVGResourceContainer>(*client)) {
+ downcast<RenderSVGResourceContainer>(*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<RenderLayer*>::iterator layerEnd = m_clientLayers.end();
- for (HashSet<RenderLayer*>::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<SVGDocumentExtensions::SVGPendingElements> clients(extensions->removePendingResource(m_id));
+ std::unique_ptr<SVGDocumentExtensions::PendingElements> 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<SVGGraphicsElement>(object->node());
AffineTransform transform = element->getScreenCTM(SVGLocatable::DisallowStyleUpdate);
transform *= resourceTransform;
return transform;
}
}
-
-#endif