@@ -890,5 +890,39 @@ TEST_P(AiksTest, DispatcherDoesNotCullPerspectiveTransformedChildDisplayLists) {
890
890
ASSERT_TRUE (OpenPlaygroundHere (builder.Build ()));
891
891
}
892
892
893
+ // Results in a 100x100 green square. If any red is drawn, there is a bug.
894
+ TEST_P (AiksTest, BackdropRestoreUsesCorrectCoverageForFirstRestoredClip) {
895
+ DisplayListBuilder builder;
896
+
897
+ DlPaint paint;
898
+ // Add a difference clip that cuts out the bottom right corner
899
+ builder.ClipRect (SkRect::MakeLTRB (50 , 50 , 100 , 100 ),
900
+ DlCanvas::ClipOp::kDifference );
901
+
902
+ // Draw a red rectangle that's going to be completely covered by green later.
903
+ paint.setColor (DlColor::kRed ());
904
+ builder.DrawRect (SkRect::MakeLTRB (0 , 0 , 100 , 100 ), paint);
905
+
906
+ // Add a clip restricting the backdrop filter to the top right corner.
907
+ auto count = builder.GetSaveCount ();
908
+ builder.Save ();
909
+ {
910
+ builder.ClipRect (SkRect::MakeLTRB (0 , 0 , 100 , 100 ));
911
+ {
912
+ // Create a save layer with a backdrop blur filter.
913
+ auto backdrop_filter =
914
+ DlBlurImageFilter::Make (10.0 , 10.0 , DlTileMode::kDecal );
915
+ builder.SaveLayer (nullptr , nullptr , backdrop_filter.get ());
916
+ }
917
+ }
918
+ builder.RestoreToCount (count);
919
+
920
+ // Finally, overwrite all the previous stuff with green.
921
+ paint.setColor (DlColor::kGreen ());
922
+ builder.DrawRect (SkRect::MakeLTRB (0 , 0 , 100 , 100 ), paint);
923
+
924
+ ASSERT_TRUE (OpenPlaygroundHere (builder.Build ()));
925
+ }
926
+
893
927
} // namespace testing
894
928
} // namespace impeller
0 commit comments