@@ -83,8 +83,47 @@ TEST_F(ImageFilterLayerTest, SimpleFilter) {
8383 auto layer = std::make_shared<ImageFilterLayer>(layer_filter);
8484 layer->Add (mock_layer);
8585
86+ const SkRect child_rounded_bounds =
87+ SkRect::MakeLTRB (5 .0f , 6 .0f , 21 .0f , 22 .0f );
88+
8689 layer->Preroll (preroll_context (), initial_transform);
87- EXPECT_EQ (layer->paint_bounds (), child_bounds);
90+ EXPECT_EQ (layer->paint_bounds (), child_rounded_bounds);
91+ EXPECT_TRUE (layer->needs_painting ());
92+ EXPECT_EQ (mock_layer->parent_matrix (), initial_transform);
93+
94+ SkPaint filter_paint;
95+ filter_paint.setImageFilter (layer_filter);
96+ layer->Paint (paint_context ());
97+ EXPECT_EQ (mock_canvas ().draw_calls (),
98+ std::vector ({
99+ MockCanvas::DrawCall{0 , MockCanvas::SaveData{1 }},
100+ MockCanvas::DrawCall{1 , MockCanvas::SetMatrixData{SkMatrix ()}},
101+ MockCanvas::DrawCall{
102+ 1 , MockCanvas::SaveLayerData{child_bounds, filter_paint,
103+ nullptr , 2 }},
104+ MockCanvas::DrawCall{
105+ 2 , MockCanvas::DrawPathData{child_path, child_paint}},
106+ MockCanvas::DrawCall{2 , MockCanvas::RestoreData{1 }},
107+ MockCanvas::DrawCall{1 , MockCanvas::RestoreData{0 }},
108+ }));
109+ }
110+
111+ TEST_F (ImageFilterLayerTest, SimpleFilterBounds) {
112+ const SkMatrix initial_transform = SkMatrix::MakeTrans (0 .5f , 1 .0f );
113+ const SkRect child_bounds = SkRect::MakeLTRB (5 .0f , 6 .0f , 20 .5f , 21 .5f );
114+ const SkPath child_path = SkPath ().addRect (child_bounds);
115+ const SkPaint child_paint = SkPaint (SkColors::kYellow );
116+ const SkMatrix filter_transform = SkMatrix::MakeScale (2.0 , 2.0 );
117+ auto layer_filter = SkImageFilter::MakeMatrixFilter (
118+ filter_transform, SkFilterQuality::kMedium_SkFilterQuality , nullptr );
119+ auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
120+ auto layer = std::make_shared<ImageFilterLayer>(layer_filter);
121+ layer->Add (mock_layer);
122+
123+ const SkRect filter_bounds = SkRect::MakeLTRB (10 .0f , 12 .0f , 42 .0f , 44 .0f );
124+
125+ layer->Preroll (preroll_context (), initial_transform);
126+ EXPECT_EQ (layer->paint_bounds (), filter_bounds);
88127 EXPECT_TRUE (layer->needs_painting ());
89128 EXPECT_EQ (mock_layer->parent_matrix (), initial_transform);
90129
@@ -123,10 +162,12 @@ TEST_F(ImageFilterLayerTest, MultipleChildren) {
123162
124163 SkRect children_bounds = child_path1.getBounds ();
125164 children_bounds.join (child_path2.getBounds ());
165+ SkRect children_rounded_bounds = SkRect::Make (children_bounds.roundOut ());
166+
126167 layer->Preroll (preroll_context (), initial_transform);
127168 EXPECT_EQ (mock_layer1->paint_bounds (), child_path1.getBounds ());
128169 EXPECT_EQ (mock_layer2->paint_bounds (), child_path2.getBounds ());
129- EXPECT_EQ (layer->paint_bounds (), children_bounds );
170+ EXPECT_EQ (layer->paint_bounds (), children_rounded_bounds );
130171 EXPECT_TRUE (mock_layer1->needs_painting ());
131172 EXPECT_TRUE (mock_layer2->needs_painting ());
132173 EXPECT_TRUE (layer->needs_painting ());
@@ -172,12 +213,17 @@ TEST_F(ImageFilterLayerTest, Nested) {
172213 layer1->Add (layer2);
173214
174215 SkRect children_bounds = child_path1.getBounds ();
175- children_bounds.join (child_path2.getBounds ());
216+ children_bounds.join (SkRect::Make (child_path2.getBounds ().roundOut ()));
217+ const SkRect children_rounded_bounds =
218+ SkRect::Make (children_bounds.roundOut ());
219+ const SkRect mock_layer2_rounded_bounds =
220+ SkRect::Make (child_path2.getBounds ().roundOut ());
221+
176222 layer1->Preroll (preroll_context (), initial_transform);
177223 EXPECT_EQ (mock_layer1->paint_bounds (), child_path1.getBounds ());
178224 EXPECT_EQ (mock_layer2->paint_bounds (), child_path2.getBounds ());
179- EXPECT_EQ (layer1->paint_bounds (), children_bounds );
180- EXPECT_EQ (layer2->paint_bounds (), mock_layer2-> paint_bounds () );
225+ EXPECT_EQ (layer1->paint_bounds (), children_rounded_bounds );
226+ EXPECT_EQ (layer2->paint_bounds (), mock_layer2_rounded_bounds );
181227 EXPECT_TRUE (mock_layer1->needs_painting ());
182228 EXPECT_TRUE (mock_layer2->needs_painting ());
183229 EXPECT_TRUE (layer1->needs_painting ());
0 commit comments