Commit dee130a8 authored by Fredrik Söderquist's avatar Fredrik Söderquist Committed by Commit Bot

Make LayoutSVGResource*::ResourceBoundingBox uniform

The LayoutSVGResourceFilter and LayoutSVGResourceMasker versions was
taking const LayoutObject* while the one on LayoutSVGResourceClipper
took a const FloatRect&. Align the two former with the later - thus
eliminating unnecessary dependencies on the client.

Cq-Include-Trybots: luci.chromium.try:linux_layout_tests_slimming_paint_v2;master.tryserver.blink:linux_trusty_blink_rel
Change-Id: I26dcfb5ba9d164e4c5f97b9063cac8b6281cd6e6
Reviewed-on: https://chromium-review.googlesource.com/1243193
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Cr-Commit-Position: refs/heads/master@{#594051}
parent ab28cbdc
...@@ -85,10 +85,10 @@ bool LayoutSVGResourceFilter::RemoveClientFromCache(SVGResourceClient& client) { ...@@ -85,10 +85,10 @@ bool LayoutSVGResourceFilter::RemoveClientFromCache(SVGResourceClient& client) {
} }
FloatRect LayoutSVGResourceFilter::ResourceBoundingBox( FloatRect LayoutSVGResourceFilter::ResourceBoundingBox(
const LayoutObject* object) { const FloatRect& reference_box) const {
const auto* filter_element = ToSVGFilterElement(GetElement()); const auto* filter_element = ToSVGFilterElement(GetElement());
return SVGLengthContext::ResolveRectangle(filter_element, FilterUnits(), return SVGLengthContext::ResolveRectangle(filter_element, FilterUnits(),
object->ObjectBoundingBox()); reference_box);
} }
SVGUnitTypes::SVGUnitType LayoutSVGResourceFilter::FilterUnits() const { SVGUnitTypes::SVGUnitType LayoutSVGResourceFilter::FilterUnits() const {
......
...@@ -82,7 +82,7 @@ class LayoutSVGResourceFilter final : public LayoutSVGResourceContainer { ...@@ -82,7 +82,7 @@ class LayoutSVGResourceFilter final : public LayoutSVGResourceContainer {
void RemoveAllClientsFromCache(bool mark_for_invalidation = true) override; void RemoveAllClientsFromCache(bool mark_for_invalidation = true) override;
bool RemoveClientFromCache(SVGResourceClient&) override; bool RemoveClientFromCache(SVGResourceClient&) override;
FloatRect ResourceBoundingBox(const LayoutObject*); FloatRect ResourceBoundingBox(const FloatRect& reference_box) const;
SVGUnitTypes::SVGUnitType FilterUnits() const; SVGUnitTypes::SVGUnitType FilterUnits() const;
SVGUnitTypes::SVGUnitType PrimitiveUnits() const; SVGUnitTypes::SVGUnitType PrimitiveUnits() const;
......
...@@ -110,13 +110,12 @@ SVGUnitTypes::SVGUnitType LayoutSVGResourceMasker::MaskContentUnits() const { ...@@ -110,13 +110,12 @@ SVGUnitTypes::SVGUnitType LayoutSVGResourceMasker::MaskContentUnits() const {
} }
FloatRect LayoutSVGResourceMasker::ResourceBoundingBox( FloatRect LayoutSVGResourceMasker::ResourceBoundingBox(
const LayoutObject* object) { const FloatRect& reference_box) {
SVGMaskElement* mask_element = ToSVGMaskElement(GetElement()); SVGMaskElement* mask_element = ToSVGMaskElement(GetElement());
DCHECK(mask_element); DCHECK(mask_element);
FloatRect object_bounding_box = object->ObjectBoundingBox();
FloatRect mask_boundaries = SVGLengthContext::ResolveRectangle( FloatRect mask_boundaries = SVGLengthContext::ResolveRectangle(
mask_element, MaskUnits(), object_bounding_box); mask_element, MaskUnits(), reference_box);
// Resource was not layouted yet. Give back clipping rect of the mask. // Resource was not layouted yet. Give back clipping rect of the mask.
if (SelfNeedsLayout()) if (SelfNeedsLayout())
...@@ -128,9 +127,8 @@ FloatRect LayoutSVGResourceMasker::ResourceBoundingBox( ...@@ -128,9 +127,8 @@ FloatRect LayoutSVGResourceMasker::ResourceBoundingBox(
FloatRect mask_rect = mask_content_boundaries_; FloatRect mask_rect = mask_content_boundaries_;
if (MaskContentUnits() == SVGUnitTypes::kSvgUnitTypeObjectboundingbox) { if (MaskContentUnits() == SVGUnitTypes::kSvgUnitTypeObjectboundingbox) {
AffineTransform transform; AffineTransform transform;
transform.Translate(object_bounding_box.X(), object_bounding_box.Y()); transform.Translate(reference_box.X(), reference_box.Y());
transform.ScaleNonUniform(object_bounding_box.Width(), transform.ScaleNonUniform(reference_box.Width(), reference_box.Height());
object_bounding_box.Height());
mask_rect = transform.MapRect(mask_rect); mask_rect = transform.MapRect(mask_rect);
} }
......
...@@ -40,7 +40,7 @@ class LayoutSVGResourceMasker final : public LayoutSVGResourceContainer { ...@@ -40,7 +40,7 @@ class LayoutSVGResourceMasker final : public LayoutSVGResourceContainer {
void RemoveAllClientsFromCache(bool mark_for_invalidation = true) override; void RemoveAllClientsFromCache(bool mark_for_invalidation = true) override;
FloatRect ResourceBoundingBox(const LayoutObject*); FloatRect ResourceBoundingBox(const FloatRect& reference_box);
SVGUnitTypes::SVGUnitType MaskUnits() const; SVGUnitTypes::SVGUnitType MaskUnits() const;
SVGUnitTypes::SVGUnitType MaskContentUnits() const; SVGUnitTypes::SVGUnitType MaskContentUnits() const;
......
...@@ -392,16 +392,20 @@ void SVGLayoutSupport::AdjustVisualRectWithResources( ...@@ -392,16 +392,20 @@ void SVGLayoutSupport::AdjustVisualRectWithResources(
if (!resources) if (!resources)
return; return;
if (LayoutSVGResourceFilter* filter = resources->Filter()) if (LayoutSVGResourceFilter* filter = resources->Filter()) {
visual_rect = filter->ResourceBoundingBox(&layout_object); visual_rect =
filter->ResourceBoundingBox(layout_object.ObjectBoundingBox());
}
if (LayoutSVGResourceClipper* clipper = resources->Clipper()) { if (LayoutSVGResourceClipper* clipper = resources->Clipper()) {
visual_rect.Intersect( visual_rect.Intersect(
clipper->ResourceBoundingBox(layout_object.ObjectBoundingBox())); clipper->ResourceBoundingBox(layout_object.ObjectBoundingBox()));
} }
if (LayoutSVGResourceMasker* masker = resources->Masker()) if (LayoutSVGResourceMasker* masker = resources->Masker()) {
visual_rect.Intersect(masker->ResourceBoundingBox(&layout_object)); visual_rect.Intersect(
masker->ResourceBoundingBox(layout_object.ObjectBoundingBox()));
}
} }
bool SVGLayoutSupport::HasFilterResource(const LayoutObject& object) { bool SVGLayoutSupport::HasFilterResource(const LayoutObject& object) {
......
...@@ -735,6 +735,7 @@ void WriteResources(WTF::TextStream& ts, ...@@ -735,6 +735,7 @@ void WriteResources(WTF::TextStream& ts,
SVGResourcesCache::CachedResourcesForLayoutObject(object); SVGResourcesCache::CachedResourcesForLayoutObject(object);
if (!resources) if (!resources)
return; return;
const FloatRect reference_box = object.ObjectBoundingBox();
const ComputedStyle& style = object.StyleRef(); const ComputedStyle& style = object.StyleRef();
TreeScope& tree_scope = object.GetDocument(); TreeScope& tree_scope = object.GetDocument();
if (LayoutSVGResourceMasker* masker = resources->Masker()) { if (LayoutSVGResourceMasker* masker = resources->Masker()) {
...@@ -744,7 +745,7 @@ void WriteResources(WTF::TextStream& ts, ...@@ -744,7 +745,7 @@ void WriteResources(WTF::TextStream& ts,
tree_scope); tree_scope);
ts << " "; ts << " ";
WriteStandardPrefix(ts, *masker, 0); WriteStandardPrefix(ts, *masker, 0);
ts << " " << masker->ResourceBoundingBox(&object) << "\n"; ts << " " << masker->ResourceBoundingBox(reference_box) << "\n";
} }
if (LayoutSVGResourceClipper* clipper = resources->Clipper()) { if (LayoutSVGResourceClipper* clipper = resources->Clipper()) {
DCHECK(style.ClipPath()); DCHECK(style.ClipPath());
...@@ -758,8 +759,7 @@ void WriteResources(WTF::TextStream& ts, ...@@ -758,8 +759,7 @@ void WriteResources(WTF::TextStream& ts,
WriteNameAndQuotedValue(ts, "clipPath", id); WriteNameAndQuotedValue(ts, "clipPath", id);
ts << " "; ts << " ";
WriteStandardPrefix(ts, *clipper, 0); WriteStandardPrefix(ts, *clipper, 0);
ts << " " << clipper->ResourceBoundingBox(object.ObjectBoundingBox()) ts << " " << clipper->ResourceBoundingBox(reference_box) << "\n";
<< "\n";
} }
if (LayoutSVGResourceFilter* filter = resources->Filter()) { if (LayoutSVGResourceFilter* filter = resources->Filter()) {
DCHECK(style.HasFilter()); DCHECK(style.HasFilter());
...@@ -775,7 +775,7 @@ void WriteResources(WTF::TextStream& ts, ...@@ -775,7 +775,7 @@ void WriteResources(WTF::TextStream& ts,
WriteNameAndQuotedValue(ts, "filter", id); WriteNameAndQuotedValue(ts, "filter", id);
ts << " "; ts << " ";
WriteStandardPrefix(ts, *filter, 0); WriteStandardPrefix(ts, *filter, 0);
ts << " " << filter->ResourceBoundingBox(&object) << "\n"; ts << " " << filter->ResourceBoundingBox(reference_box) << "\n";
} }
} }
......
...@@ -22,8 +22,10 @@ base::Optional<IntRect> CSSMaskPainter::MaskBoundingBox( ...@@ -22,8 +22,10 @@ base::Optional<IntRect> CSSMaskPainter::MaskBoundingBox(
SVGResources* resources = SVGResources* resources =
SVGResourcesCache::CachedResourcesForLayoutObject(object); SVGResourcesCache::CachedResourcesForLayoutObject(object);
LayoutSVGResourceMasker* masker = resources ? resources->Masker() : nullptr; LayoutSVGResourceMasker* masker = resources ? resources->Masker() : nullptr;
if (masker) if (masker) {
return EnclosingIntRect(masker->ResourceBoundingBox(&object)); return EnclosingIntRect(
masker->ResourceBoundingBox(object.ObjectBoundingBox()));
}
} }
if (object.IsSVGChild() && !object.IsSVGForeignObject()) if (object.IsSVGChild() && !object.IsSVGForeignObject())
......
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