summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp')
-rw-r--r--Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp69
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