@@ -130,6 +130,82 @@ TEST(EntityPassClipStackTest, AppendAndRestoreClipCoverage) {
130130 EXPECT_EQ (recorder.GetReplayEntities ().size (), 0u );
131131}
132132
133+ // Append two clip coverages, the second is larger the first. This
134+ // should result in the second clip not requiring any update.
135+ TEST (EntityPassClipStackTest, AppendLargerClipCoverage) {
136+ EntityPassClipStack recorder =
137+ EntityPassClipStack (Rect::MakeLTRB (0 , 0 , 100 , 100 ));
138+
139+ ASSERT_EQ (recorder.GetClipCoverageLayers ().size (), 1u );
140+
141+ // Push a clip.
142+ Entity entity;
143+ EntityPassClipStack::ClipStateResult result = recorder.ApplyClipState (
144+ Contents::ClipCoverage{
145+ .type = Contents::ClipCoverage::Type::kAppend ,
146+ .coverage = Rect::MakeLTRB (50 , 50 , 55 , 55 ),
147+ },
148+ entity, 0 , Point (0 , 0 ));
149+ EXPECT_TRUE (result.should_render );
150+ EXPECT_TRUE (result.clip_did_change );
151+
152+ // Push a clip with larger coverage than the previous state.
153+ result = recorder.ApplyClipState (
154+ Contents::ClipCoverage{
155+ .type = Contents::ClipCoverage::Type::kAppend ,
156+ .coverage = Rect::MakeLTRB (0 , 0 , 100 , 100 ),
157+ },
158+ entity, 0 , Point (0 , 0 ));
159+
160+ EXPECT_FALSE (result.should_render );
161+ EXPECT_FALSE (result.clip_did_change );
162+ }
163+
164+ TEST (EntityPassClipStackTest, AppendDecreasingSizeClipCoverage) {
165+ EntityPassClipStack recorder =
166+ EntityPassClipStack (Rect::MakeLTRB (0 , 0 , 100 , 100 ));
167+
168+ ASSERT_EQ (recorder.GetClipCoverageLayers ().size (), 1u );
169+
170+ // Push Clips that shrink in size. All should be applied.
171+ Entity entity;
172+
173+ for (auto i = 1 ; i < 20 ; i++) {
174+ EntityPassClipStack::ClipStateResult result = recorder.ApplyClipState (
175+ Contents::ClipCoverage{
176+ .type = Contents::ClipCoverage::Type::kAppend ,
177+ .coverage = Rect::MakeLTRB (i, i, 100 - i, 100 - i),
178+ },
179+ entity, 0 , Point (0 , 0 ));
180+ EXPECT_TRUE (result.should_render );
181+ EXPECT_TRUE (result.clip_did_change );
182+ EXPECT_EQ (recorder.CurrentClipCoverage (),
183+ Rect::MakeLTRB (i, i, 100 - i, 100 - i));
184+ }
185+ }
186+
187+ TEST (EntityPassClipStackTest, AppendIncreasingSizeClipCoverage) {
188+ EntityPassClipStack recorder =
189+ EntityPassClipStack (Rect::MakeLTRB (0 , 0 , 100 , 100 ));
190+
191+ ASSERT_EQ (recorder.GetClipCoverageLayers ().size (), 1u );
192+
193+ // Push Clips that grow in size. All should be skipped.
194+ Entity entity;
195+
196+ for (auto i = 1 ; i < 20 ; i++) {
197+ EntityPassClipStack::ClipStateResult result = recorder.ApplyClipState (
198+ Contents::ClipCoverage{
199+ .type = Contents::ClipCoverage::Type::kAppend ,
200+ .coverage = Rect::MakeLTRB (0 - i, 0 - i, 100 + i, 100 + i),
201+ },
202+ entity, 0 , Point (0 , 0 ));
203+ EXPECT_FALSE (result.should_render );
204+ EXPECT_FALSE (result.clip_did_change );
205+ EXPECT_EQ (recorder.CurrentClipCoverage (), Rect::MakeLTRB (0 , 0 , 100 , 100 ));
206+ }
207+ }
208+
133209TEST (EntityPassClipStackTest, UnbalancedRestore) {
134210 EntityPassClipStack recorder =
135211 EntityPassClipStack (Rect::MakeLTRB (0 , 0 , 100 , 100 ));
0 commit comments