|
3 | 3 | // found in the LICENSE file. |
4 | 4 |
|
5 | 5 | #include <memory> |
| 6 | +#include <string> |
| 7 | +#include <unordered_set> |
| 8 | +#include <vector> |
6 | 9 |
|
7 | 10 | #include "flutter/display_list/display_list.h" |
8 | 11 | #include "flutter/display_list/display_list_blend_mode.h" |
@@ -2563,27 +2566,175 @@ TEST(DisplayList, CollapseMultipleNestedSaveRestore) { |
2563 | 2566 | } |
2564 | 2567 |
|
2565 | 2568 | TEST(DisplayList, CollapseNestedSaveAndSaveLayerRestore) { |
2566 | | - DisplayListBuilder builder1; |
2567 | | - builder1.save(); |
2568 | | - builder1.saveLayer(nullptr, false); |
2569 | | - builder1.translate(10, 10); |
2570 | | - builder1.scale(2, 2); |
2571 | | - builder1.clipRect({10, 10, 20, 20}, SkClipOp::kIntersect, false); |
2572 | | - builder1.drawRect({0, 0, 100, 100}); |
2573 | | - builder1.restore(); |
2574 | | - builder1.restore(); |
2575 | | - auto display_list1 = builder1.Build(); |
| 2569 | + // Translate |
| 2570 | + { |
| 2571 | + DisplayListBuilder builder1; |
| 2572 | + builder1.save(); |
| 2573 | + builder1.saveLayer(nullptr, false); |
| 2574 | + builder1.translate(10, 10); |
| 2575 | + builder1.scale(2, 2); |
| 2576 | + builder1.clipRect({10, 10, 20, 20}, SkClipOp::kIntersect, false); |
| 2577 | + builder1.drawRect({0, 0, 100, 100}); |
| 2578 | + builder1.restore(); |
| 2579 | + builder1.restore(); |
| 2580 | + auto display_list1 = builder1.Build(); |
2576 | 2581 |
|
2577 | | - DisplayListBuilder builder2; |
2578 | | - builder2.saveLayer(nullptr, false); |
2579 | | - builder2.translate(10, 10); |
2580 | | - builder2.scale(2, 2); |
2581 | | - builder2.clipRect({10, 10, 20, 20}, SkClipOp::kIntersect, false); |
2582 | | - builder2.drawRect({0, 0, 100, 100}); |
2583 | | - builder2.restore(); |
2584 | | - auto display_list2 = builder2.Build(); |
| 2582 | + DisplayListBuilder builder2; |
| 2583 | + builder2.saveLayer(nullptr, false); |
| 2584 | + builder2.translate(10, 10); |
| 2585 | + builder2.scale(2, 2); |
| 2586 | + builder2.clipRect({10, 10, 20, 20}, SkClipOp::kIntersect, false); |
| 2587 | + builder2.drawRect({0, 0, 100, 100}); |
| 2588 | + builder2.restore(); |
| 2589 | + auto display_list2 = builder2.Build(); |
2585 | 2590 |
|
2586 | | - ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2591 | + ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2592 | + } |
| 2593 | + // Transform |
| 2594 | + { |
| 2595 | + DisplayListBuilder builder1; |
| 2596 | + builder1.save(); |
| 2597 | + builder1.save(); |
| 2598 | + builder1.transform(SkM44::Translate(10, 100)); |
| 2599 | + builder1.drawRect({0, 0, 100, 100}); |
| 2600 | + builder1.restore(); |
| 2601 | + builder1.transform(SkM44::Translate(10, 100)); |
| 2602 | + builder1.drawRect({0, 0, 100, 100}); |
| 2603 | + builder1.restore(); |
| 2604 | + auto display_list1 = builder1.Build(); |
| 2605 | + |
| 2606 | + DisplayListBuilder builder2; |
| 2607 | + builder2.save(); |
| 2608 | + builder2.transform(SkM44::Translate(10, 100)); |
| 2609 | + builder2.drawRect({0, 0, 100, 100}); |
| 2610 | + builder2.restore(); |
| 2611 | + builder2.save(); |
| 2612 | + builder2.transform(SkM44::Translate(10, 100)); |
| 2613 | + builder2.drawRect({0, 0, 100, 100}); |
| 2614 | + builder2.restore(); |
| 2615 | + auto display_list2 = builder2.Build(); |
| 2616 | + |
| 2617 | + ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2618 | + } |
| 2619 | + // Skew |
| 2620 | + { |
| 2621 | + DisplayListBuilder builder1; |
| 2622 | + builder1.save(); |
| 2623 | + builder1.save(); |
| 2624 | + builder1.skew(10, 10); |
| 2625 | + builder1.drawRect({0, 0, 100, 100}); |
| 2626 | + builder1.restore(); |
| 2627 | + auto display_list1 = builder1.Build(); |
| 2628 | + |
| 2629 | + DisplayListBuilder builder2; |
| 2630 | + builder2.save(); |
| 2631 | + builder2.skew(10, 10); |
| 2632 | + builder2.drawRect({0, 0, 100, 100}); |
| 2633 | + builder2.restore(); |
| 2634 | + auto display_list2 = builder2.Build(); |
| 2635 | + |
| 2636 | + ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2637 | + } |
| 2638 | + |
| 2639 | + // Scale |
| 2640 | + { |
| 2641 | + DisplayListBuilder builder1; |
| 2642 | + builder1.save(); |
| 2643 | + builder1.save(); |
| 2644 | + builder1.scale(0.5, 0.5); |
| 2645 | + builder1.drawRect({0, 0, 100, 100}); |
| 2646 | + builder1.restore(); |
| 2647 | + auto display_list1 = builder1.Build(); |
| 2648 | + |
| 2649 | + DisplayListBuilder builder2; |
| 2650 | + builder2.save(); |
| 2651 | + builder2.scale(0.5, 0.5); |
| 2652 | + builder2.drawRect({0, 0, 100, 100}); |
| 2653 | + builder2.restore(); |
| 2654 | + auto display_list2 = builder2.Build(); |
| 2655 | + |
| 2656 | + ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2657 | + } |
| 2658 | + |
| 2659 | + { |
| 2660 | + DisplayListBuilder builder1; |
| 2661 | + builder1.save(); |
| 2662 | + builder1.save(); |
| 2663 | + builder1.transform(SkM44()); |
| 2664 | + builder1.drawRect({0, 0, 100, 100}); |
| 2665 | + builder1.restore(); |
| 2666 | + builder1.transform(SkM44()); |
| 2667 | + builder1.drawRect({0, 0, 100, 100}); |
| 2668 | + builder1.restore(); |
| 2669 | + auto display_list1 = builder1.Build(); |
| 2670 | + |
| 2671 | + DisplayListBuilder builder2; |
| 2672 | + builder2.drawRect({0, 0, 100, 100}); |
| 2673 | + builder2.drawRect({0, 0, 100, 100}); |
| 2674 | + auto display_list2 = builder2.Build(); |
| 2675 | + |
| 2676 | + ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2677 | + } |
| 2678 | + // Clip |
| 2679 | + { |
| 2680 | + DisplayListBuilder builder1; |
| 2681 | + builder1.save(); |
| 2682 | + builder1.save(); |
| 2683 | + builder1.clipRect(SkRect::MakeLTRB(0, 0, 100, 100), SkClipOp::kIntersect, |
| 2684 | + true); |
| 2685 | + builder1.drawRect({0, 0, 100, 100}); |
| 2686 | + builder1.restore(); |
| 2687 | + builder1.transform(SkM44()); |
| 2688 | + builder1.drawRect({0, 0, 100, 100}); |
| 2689 | + builder1.restore(); |
| 2690 | + auto display_list1 = builder1.Build(); |
| 2691 | + |
| 2692 | + DisplayListBuilder builder2; |
| 2693 | + builder2.save(); |
| 2694 | + builder2.clipRect(SkRect::MakeLTRB(0, 0, 100, 100), SkClipOp::kIntersect, |
| 2695 | + true); |
| 2696 | + builder2.drawRect({0, 0, 100, 100}); |
| 2697 | + builder2.restore(); |
| 2698 | + builder2.transform(SkM44()); |
| 2699 | + builder2.drawRect({0, 0, 100, 100}); |
| 2700 | + auto display_list2 = builder2.Build(); |
| 2701 | + |
| 2702 | + ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2703 | + } |
| 2704 | + |
| 2705 | + std::unordered_set<std::string> function_names = {"Translate", |
| 2706 | + "Scale", |
| 2707 | + "Skew", |
| 2708 | + "Transform2d", |
| 2709 | + "TransformFullPerspective", |
| 2710 | + "ClipRect", |
| 2711 | + "ClipPath", |
| 2712 | + "ClipRRect"}; |
| 2713 | + |
| 2714 | + for (auto& group : allGroups) { |
| 2715 | + if (function_names.find(group.op_name) == function_names.cend()) { |
| 2716 | + continue; |
| 2717 | + } |
| 2718 | + for (size_t i = 0; i < group.variants.size(); i++) { |
| 2719 | + auto& invocation = group.variants[i]; |
| 2720 | + DisplayListBuilder builder1; |
| 2721 | + builder1.save(); |
| 2722 | + builder1.save(); |
| 2723 | + invocation.invoker(builder1); |
| 2724 | + builder1.drawRect({0, 0, 100, 100}); |
| 2725 | + builder1.restore(); |
| 2726 | + |
| 2727 | + auto display_list1 = builder1.Build(); |
| 2728 | + |
| 2729 | + DisplayListBuilder builder2; |
| 2730 | + builder2.save(); |
| 2731 | + invocation.invoker(builder2); |
| 2732 | + builder2.drawRect({0, 0, 100, 100}); |
| 2733 | + builder2.restore(); |
| 2734 | + auto display_list2 = builder2.Build(); |
| 2735 | + ASSERT_TRUE(DisplayListsEQ_Verbose(display_list1, display_list2)); |
| 2736 | + } |
| 2737 | + } |
2587 | 2738 | } |
2588 | 2739 |
|
2589 | 2740 | TEST(DisplayList, RTreeOfClippedSaveLayerFilterScene) { |
|
0 commit comments