|
2 | 2 | #include "flutter/flow/layers/backdrop_filter_layer.h" |
3 | 3 | #include "flutter/flow/layers/clip_rect_layer.h" |
4 | 4 | #include "flutter/flow/layers/container_layer.h" |
| 5 | +#include "flutter/flow/layers/image_filter_layer.h" |
5 | 6 | #include "flutter/flow/layers/picture_layer.h" |
6 | 7 | #include "flutter/flow/layers/transform_layer.h" |
7 | 8 | #include "flutter/flow/testing/diff_context_test.h" |
@@ -451,6 +452,55 @@ TEST_F(DiffContextTest, BackdropLayer) { |
451 | 452 | EXPECT_EQ(damage.surface_damage, SkIRect::MakeXYWH(40, 40, 120, 120)); |
452 | 453 | } |
453 | 454 |
|
| 455 | +TEST_F(DiffContextTest, ImageFilterLayer) { |
| 456 | + auto filter = SkBlurImageFilter::Make(10, 10, nullptr, nullptr, |
| 457 | + SkBlurImageFilter::kClamp_TileMode); |
| 458 | + |
| 459 | + { |
| 460 | + // tests later assume 30px paint area, fail early if that's not the case |
| 461 | + auto paint_rect = |
| 462 | + filter->filterBounds(SkIRect::MakeWH(10, 10), SkMatrix::I(), |
| 463 | + SkImageFilter::kForward_MapDirection); |
| 464 | + EXPECT_EQ(paint_rect, SkIRect::MakeLTRB(-30, -30, 40, 40)); |
| 465 | + } |
| 466 | + |
| 467 | + LayerTree l1; |
| 468 | + auto filter_layer = std::make_shared<ImageFilterLayer>(filter); |
| 469 | + auto path = SkPath().addRect(SkRect::MakeXYWH(100, 100, 10, 10)); |
| 470 | + filter_layer->Add(std::make_shared<MockLayer>(path)); |
| 471 | + l1.root()->Add(filter_layer); |
| 472 | + |
| 473 | + auto damage = DiffLayerTree(l1, LayerTree()); |
| 474 | + EXPECT_EQ(damage.surface_damage, SkIRect::MakeXYWH(70, 70, 70, 70)); |
| 475 | + |
| 476 | + // filter bounds are calculated in screen space, make sure scaling doesn't |
| 477 | + // affect it |
| 478 | + LayerTree l2; |
| 479 | + auto scale = std::make_shared<TransformLayer>(SkMatrix::MakeScale(2.0, 2.0)); |
| 480 | + scale->Add(filter_layer); |
| 481 | + l2.root()->Add(scale); |
| 482 | + |
| 483 | + damage = DiffLayerTree(l2, LayerTree()); |
| 484 | + EXPECT_EQ(damage.surface_damage, SkIRect::MakeXYWH(170, 170, 80, 80)); |
| 485 | + |
| 486 | + LayerTree l3; |
| 487 | + l3.root()->Add(scale); |
| 488 | + |
| 489 | + // path outside of ImageFilterLayer |
| 490 | + auto path1 = SkPath().addRect(SkRect::MakeXYWH(160, 160, 10, 10)); |
| 491 | + l3.root()->Add(std::make_shared<MockLayer>(path1)); |
| 492 | + damage = DiffLayerTree(l3, l2); |
| 493 | + EXPECT_EQ(damage.surface_damage, SkIRect::MakeXYWH(160, 160, 10, 10)); |
| 494 | + |
| 495 | + // path intersecting ImageFilterLayer, should trigger ImageFilterLayer repaint |
| 496 | + LayerTree l4; |
| 497 | + l4.root()->Add(scale); |
| 498 | + auto path2 = SkPath().addRect(SkRect::MakeXYWH(160, 160, 11, 11)); |
| 499 | + l4.root()->Add(std::make_shared<MockLayer>(path2)); |
| 500 | + damage = DiffLayerTree(l4, l3); |
| 501 | + EXPECT_EQ(damage.surface_damage, SkIRect::MakeXYWH(160, 160, 90, 90)); |
| 502 | +} |
| 503 | + |
454 | 504 | #endif // FLUTTER_ENABLE_DIFF_CONTEXT |
455 | 505 |
|
456 | 506 | } // namespace testing |
|
0 commit comments