|
11 | 11 | #include "flutter/display_list/display_list_blend_mode.h" |
12 | 12 | #include "flutter/display_list/display_list_builder.h" |
13 | 13 | #include "flutter/display_list/display_list_canvas_recorder.h" |
| 14 | +#include "flutter/display_list/display_list_paint.h" |
14 | 15 | #include "flutter/display_list/display_list_rtree.h" |
15 | 16 | #include "flutter/display_list/display_list_utils.h" |
| 17 | +#include "flutter/fml/logging.h" |
16 | 18 | #include "flutter/fml/math.h" |
17 | 19 | #include "flutter/testing/display_list_testing.h" |
18 | 20 | #include "flutter/testing/testing.h" |
@@ -2565,6 +2567,61 @@ TEST(DisplayList, CollapseMultipleNestedSaveRestore) { |
2565 | 2567 | ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
2566 | 2568 | } |
2567 | 2569 |
|
| 2570 | +TEST(DisplayList, RemoveUnnecessarySaveRestorePairsInSetPaint) { |
| 2571 | + SkRect build_bounds = SkRect::MakeLTRB(-100, -100, 200, 200); |
| 2572 | + SkRect rect = SkRect::MakeLTRB(30, 30, 70, 70); |
| 2573 | + // clang-format off |
| 2574 | + const float alpha_matrix[] = { |
| 2575 | + 0, 0, 0, 0, 0, |
| 2576 | + 0, 1, 0, 0, 0, |
| 2577 | + 0, 0, 1, 0, 0, |
| 2578 | + 0, 0, 0, 0, 1, |
| 2579 | + }; |
| 2580 | + // clang-format on |
| 2581 | + DlMatrixColorFilter alpha_color_filter(alpha_matrix); |
| 2582 | + // Making sure hiding a problematic ColorFilter as an ImageFilter |
| 2583 | + // will generate the same behavior as setting it as a ColorFilter |
| 2584 | + |
| 2585 | + DlColorFilterImageFilter color_filter_image_filter(alpha_color_filter); |
| 2586 | + { |
| 2587 | + DisplayListBuilder builder(build_bounds); |
| 2588 | + builder.save(); |
| 2589 | + DlPaint paint; |
| 2590 | + paint.setImageFilter(&color_filter_image_filter); |
| 2591 | + builder.drawRect(rect, paint); |
| 2592 | + builder.restore(); |
| 2593 | + sk_sp<DisplayList> display_list1 = builder.Build(); |
| 2594 | + |
| 2595 | + DisplayListBuilder builder2(build_bounds); |
| 2596 | + DlPaint paint2; |
| 2597 | + paint2.setImageFilter(&color_filter_image_filter); |
| 2598 | + builder2.drawRect(rect, paint2); |
| 2599 | + sk_sp<DisplayList> display_list2 = builder2.Build(); |
| 2600 | + ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2601 | + } |
| 2602 | + |
| 2603 | + { |
| 2604 | + DisplayListBuilder builder(build_bounds); |
| 2605 | + builder.save(); |
| 2606 | + builder.saveLayer(&build_bounds, true); |
| 2607 | + DlPaint paint; |
| 2608 | + paint.setImageFilter(&color_filter_image_filter); |
| 2609 | + builder.drawRect(rect, paint); |
| 2610 | + builder.restore(); |
| 2611 | + builder.restore(); |
| 2612 | + sk_sp<DisplayList> display_list1 = builder.Build(); |
| 2613 | + |
| 2614 | + DisplayListBuilder builder2(build_bounds); |
| 2615 | + builder2.saveLayer(&build_bounds, true); |
| 2616 | + DlPaint paint2; |
| 2617 | + paint2.setImageFilter(&color_filter_image_filter); |
| 2618 | + builder2.drawRect(rect, paint2); |
| 2619 | + builder2.restore(); |
| 2620 | + sk_sp<DisplayList> display_list2 = builder2.Build(); |
| 2621 | + ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2622 | + } |
| 2623 | +} |
| 2624 | + |
2568 | 2625 | TEST(DisplayList, CollapseNestedSaveAndSaveLayerRestore) { |
2569 | 2626 | // Translate |
2570 | 2627 | { |
|
0 commit comments