diff --git a/impeller/display_list/dl_dispatcher.cc b/impeller/display_list/dl_dispatcher.cc index cd8f29bd74c9f..b099ee34fc97e 100644 --- a/impeller/display_list/dl_dispatcher.cc +++ b/impeller/display_list/dl_dispatcher.cc @@ -1052,6 +1052,10 @@ void DlDispatcher::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/dl_unittests.cc b/impeller/display_list/dl_unittests.cc index 22f118fd0a3ec..b5ce5c4c9a420 100644 --- a/impeller/display_list/dl_unittests.cc +++ b/impeller/display_list/dl_unittests.cc @@ -45,6 +45,19 @@ flutter::DlColor toColor(const float* components) { using DisplayListTest = DlPlayground; INSTANTIATE_PLAYGROUND_SUITE(DisplayListTest); +TEST_P(DisplayListTest, DrawPictureWithAClip) { + flutter::DisplayListBuilder sub_builder; + sub_builder.ClipRect(SkRect::MakeXYWH(0, 0, 24, 24)); + 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),