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

Wrap an element reference in FEImage

Rather than having FEImage resolve the element reference on every
operation that may involve it, have the creator of the FEImage (the
SVGFEImageElement) resolve the reference and pass it to the FEImage.

Bug: 1028063
Change-Id: Icabe881d980abe995a96dbf54df81da151e0e610
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2111157Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Cr-Commit-Position: refs/heads/master@{#752405}
parent c172f95b
......@@ -23,13 +23,11 @@
#include "third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.h"
#include "third_party/blink/renderer/core/dom/tree_scope.h"
#include "third_party/blink/renderer/core/layout/layout_object.h"
#include "third_party/blink/renderer/core/paint/svg_object_painter.h"
#include "third_party/blink/renderer/core/svg/svg_element.h"
#include "third_party/blink/renderer/core/svg/svg_length_context.h"
#include "third_party/blink/renderer/core/svg/svg_preserve_aspect_ratio.h"
#include "third_party/blink/renderer/core/svg/svg_uri_reference.h"
#include "third_party/blink/renderer/platform/graphics/filters/filter.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_record.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h"
......@@ -45,24 +43,21 @@ FEImage::FEImage(Filter* filter,
const SVGPreserveAspectRatio* preserve_aspect_ratio)
: FilterEffect(filter),
image_(std::move(image)),
tree_scope_(nullptr),
preserve_aspect_ratio_(preserve_aspect_ratio) {
FilterEffect::SetOperatingInterpolationSpace(kInterpolationSpaceSRGB);
}
FEImage::FEImage(Filter* filter,
const TreeScope& tree_scope,
const String& href,
const SVGElement* element,
const SVGPreserveAspectRatio* preserve_aspect_ratio)
: FilterEffect(filter),
tree_scope_(&tree_scope),
href_(href),
element_(element),
preserve_aspect_ratio_(preserve_aspect_ratio) {
FilterEffect::SetOperatingInterpolationSpace(kInterpolationSpaceSRGB);
}
void FEImage::Trace(Visitor* visitor) {
visitor->Trace(tree_scope_);
visitor->Trace(element_);
visitor->Trace(preserve_aspect_ratio_);
FilterEffect::Trace(visitor);
}
......@@ -103,11 +98,9 @@ FloatRect FEImage::MapInputs(const FloatRect&) const {
GetFilter()->MapLocalRectToAbsoluteRect(FilterPrimitiveSubregion());
if (const LayoutObject* layout_object = ReferencedLayoutObject()) {
FloatRect src_rect = GetLayoutObjectRepaintRect(layout_object);
auto* context_node = To<SVGElement>(layout_object->GetNode());
if (context_node->HasRelativeLengths()) {
if (element_->HasRelativeLengths()) {
auto viewport_transform =
ComputeViewportAdjustmentTransform(context_node, dest_rect);
ComputeViewportAdjustmentTransform(element_, dest_rect);
if (viewport_transform)
src_rect = viewport_transform->MapRect(src_rect);
} else {
......@@ -126,13 +119,9 @@ FloatRect FEImage::MapInputs(const FloatRect&) const {
}
const LayoutObject* FEImage::ReferencedLayoutObject() const {
if (!tree_scope_)
return nullptr;
const SVGElement* target = DynamicTo<SVGElement>(
SVGURIReference::TargetElementFromIRIString(href_, *tree_scope_));
if (!target)
if (!element_)
return nullptr;
return target->GetLayoutObject();
return element_->GetLayoutObject();
}
WTF::TextStream& FEImage::ExternalRepresentation(WTF::TextStream& ts,
......@@ -159,11 +148,9 @@ sk_sp<PaintFilter> FEImage::CreateImageFilterForLayoutObject(
GetFilter()->MapLocalRectToAbsoluteRect(FilterPrimitiveSubregion());
AffineTransform transform;
auto* context_node = To<SVGElement>(layout_object.GetNode());
if (context_node->HasRelativeLengths()) {
if (element_->HasRelativeLengths()) {
auto viewport_transform =
ComputeViewportAdjustmentTransform(context_node, dst_rect);
ComputeViewportAdjustmentTransform(element_, dst_rect);
if (viewport_transform)
transform = *viewport_transform;
} else {
......
......@@ -25,22 +25,18 @@
#define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_GRAPHICS_FILTERS_SVG_FE_IMAGE_H_
#include "third_party/blink/renderer/platform/graphics/filters/filter_effect.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
class Image;
class LayoutObject;
class SVGElement;
class SVGPreserveAspectRatio;
class TreeScope;
class FEImage final : public FilterEffect {
public:
FEImage(Filter*, scoped_refptr<Image>, const SVGPreserveAspectRatio*);
FEImage(Filter*,
const TreeScope&,
const String&,
const SVGPreserveAspectRatio*);
FEImage(Filter*, const SVGElement*, const SVGPreserveAspectRatio*);
// feImage does not perform color interpolation of any kind, so doesn't
// depend on the value of color-interpolation-filters.
......@@ -65,9 +61,7 @@ class FEImage final : public FilterEffect {
sk_sp<PaintFilter> CreateImageFilterForLayoutObject(const LayoutObject&);
scoped_refptr<Image> image_;
Member<const TreeScope> tree_scope_;
String href_;
Member<const SVGElement> element_;
Member<const SVGPreserveAspectRatio> preserve_aspect_ratio_;
};
......
......@@ -158,8 +158,9 @@ FilterEffect* SVGFEImageElement::Build(SVGFilterBuilder*, Filter* filter) {
return MakeGarbageCollected<FEImage>(
filter, image, preserve_aspect_ratio_->CurrentValue());
}
return MakeGarbageCollected<FEImage>(filter, GetTreeScope(), HrefString(),
const SVGElement* target = DynamicTo<SVGElement>(
TargetElementFromIRIString(HrefString(), GetTreeScope()));
return MakeGarbageCollected<FEImage>(filter, target,
preserve_aspect_ratio_->CurrentValue());
}
......
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