@@ -130,6 +130,115 @@ 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+ // Since clip entities return the outer coverage we can only cull axis aligned
165+ // rectangles and intersect clips.
166+ TEST (EntityPassClipStackTest,
167+ AppendLargerClipCoverageWithDifferenceOrNonSquare) {
168+ EntityPassClipStack recorder =
169+ EntityPassClipStack (Rect::MakeLTRB (0 , 0 , 100 , 100 ));
170+
171+ ASSERT_EQ (recorder.GetClipCoverageLayers ().size (), 1u );
172+
173+ // Push a clip.
174+ Entity entity;
175+ EntityPassClipStack::ClipStateResult result = recorder.ApplyClipState (
176+ Contents::ClipCoverage{
177+ .type = Contents::ClipCoverage::Type::kAppend ,
178+ .coverage = Rect::MakeLTRB (50 , 50 , 55 , 55 ),
179+ },
180+ entity, 0 , Point (0 , 0 ));
181+ EXPECT_TRUE (result.should_render );
182+ EXPECT_TRUE (result.clip_did_change );
183+
184+ // Push a clip with larger coverage than the previous state.
185+ result = recorder.ApplyClipState (
186+ Contents::ClipCoverage{
187+ .type = Contents::ClipCoverage::Type::kAppend ,
188+ .is_difference_or_non_square = true ,
189+ .coverage = Rect::MakeLTRB (0 , 0 , 100 , 100 ),
190+ },
191+ entity, 0 , Point (0 , 0 ));
192+
193+ EXPECT_TRUE (result.should_render );
194+ EXPECT_TRUE (result.clip_did_change );
195+ }
196+
197+ TEST (EntityPassClipStackTest, AppendDecreasingSizeClipCoverage) {
198+ EntityPassClipStack recorder =
199+ EntityPassClipStack (Rect::MakeLTRB (0 , 0 , 100 , 100 ));
200+
201+ ASSERT_EQ (recorder.GetClipCoverageLayers ().size (), 1u );
202+
203+ // Push Clips that shrink in size. All should be applied.
204+ Entity entity;
205+
206+ for (auto i = 1 ; i < 20 ; i++) {
207+ EntityPassClipStack::ClipStateResult result = recorder.ApplyClipState (
208+ Contents::ClipCoverage{
209+ .type = Contents::ClipCoverage::Type::kAppend ,
210+ .coverage = Rect::MakeLTRB (i, i, 100 - i, 100 - i),
211+ },
212+ entity, 0 , Point (0 , 0 ));
213+ EXPECT_TRUE (result.should_render );
214+ EXPECT_TRUE (result.clip_did_change );
215+ EXPECT_EQ (recorder.CurrentClipCoverage (),
216+ Rect::MakeLTRB (i, i, 100 - i, 100 - i));
217+ }
218+ }
219+
220+ TEST (EntityPassClipStackTest, AppendIncreasingSizeClipCoverage) {
221+ EntityPassClipStack recorder =
222+ EntityPassClipStack (Rect::MakeLTRB (0 , 0 , 100 , 100 ));
223+
224+ ASSERT_EQ (recorder.GetClipCoverageLayers ().size (), 1u );
225+
226+ // Push Clips that grow in size. All should be skipped.
227+ Entity entity;
228+
229+ for (auto i = 1 ; i < 20 ; i++) {
230+ EntityPassClipStack::ClipStateResult result = recorder.ApplyClipState (
231+ Contents::ClipCoverage{
232+ .type = Contents::ClipCoverage::Type::kAppend ,
233+ .coverage = Rect::MakeLTRB (0 - i, 0 - i, 100 + i, 100 + i),
234+ },
235+ entity, 0 , Point (0 , 0 ));
236+ EXPECT_FALSE (result.should_render );
237+ EXPECT_FALSE (result.clip_did_change );
238+ EXPECT_EQ (recorder.CurrentClipCoverage (), Rect::MakeLTRB (0 , 0 , 100 , 100 ));
239+ }
240+ }
241+
133242TEST (EntityPassClipStackTest, UnbalancedRestore) {
134243 EntityPassClipStack recorder =
135244 EntityPassClipStack (Rect::MakeLTRB (0 , 0 , 100 , 100 ));
0 commit comments