diff --git a/impeller/display_list/display_list_dispatcher.cc b/impeller/display_list/display_list_dispatcher.cc index 88f9bc593c30a..95558f3f23004 100644 --- a/impeller/display_list/display_list_dispatcher.cc +++ b/impeller/display_list/display_list_dispatcher.cc @@ -1252,6 +1252,10 @@ void DisplayListDispatcher::drawDisplayList( Matrix saved_initial_matrix = initial_matrix_; int restore_count = canvas_.GetSaveCount(); + // The display list may alter the clip, which must be restored to the current + // clip at the end of playback. + canvas_.Save(); + // Establish a new baseline for interpreting the new DL. // Matrix and clip are left untouched, the current // transform is saved as the new base matrix, and paint diff --git a/impeller/display_list/display_list_unittests.cc b/impeller/display_list/display_list_unittests.cc index 5164897af68fa..9364279fc6597 100644 --- a/impeller/display_list/display_list_unittests.cc +++ b/impeller/display_list/display_list_unittests.cc @@ -45,6 +45,21 @@ flutter::DlColor toColor(const float* components) { using DisplayListTest = DisplayListPlayground; INSTANTIATE_PLAYGROUND_SUITE(DisplayListTest); +TEST_P(DisplayListTest, DrawPictureWithAClip) { + flutter::DisplayListBuilder sub_builder; + sub_builder.ClipRect(SkRect::MakeXYWH(0, 0, 24, 24), + flutter::DlCanvas::ClipOp::kIntersect, + /*is_aa=*/false); + sub_builder.DrawPaint(flutter::DlPaint(flutter::DlColor::kBlue())); + + auto display_list = sub_builder.Build(); + flutter::DisplayListBuilder builder; + builder.DrawDisplayList(display_list); + builder.DrawRect(SkRect::MakeXYWH(30, 30, 24, 24), + flutter::DlPaint(flutter::DlColor::kRed())); + ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); +} + TEST_P(DisplayListTest, CanDrawRect) { flutter::DisplayListBuilder builder; builder.DrawRect(SkRect::MakeXYWH(10, 10, 100, 100),