@@ -532,13 +532,13 @@ TEST_F(DisplayListTest, UnclippedSaveLayerContentAccountsForFilter) {
532
532
builder.Restore ();
533
533
auto display_list = builder.Build ();
534
534
535
- ASSERT_EQ (display_list->op_count (), 6u );
535
+ EXPECT_EQ (display_list->op_count (), 6u );
536
536
EXPECT_EQ (display_list->total_depth (), 2u );
537
537
538
538
SkRect result_rect = draw_rect.makeOutset (30 .0f , 30 .0f );
539
539
ASSERT_TRUE (result_rect.intersect (clip_rect));
540
540
ASSERT_EQ (result_rect, SkRect::MakeLTRB (100 .0f , 110 .0f , 131 .0f , 190 .0f ));
541
- ASSERT_EQ (display_list->bounds (), result_rect);
541
+ EXPECT_EQ (display_list->bounds (), result_rect);
542
542
}
543
543
544
544
TEST_F (DisplayListTest, ClippedSaveLayerContentAccountsForFilter) {
@@ -565,13 +565,72 @@ TEST_F(DisplayListTest, ClippedSaveLayerContentAccountsForFilter) {
565
565
builder.Restore ();
566
566
auto display_list = builder.Build ();
567
567
568
- ASSERT_EQ (display_list->op_count (), 6u );
568
+ EXPECT_EQ (display_list->op_count (), 6u );
569
569
EXPECT_EQ (display_list->total_depth (), 2u );
570
570
571
571
SkRect result_rect = draw_rect.makeOutset (30 .0f , 30 .0f );
572
572
ASSERT_TRUE (result_rect.intersect (clip_rect));
573
573
ASSERT_EQ (result_rect, SkRect::MakeLTRB (100 .0f , 110 .0f , 129 .0f , 190 .0f ));
574
- ASSERT_EQ (display_list->bounds (), result_rect);
574
+ EXPECT_EQ (display_list->bounds (), result_rect);
575
+ }
576
+
577
+ TEST_F (DisplayListTest, OOBSaveLayerContentCulledWithBlurFilter) {
578
+ SkRect cull_rect = SkRect::MakeLTRB (100 .0f , 100 .0f , 200 .0f , 200 .0f );
579
+ SkRect draw_rect = SkRect::MakeLTRB (25 .0f , 25 .0f , 99 .0f , 75 .0f );
580
+ auto filter = DlBlurImageFilter::Make (10 .0f , 10 .0f , DlTileMode::kDecal );
581
+ DlPaint layer_paint = DlPaint ().setImageFilter (filter);
582
+
583
+ // We want a draw rect that is outside the layer bounds even though its
584
+ // filtered output might be inside. The drawn rect should be culled by
585
+ // the expectations of the layer bounds even though it is close enough
586
+ // to be visible due to filtering.
587
+ ASSERT_FALSE (cull_rect.intersects (draw_rect));
588
+ SkRect mapped_rect;
589
+ ASSERT_TRUE (filter->map_local_bounds (draw_rect, mapped_rect));
590
+ ASSERT_TRUE (mapped_rect.intersects (cull_rect));
591
+
592
+ DisplayListBuilder builder;
593
+ builder.SaveLayer (&cull_rect, &layer_paint);
594
+ { //
595
+ builder.DrawRect (draw_rect, DlPaint ());
596
+ }
597
+ builder.Restore ();
598
+ auto display_list = builder.Build ();
599
+
600
+ EXPECT_EQ (display_list->op_count (), 2u );
601
+ EXPECT_EQ (display_list->total_depth (), 1u );
602
+
603
+ EXPECT_TRUE (display_list->bounds ().isEmpty ()) << display_list->bounds ();
604
+ }
605
+
606
+ TEST_F (DisplayListTest, OOBSaveLayerContentCulledWithMatrixFilter) {
607
+ SkRect cull_rect = SkRect::MakeLTRB (100 .0f , 100 .0f , 200 .0f , 200 .0f );
608
+ SkRect draw_rect = SkRect::MakeLTRB (25 .0f , 125 .0f , 75 .0f , 175 .0f );
609
+ auto filter = DlMatrixImageFilter::Make (SkMatrix::Translate (100 .0f , 0 .0f ),
610
+ DlImageSampling::kLinear );
611
+ DlPaint layer_paint = DlPaint ().setImageFilter (filter);
612
+
613
+ // We want a draw rect that is outside the layer bounds even though its
614
+ // filtered output might be inside. The drawn rect should be culled by
615
+ // the expectations of the layer bounds even though it is close enough
616
+ // to be visible due to filtering.
617
+ ASSERT_FALSE (cull_rect.intersects (draw_rect));
618
+ SkRect mapped_rect;
619
+ ASSERT_TRUE (filter->map_local_bounds (draw_rect, mapped_rect));
620
+ ASSERT_TRUE (mapped_rect.intersects (cull_rect));
621
+
622
+ DisplayListBuilder builder;
623
+ builder.SaveLayer (&cull_rect, &layer_paint);
624
+ { //
625
+ builder.DrawRect (draw_rect, DlPaint ());
626
+ }
627
+ builder.Restore ();
628
+ auto display_list = builder.Build ();
629
+
630
+ EXPECT_EQ (display_list->op_count (), 2u );
631
+ EXPECT_EQ (display_list->total_depth (), 1u );
632
+
633
+ EXPECT_TRUE (display_list->bounds ().isEmpty ()) << display_list->bounds ();
575
634
}
576
635
577
636
TEST_F (DisplayListTest, SingleOpSizes) {
@@ -1144,14 +1203,33 @@ TEST_F(DisplayListTest, SingleOpsMightSupportGroupOpacityBlendMode) {
1144
1203
1145
1204
TEST_F (DisplayListTest, OverlappingOpsDoNotSupportGroupOpacity) {
1146
1205
DisplayListBuilder builder;
1147
- DlOpReceiver& receiver = ToReceiver (builder);
1148
1206
for (int i = 0 ; i < 10 ; i++) {
1149
- receiver. drawRect (SkRect::MakeXYWH (i * 10 , 0 , 30 , 30 ));
1207
+ builder. DrawRect (SkRect::MakeXYWH (i * 10 , 0 , 30 , 30 ), DlPaint ( ));
1150
1208
}
1151
1209
auto display_list = builder.Build ();
1152
1210
EXPECT_FALSE (display_list->can_apply_group_opacity ());
1153
1211
}
1154
1212
1213
+ TEST_F (DisplayListTest, LineOfNonOverlappingOpsSupportGroupOpacity) {
1214
+ DisplayListBuilder builder;
1215
+ for (int i = 0 ; i < 10 ; i++) {
1216
+ builder.DrawRect (SkRect::MakeXYWH (i * 30 , 0 , 30 , 30 ), DlPaint ());
1217
+ }
1218
+ auto display_list = builder.Build ();
1219
+ EXPECT_TRUE (display_list->can_apply_group_opacity ());
1220
+ }
1221
+
1222
+ TEST_F (DisplayListTest, CrossOfNonOverlappingOpsSupportGroupOpacity) {
1223
+ DisplayListBuilder builder;
1224
+ builder.DrawRect (SkRect::MakeLTRB (200 , 200 , 300 , 300 ), DlPaint ()); // center
1225
+ builder.DrawRect (SkRect::MakeLTRB (100 , 200 , 200 , 300 ), DlPaint ()); // left
1226
+ builder.DrawRect (SkRect::MakeLTRB (200 , 100 , 300 , 200 ), DlPaint ()); // above
1227
+ builder.DrawRect (SkRect::MakeLTRB (300 , 200 , 400 , 300 ), DlPaint ()); // right
1228
+ builder.DrawRect (SkRect::MakeLTRB (200 , 300 , 300 , 400 ), DlPaint ()); // below
1229
+ auto display_list = builder.Build ();
1230
+ EXPECT_TRUE (display_list->can_apply_group_opacity ());
1231
+ }
1232
+
1155
1233
TEST_F (DisplayListTest, SaveLayerFalseSupportsGroupOpacityOverlappingChidren) {
1156
1234
DisplayListBuilder builder;
1157
1235
DlOpReceiver& receiver = ToReceiver (builder);
@@ -1248,7 +1326,8 @@ class SaveLayerOptionsExpector : public virtual DlOpReceiver,
1248
1326
void saveLayer (const SkRect& bounds,
1249
1327
const SaveLayerOptions options,
1250
1328
const DlImageFilter* backdrop) override {
1251
- EXPECT_EQ (options, expected_[save_layer_count_]);
1329
+ EXPECT_EQ (options, expected_[save_layer_count_])
1330
+ << " index " << save_layer_count_;
1252
1331
save_layer_count_++;
1253
1332
}
1254
1333
@@ -3858,7 +3937,7 @@ TEST_F(DisplayListTest, SaveContentDepthTest) {
3858
3937
3859
3938
builder.Save (); // covers depth 1->9
3860
3939
{
3861
- builder.Translate (5 , 5 );
3940
+ builder.Translate (5 , 5 ); // triggers deferred save at depth 1
3862
3941
builder.DrawRect ({10 , 10 , 20 , 20 }, DlPaint ()); // depth 2
3863
3942
3864
3943
builder.DrawDisplayList (child, 1 .0f ); // depth 3 (content) + 4 (self)
@@ -3868,12 +3947,12 @@ TEST_F(DisplayListTest, SaveContentDepthTest) {
3868
3947
builder.DrawRect ({12 , 12 , 22 , 22 }, DlPaint ()); // depth 5
3869
3948
builder.DrawRect ({14 , 14 , 24 , 24 }, DlPaint ()); // depth 6
3870
3949
}
3871
- builder.Restore (); // layer is restored with depth 7
3950
+ builder.Restore (); // layer is restored with depth 6
3872
3951
3873
3952
builder.DrawRect ({16 , 16 , 26 , 26 }, DlPaint ()); // depth 8
3874
3953
builder.DrawRect ({18 , 18 , 28 , 28 }, DlPaint ()); // depth 9
3875
3954
}
3876
- builder.Restore ();
3955
+ builder.Restore (); // save is restored with depth 9
3877
3956
3878
3957
builder.DrawRect ({16 , 16 , 26 , 26 }, DlPaint ()); // depth 10
3879
3958
builder.DrawRect ({18 , 18 , 28 , 28 }, DlPaint ()); // depth 11
0 commit comments