Make the filter_ in mutator shared_ptr (#34944)
diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc
index 32acb94..1fb1d24 100644
--- a/flow/embedded_views.cc
+++ b/flow/embedded_views.cc
@@ -36,7 +36,8 @@
vector_.push_back(element);
};
-void MutatorsStack::PushBackdropFilter(const DlImageFilter& filter) {
+void MutatorsStack::PushBackdropFilter(
+ std::shared_ptr<const DlImageFilter> filter) {
std::shared_ptr<Mutator> element = std::make_shared<Mutator>(filter);
vector_.push_back(element);
};
diff --git a/flow/embedded_views.h b/flow/embedded_views.h
index 5e801de..394fa9d 100644
--- a/flow/embedded_views.h
+++ b/flow/embedded_views.h
@@ -70,8 +70,8 @@
explicit Mutator(const SkMatrix& matrix)
: type_(kTransform), matrix_(matrix) {}
explicit Mutator(const int& alpha) : type_(kOpacity), alpha_(alpha) {}
- explicit Mutator(const DlImageFilter& filter)
- : type_(kBackdropFilter), filter_(&filter) {}
+ explicit Mutator(std::shared_ptr<const DlImageFilter> filter)
+ : type_(kBackdropFilter), filter_(filter) {}
const MutatorType& GetType() const { return type_; }
const SkRect& GetRect() const { return rect_; }
@@ -119,15 +119,18 @@
private:
MutatorType type_;
+ // TODO(cyanglaz): Remove union.
+ // https://github.com/flutter/flutter/issues/108470
union {
SkRect rect_;
SkRRect rrect_;
SkMatrix matrix_;
SkPath* path_;
int alpha_;
- const DlImageFilter* filter_;
};
+ std::shared_ptr<const DlImageFilter> filter_;
+
}; // Mutator
// A stack of mutators that can be applied to an embedded platform view.
@@ -148,7 +151,7 @@
void PushClipPath(const SkPath& path);
void PushTransform(const SkMatrix& matrix);
void PushOpacity(const int& alpha);
- void PushBackdropFilter(const DlImageFilter& filter);
+ void PushBackdropFilter(std::shared_ptr<const DlImageFilter> filter);
// Removes the `Mutator` on the top of the stack
// and destroys it.
diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc
index cfc642d..a460125 100644
--- a/flow/mutators_stack_unittests.cc
+++ b/flow/mutators_stack_unittests.cc
@@ -91,11 +91,21 @@
TEST(MutatorsStack, PushBackdropFilter) {
MutatorsStack stack;
- auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp);
- stack.PushBackdropFilter(filter);
- auto iter = stack.Bottom();
- ASSERT_TRUE(iter->get()->GetType() == MutatorType::kBackdropFilter);
- ASSERT_TRUE(iter->get()->GetFilter() == filter);
+ const int num_of_mutators = 10;
+ for (int i = 0; i < num_of_mutators; i++) {
+ auto filter = std::make_shared<DlBlurImageFilter>(i, 5, DlTileMode::kClamp);
+ stack.PushBackdropFilter(filter);
+ }
+
+ auto iter = stack.Begin();
+ int i = 0;
+ while (iter != stack.End()) {
+ ASSERT_EQ(iter->get()->GetType(), MutatorType::kBackdropFilter);
+ ASSERT_EQ(iter->get()->GetFilter().asBlur()->sigma_x(), i);
+ ++iter;
+ ++i;
+ }
+ ASSERT_EQ(i, num_of_mutators);
}
TEST(MutatorsStack, Pop) {