Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit a1ea6c0

Browse files
committed
fix some logic; Add some testcases
1 parent afad8b4 commit a1ea6c0

File tree

2 files changed

+174
-21
lines changed

2 files changed

+174
-21
lines changed

display_list/display_list_builder.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,7 @@ void DisplayListBuilder::transformFullPerspective(
581581
SkScalarsAreFinite(myx, myy) && SkScalarsAreFinite(myz, myt) &&
582582
SkScalarsAreFinite(mzx, mzy) && SkScalarsAreFinite(mzz, mzt) &&
583583
SkScalarsAreFinite(mwx, mwy) && SkScalarsAreFinite(mwz, mwt)) {
584+
checkForDeferredSave();
584585
Push<TransformFullPerspectiveOp>(0, 1,
585586
mxx, mxy, mxz, mxt,
586587
myx, myy, myz, myt,
@@ -594,6 +595,7 @@ void DisplayListBuilder::transformFullPerspective(
594595
}
595596
// clang-format on
596597
void DisplayListBuilder::transformReset() {
598+
checkForDeferredSave();
597599
Push<TransformResetOp>(0, 0);
598600
current_layer_->matrix.setIdentity();
599601
}
@@ -632,10 +634,10 @@ void DisplayListBuilder::clipRect(const SkRect& rect,
632634
void DisplayListBuilder::clipRRect(const SkRRect& rrect,
633635
SkClipOp clip_op,
634636
bool is_aa) {
635-
checkForDeferredSave();
636637
if (rrect.isRect()) {
637638
clipRect(rrect.rect(), clip_op, is_aa);
638639
} else {
640+
checkForDeferredSave();
639641
switch (clip_op) {
640642
case SkClipOp::kIntersect:
641643
Push<ClipIntersectRRectOp>(0, 1, rrect, is_aa);
@@ -650,7 +652,6 @@ void DisplayListBuilder::clipRRect(const SkRRect& rrect,
650652
void DisplayListBuilder::clipPath(const SkPath& path,
651653
SkClipOp clip_op,
652654
bool is_aa) {
653-
checkForDeferredSave();
654655
if (!path.isInverseFillType()) {
655656
SkRect rect;
656657
if (path.isRect(&rect)) {
@@ -668,6 +669,7 @@ void DisplayListBuilder::clipPath(const SkPath& path,
668669
return;
669670
}
670671
}
672+
checkForDeferredSave();
671673
switch (clip_op) {
672674
case SkClipOp::kIntersect:
673675
Push<ClipIntersectPathOp>(0, 1, path, is_aa);

display_list/display_list_unittests.cc

Lines changed: 170 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// found in the LICENSE file.
44

55
#include <memory>
6+
#include <string>
7+
#include <unordered_set>
8+
#include <vector>
69

710
#include "flutter/display_list/display_list.h"
811
#include "flutter/display_list/display_list_blend_mode.h"
@@ -2563,27 +2566,175 @@ TEST(DisplayList, CollapseMultipleNestedSaveRestore) {
25632566
}
25642567

25652568
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();
25762581

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();
25852590

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+
}
25872738
}
25882739

25892740
TEST(DisplayList, RTreeOfClippedSaveLayerFilterScene) {

0 commit comments

Comments
 (0)