@@ -192,5 +192,65 @@ TEST_F(ClipPathLayerTest, PartiallyContainedChild) {
192192 MockCanvas::DrawCall{1 , MockCanvas::RestoreData{0 }}}));
193193}
194194
195+ static bool ReadbackResult (PrerollContext* context,
196+ Clip clip_behavior,
197+ std::shared_ptr<Layer> child,
198+ bool before) {
199+ const SkMatrix initial_matrix = SkMatrix ();
200+ const SkRect layer_bounds = SkRect::MakeXYWH (0.5 , 1.0 , 5.0 , 6.0 );
201+ const SkPath layer_path = SkPath ().addRect (layer_bounds);
202+ auto layer = std::make_shared<ClipPathLayer>(layer_path, clip_behavior);
203+ if (child != nullptr ) {
204+ layer->Add (child);
205+ }
206+ context->surface_needs_readback = before;
207+ layer->Preroll (context, initial_matrix);
208+ return context->surface_needs_readback ;
209+ }
210+
211+ TEST_F (ClipPathLayerTest, Readback) {
212+ PrerollContext* context = preroll_context ();
213+ SkPath path;
214+ SkPaint paint;
215+
216+ const Clip hard = Clip::hardEdge;
217+ const Clip soft = Clip::antiAlias;
218+ const Clip save_layer = Clip::antiAliasWithSaveLayer;
219+
220+ std::shared_ptr<MockLayer> nochild;
221+ auto reader = std::make_shared<MockLayer>(path, paint, false , false , true );
222+ auto nonreader = std::make_shared<MockLayer>(path, paint);
223+
224+ // No children, no prior readback -> no readback after
225+ EXPECT_FALSE (ReadbackResult (context, hard, nochild, false ));
226+ EXPECT_FALSE (ReadbackResult (context, soft, nochild, false ));
227+ EXPECT_FALSE (ReadbackResult (context, save_layer, nochild, false ));
228+
229+ // No children, prior readback -> readback after
230+ EXPECT_TRUE (ReadbackResult (context, hard, nochild, true ));
231+ EXPECT_TRUE (ReadbackResult (context, soft, nochild, true ));
232+ EXPECT_TRUE (ReadbackResult (context, save_layer, nochild, true ));
233+
234+ // Non readback child, no prior readback -> no readback after
235+ EXPECT_FALSE (ReadbackResult (context, hard, nonreader, false ));
236+ EXPECT_FALSE (ReadbackResult (context, soft, nonreader, false ));
237+ EXPECT_FALSE (ReadbackResult (context, save_layer, nonreader, false ));
238+
239+ // Non readback child, prior readback -> readback after
240+ EXPECT_TRUE (ReadbackResult (context, hard, nonreader, true ));
241+ EXPECT_TRUE (ReadbackResult (context, soft, nonreader, true ));
242+ EXPECT_TRUE (ReadbackResult (context, save_layer, nonreader, true ));
243+
244+ // Readback child, no prior readback -> readback after unless SaveLayer
245+ EXPECT_TRUE (ReadbackResult (context, hard, reader, false ));
246+ EXPECT_TRUE (ReadbackResult (context, soft, reader, false ));
247+ EXPECT_FALSE (ReadbackResult (context, save_layer, reader, false ));
248+
249+ // Readback child, prior readback -> readback after
250+ EXPECT_TRUE (ReadbackResult (context, hard, reader, true ));
251+ EXPECT_TRUE (ReadbackResult (context, soft, reader, true ));
252+ EXPECT_TRUE (ReadbackResult (context, save_layer, reader, true ));
253+ }
254+
195255} // namespace testing
196256} // namespace flutter
0 commit comments