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(
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(
LayoutInvalidationReasonForTracing reason,
SubtreeLayoutScope* layout_scope) {
......
......@@ -78,7 +78,6 @@ class LayoutSVGResourceContainer : public LayoutSVGHiddenContainer {
static void MarkForLayoutAndParentResourceInvalidation(
LayoutObject&,
bool needs_layout = true);
static void MarkClientForInvalidation(LayoutObject&, InvalidationModeMask);
void ClearInvalidationMask() {
NOT_DESTROYED();
......
......@@ -592,12 +592,7 @@ void SVGResources::ClearClipPathFilterMask(SVGElement& element,
old_reference_clip->RemoveClient(*client);
if (style->HasFilter()) {
style->Filter().RemoveClient(*client);
if (client->ClearFilterData()) {
LayoutObject* layout_object = element.GetLayoutObject();
LayoutSVGResourceContainer::MarkClientForInvalidation(
*layout_object, SVGResourceClient::kPaintInvalidation);
client->MarkFilterDataDirty();
}
client->InvalidateFilterData();
}
if (StyleSVGResource* masker_resource = style->SvgStyle().MaskerResource())
masker_resource->RemoveClient(*client);
......@@ -700,14 +695,23 @@ void SVGElementResourceClient::ResourceContentChanged(
return;
}
const bool filter_data_invalidated = ClearFilterData();
if (filter_data_invalidated)
invalidation_mask |= SVGResourceClient::kPaintInvalidation;
InvalidateFilterData();
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,
invalidation_mask);
if (filter_data_invalidated)
MarkFilterDataDirty();
if (invalidation_mask & SVGResourceClient::kBoundariesInvalidation)
layout_object->SetNeedsBoundariesUpdate();
bool needs_layout =
invalidation_mask & SVGResourceClient::kLayoutInvalidation;
......@@ -745,8 +749,7 @@ void SVGElementResourceClient::FilterPrimitiveChanged(
LayoutObject* layout_object = element_->GetLayoutObject();
if (!layout_object)
return;
LayoutSVGResourceContainer::MarkClientForInvalidation(
*layout_object, SVGResourceClient::kPaintInvalidation);
layout_object->SetNeedsPaintPropertyUpdate();
MarkFilterDataDirty();
}
......@@ -789,6 +792,14 @@ void SVGElementResourceClient::UpdateFilterData(
filter_data_dirty_ = false;
}
void SVGElementResourceClient::InvalidateFilterData() {
if (!ClearFilterData())
return;
LayoutObject* layout_object = element_->GetLayoutObject();
layout_object->SetNeedsPaintPropertyUpdate();
MarkFilterDataDirty();
}
bool SVGElementResourceClient::ClearFilterData() {
FilterData* filter_data = filter_data_.Release();
if (filter_data)
......@@ -815,13 +826,8 @@ SVGResourceInvalidator::SVGResourceInvalidator(LayoutObject& object)
void SVGResourceInvalidator::InvalidateEffects() {
if (!resources_)
return;
if (resources_->Filter()) {
SVGElementResourceClient* client = SVGResources::GetClient(object_);
if (client->ClearFilterData()) {
object_.SetNeedsPaintPropertyUpdate();
client->MarkFilterDataDirty();
}
}
if (resources_->Filter())
SVGResources::GetClient(object_)->InvalidateFilterData();
if (resources_->Clipper())
object_.InvalidateClipPathCache();
if (resources_->Masker())
......
......@@ -226,6 +226,7 @@ class SVGElementResourceClient final
const QualifiedName& attribute) override;
void UpdateFilterData(CompositorFilterOperations&);
void InvalidateFilterData();
bool ClearFilterData();
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