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

Commit 5ad01b7

Browse files
committed
Add ImageFilterLayer test
1 parent 832ac43 commit 5ad01b7

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

flow/diff_context_unittests.cc

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "flutter/flow/layers/backdrop_filter_layer.h"
33
#include "flutter/flow/layers/clip_rect_layer.h"
44
#include "flutter/flow/layers/container_layer.h"
5+
#include "flutter/flow/layers/image_filter_layer.h"
56
#include "flutter/flow/layers/picture_layer.h"
67
#include "flutter/flow/layers/transform_layer.h"
78
#include "flutter/flow/testing/diff_context_test.h"
@@ -451,6 +452,55 @@ TEST_F(DiffContextTest, BackdropLayer) {
451452
EXPECT_EQ(damage.surface_damage, SkIRect::MakeXYWH(40, 40, 120, 120));
452453
}
453454

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+
454504
#endif // FLUTTER_ENABLE_DIFF_CONTEXT
455505

456506
} // namespace testing

0 commit comments

Comments
 (0)