diff --git a/.ci.yaml b/.ci.yaml index 12abdde9297e9..fd3edaee9cca2 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -11,6 +11,7 @@ enabled_branches: - dev - beta - stable + - flutter-2.8-candidate.6 platform_properties: linux: diff --git a/flow/layers/physical_shape_layer.cc b/flow/layers/physical_shape_layer.cc index d443448ed97e6..8215f3d6e592f 100644 --- a/flow/layers/physical_shape_layer.cc +++ b/flow/layers/physical_shape_layer.cc @@ -46,7 +46,8 @@ void PhysicalShapeLayer::Diff(DiffContext* context, const Layer* old_layer) { context->AddLayerBounds(bounds); - if (context->PushCullRect(bounds)) { + // Only push cull rect if there is clip. + if (clip_behavior_ == Clip::none || context->PushCullRect(bounds)) { DiffChildren(context, prev); } context->SetLayerPaintRegion(this, context->CurrentSubtreeRegion()); diff --git a/flow/layers/physical_shape_layer_unittests.cc b/flow/layers/physical_shape_layer_unittests.cc index e81c28080ea53..9a9bafb8f6895 100644 --- a/flow/layers/physical_shape_layer_unittests.cc +++ b/flow/layers/physical_shape_layer_unittests.cc @@ -4,6 +4,7 @@ #include "flutter/flow/layers/physical_shape_layer.h" +#include "flutter/flow/testing/diff_context_test.h" #include "flutter/flow/testing/layer_test.h" #include "flutter/flow/testing/mock_layer.h" #include "flutter/fml/macros.h" @@ -350,5 +351,43 @@ TEST_F(PhysicalShapeLayerTest, Readback) { EXPECT_TRUE(ReadbackResult(context, save_layer, reader, true)); } +using PhysicalShapeLayerDiffTest = DiffContextTest; + +TEST_F(PhysicalShapeLayerDiffTest, NoClipPaintRegion) { + MockLayerTree tree1; + const SkPath layer_path = SkPath().addRect(SkRect::MakeXYWH(0, 0, 100, 100)); + auto layer = + std::make_shared(SK_ColorGREEN, SK_ColorBLACK, + 0.0f, // elevation + layer_path, Clip::none); + + const SkPath layer_path2 = + SkPath().addRect(SkRect::MakeXYWH(200, 200, 200, 200)); + auto layer2 = std::make_shared(layer_path2); + layer->Add(layer2); + tree1.root()->Add(layer); + + auto damage = DiffLayerTree(tree1, MockLayerTree()); + EXPECT_EQ(damage.frame_damage, SkIRect::MakeLTRB(0, 0, 400, 400)); +} + +TEST_F(PhysicalShapeLayerDiffTest, ClipPaintRegion) { + MockLayerTree tree1; + const SkPath layer_path = SkPath().addRect(SkRect::MakeXYWH(0, 0, 100, 100)); + auto layer = + std::make_shared(SK_ColorGREEN, SK_ColorBLACK, + 0.0f, // elevation + layer_path, Clip::hardEdge); + + const SkPath layer_path2 = + SkPath().addRect(SkRect::MakeXYWH(200, 200, 200, 200)); + auto layer2 = std::make_shared(layer_path2); + layer->Add(layer2); + tree1.root()->Add(layer); + + auto damage = DiffLayerTree(tree1, MockLayerTree()); + EXPECT_EQ(damage.frame_damage, SkIRect::MakeLTRB(0, 0, 100, 100)); +} + } // namespace testing } // namespace flutter