Commit 4f5a7a09 authored by Fredrik Söderqvist's avatar Fredrik Söderqvist Committed by Commit Bot

Fold LayoutSVGResourceContainer::MarkClientForInvalidation

This allows simplifying callers a bit since most of them pass a constant
set of flags, and we can tailor the code better based on that. For
example there should be no need to call InvalidateClipPathCache() when a
filter is being invalidated, and similarly we shouldn't need to mark for
paint invalidation since we no longer have a paint dependence for the
filter handling.

While at it, wrap up the common sequence for invalidating the filter
cache into a function.

Bug: 1028063
Change-Id: Ieada3250cf7dd096f432b6fd605f584aafbeb268
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2454053Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Cr-Commit-Position: refs/heads/master@{#814663}
parent e45cb0cf
...@@ -173,26 +173,6 @@ void LayoutSVGResourceContainer::MarkAllClientsForInvalidation( ...@@ -173,26 +173,6 @@ void LayoutSVGResourceContainer::MarkAllClientsForInvalidation(
is_invalidating_ = false; is_invalidating_ = false;
} }
void LayoutSVGResourceContainer::MarkClientForInvalidation(
LayoutObject& client,
InvalidationModeMask invalidation_mask) {
if (invalidation_mask & SVGResourceClient::kPaintInvalidation) {
// Since LayoutSVGInlineTexts don't have SVGResources (they use their
// parent's), they will not be notified of changes to paint servers. So
// if the client is one that could have a LayoutSVGInlineText use a
// paint invalidation reason that will force paint invalidation of the
// entire <text>/<tspan>/... subtree.
client.SetSubtreeShouldDoFullPaintInvalidation(
PaintInvalidationReason::kSVGResource);
client.InvalidateClipPathCache();
// Invalidate paint properties to update effects if any.
client.SetNeedsPaintPropertyUpdate();
}
if (invalidation_mask & SVGResourceClient::kBoundariesInvalidation)
client.SetNeedsBoundariesUpdate();
}
void LayoutSVGResourceContainer::InvalidateCacheAndMarkForLayout( void LayoutSVGResourceContainer::InvalidateCacheAndMarkForLayout(
LayoutInvalidationReasonForTracing reason, LayoutInvalidationReasonForTracing reason,
SubtreeLayoutScope* layout_scope) { SubtreeLayoutScope* layout_scope) {
......
...@@ -78,7 +78,6 @@ class LayoutSVGResourceContainer : public LayoutSVGHiddenContainer { ...@@ -78,7 +78,6 @@ class LayoutSVGResourceContainer : public LayoutSVGHiddenContainer {
static void MarkForLayoutAndParentResourceInvalidation( static void MarkForLayoutAndParentResourceInvalidation(
LayoutObject&, LayoutObject&,
bool needs_layout = true); bool needs_layout = true);
static void MarkClientForInvalidation(LayoutObject&, InvalidationModeMask);
void ClearInvalidationMask() { void ClearInvalidationMask() {
NOT_DESTROYED(); NOT_DESTROYED();
......
...@@ -592,12 +592,7 @@ void SVGResources::ClearClipPathFilterMask(SVGElement& element, ...@@ -592,12 +592,7 @@ void SVGResources::ClearClipPathFilterMask(SVGElement& element,
old_reference_clip->RemoveClient(*client); old_reference_clip->RemoveClient(*client);
if (style->HasFilter()) { if (style->HasFilter()) {
style->Filter().RemoveClient(*client); style->Filter().RemoveClient(*client);
if (client->ClearFilterData()) { client->InvalidateFilterData();
LayoutObject* layout_object = element.GetLayoutObject();
LayoutSVGResourceContainer::MarkClientForInvalidation(
*layout_object, SVGResourceClient::kPaintInvalidation);
client->MarkFilterDataDirty();
}
} }
if (StyleSVGResource* masker_resource = style->SvgStyle().MaskerResource()) if (StyleSVGResource* masker_resource = style->SvgStyle().MaskerResource())
masker_resource->RemoveClient(*client); masker_resource->RemoveClient(*client);
...@@ -700,14 +695,23 @@ void SVGElementResourceClient::ResourceContentChanged( ...@@ -700,14 +695,23 @@ void SVGElementResourceClient::ResourceContentChanged(
return; return;
} }
const bool filter_data_invalidated = ClearFilterData(); InvalidateFilterData();
if (filter_data_invalidated)
invalidation_mask |= SVGResourceClient::kPaintInvalidation; if (invalidation_mask & SVGResourceClient::kPaintInvalidation) {
// Since LayoutSVGInlineTexts don't have SVGResources (they use their
// parent's), they will not be notified of changes to paint servers. So
// if the client is one that could have a LayoutSVGInlineText use a
// paint invalidation reason that will force paint invalidation of the
// entire <text>/<tspan>/... subtree.
layout_object->SetSubtreeShouldDoFullPaintInvalidation(
PaintInvalidationReason::kSVGResource);
layout_object->InvalidateClipPathCache();
// Invalidate paint properties to update effects if any.
layout_object->SetNeedsPaintPropertyUpdate();
}
LayoutSVGResourceContainer::MarkClientForInvalidation(*layout_object, if (invalidation_mask & SVGResourceClient::kBoundariesInvalidation)
invalidation_mask); layout_object->SetNeedsBoundariesUpdate();
if (filter_data_invalidated)
MarkFilterDataDirty();
bool needs_layout = bool needs_layout =
invalidation_mask & SVGResourceClient::kLayoutInvalidation; invalidation_mask & SVGResourceClient::kLayoutInvalidation;
...@@ -745,8 +749,7 @@ void SVGElementResourceClient::FilterPrimitiveChanged( ...@@ -745,8 +749,7 @@ void SVGElementResourceClient::FilterPrimitiveChanged(
LayoutObject* layout_object = element_->GetLayoutObject(); LayoutObject* layout_object = element_->GetLayoutObject();
if (!layout_object) if (!layout_object)
return; return;
LayoutSVGResourceContainer::MarkClientForInvalidation( layout_object->SetNeedsPaintPropertyUpdate();
*layout_object, SVGResourceClient::kPaintInvalidation);
MarkFilterDataDirty(); MarkFilterDataDirty();
} }
...@@ -789,6 +792,14 @@ void SVGElementResourceClient::UpdateFilterData( ...@@ -789,6 +792,14 @@ void SVGElementResourceClient::UpdateFilterData(
filter_data_dirty_ = false; filter_data_dirty_ = false;
} }
void SVGElementResourceClient::InvalidateFilterData() {
if (!ClearFilterData())
return;
LayoutObject* layout_object = element_->GetLayoutObject();
layout_object->SetNeedsPaintPropertyUpdate();
MarkFilterDataDirty();
}
bool SVGElementResourceClient::ClearFilterData() { bool SVGElementResourceClient::ClearFilterData() {
FilterData* filter_data = filter_data_.Release(); FilterData* filter_data = filter_data_.Release();
if (filter_data) if (filter_data)
...@@ -815,13 +826,8 @@ SVGResourceInvalidator::SVGResourceInvalidator(LayoutObject& object) ...@@ -815,13 +826,8 @@ SVGResourceInvalidator::SVGResourceInvalidator(LayoutObject& object)
void SVGResourceInvalidator::InvalidateEffects() { void SVGResourceInvalidator::InvalidateEffects() {
if (!resources_) if (!resources_)
return; return;
if (resources_->Filter()) { if (resources_->Filter())
SVGElementResourceClient* client = SVGResources::GetClient(object_); SVGResources::GetClient(object_)->InvalidateFilterData();
if (client->ClearFilterData()) {
object_.SetNeedsPaintPropertyUpdate();
client->MarkFilterDataDirty();
}
}
if (resources_->Clipper()) if (resources_->Clipper())
object_.InvalidateClipPathCache(); object_.InvalidateClipPathCache();
if (resources_->Masker()) if (resources_->Masker())
......
...@@ -226,6 +226,7 @@ class SVGElementResourceClient final ...@@ -226,6 +226,7 @@ class SVGElementResourceClient final
const QualifiedName& attribute) override; const QualifiedName& attribute) override;
void UpdateFilterData(CompositorFilterOperations&); void UpdateFilterData(CompositorFilterOperations&);
void InvalidateFilterData();
bool ClearFilterData(); bool ClearFilterData();
void MarkFilterDataDirty(); void MarkFilterDataDirty();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment