Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 84d95de

Browse files
committed
Fix clip scissor bug
1 parent e14b8c8 commit 84d95de

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

impeller/display_list/aiks_dl_unittests.cc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,5 +890,39 @@ TEST_P(AiksTest, DispatcherDoesNotCullPerspectiveTransformedChildDisplayLists) {
890890
ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
891891
}
892892

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+
893927
} // namespace testing
894928
} // namespace impeller

impeller/entity/entity_pass.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,8 +780,7 @@ bool EntityPass::RenderElement(Entity& element_entity,
780780
// applied.
781781
auto& replay_entities = clip_coverage_stack.GetReplayEntities();
782782
for (const auto& replay : replay_entities) {
783-
SetClipScissor(clip_coverage_stack.CurrentClipCoverage(), *result.pass,
784-
global_pass_position);
783+
SetClipScissor(replay.clip_coverage, *result.pass, global_pass_position);
785784
if (!replay.entity.Render(renderer, *result.pass)) {
786785
VALIDATION_LOG << "Failed to render entity for clip restore.";
787786
}

0 commit comments

Comments
 (0)