Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit f8a398f

Browse files
authored
Fix crash in BackdropFilterLayer::Diff (#30460)
* Fix crash in BackdropFilterLayer::Diff * Pass context transform to filterBounds instead of scaling the filter
1 parent a78103c commit f8a398f

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

flow/layers/backdrop_filter_layer.cc

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,11 @@ void BackdropFilterLayer::Diff(DiffContext* context, const Layer* old_layer) {
2525
context->AddLayerBounds(paint_bounds);
2626

2727
if (filter_) {
28-
// convert paint bounds and filter to screen coordinates
2928
context->GetTransform().mapRect(&paint_bounds);
3029
auto input_filter_bounds = paint_bounds.roundOut();
31-
auto filter = filter_->makeWithLocalMatrix(context->GetTransform());
32-
3330
auto filter_bounds = // in screen coordinates
34-
filter->filterBounds(input_filter_bounds, SkMatrix::I(),
35-
SkImageFilter::kReverse_MapDirection);
36-
31+
filter_->filterBounds(input_filter_bounds, context->GetTransform(),
32+
SkImageFilter::kReverse_MapDirection);
3733
context->AddReadbackRegion(filter_bounds);
3834
}
3935

flow/layers/backdrop_filter_layer_unittests.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,5 +327,29 @@ TEST_F(BackdropLayerDiffTest, BackdropLayer) {
327327
EXPECT_EQ(damage.frame_damage, SkIRect::MakeLTRB(0, 0, 190, 190));
328328
}
329329

330+
TEST_F(BackdropLayerDiffTest, BackdropLayerInvalidTransform) {
331+
auto filter = SkImageFilters::Blur(10, 10, SkTileMode::kClamp, nullptr);
332+
333+
{
334+
// tests later assume 30px readback area, fail early if that's not the case
335+
auto readback = filter->filterBounds(SkIRect::MakeWH(10, 10), SkMatrix::I(),
336+
SkImageFilter::kReverse_MapDirection);
337+
EXPECT_EQ(readback, SkIRect::MakeLTRB(-30, -30, 40, 40));
338+
}
339+
340+
MockLayerTree l1(SkISize::Make(100, 100));
341+
SkMatrix transform;
342+
transform.setPerspX(0.1);
343+
transform.setPerspY(0.1);
344+
345+
auto transform_layer = std::make_shared<TransformLayer>(transform);
346+
l1.root()->Add(transform_layer);
347+
transform_layer->Add(
348+
std::make_shared<BackdropFilterLayer>(filter, SkBlendMode::kSrcOver));
349+
350+
auto damage = DiffLayerTree(l1, MockLayerTree(SkISize::Make(100, 100)));
351+
EXPECT_EQ(damage.frame_damage, SkIRect::MakeWH(15, 15));
352+
}
353+
330354
} // namespace testing
331355
} // namespace flutter

0 commit comments

Comments
 (0)