| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/flow/testing/mock_layer.h" |
| |
| #include "flutter/flow/testing/layer_test.h" |
| #include "flutter/fml/macros.h" |
| #include "flutter/testing/mock_canvas.h" |
| |
| namespace flutter { |
| namespace testing { |
| |
| using MockLayerTest = LayerTest; |
| |
| #ifndef NDEBUG |
| TEST_F(MockLayerTest, PaintBeforePrerollDies) { |
| SkPath path = SkPath().addRect(5.0f, 6.0f, 20.5f, 21.5f); |
| auto layer = std::make_shared<MockLayer>(path, DlPaint()); |
| |
| EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()), |
| "needs_painting\\(context\\)"); |
| } |
| |
| TEST_F(MockLayerTest, PaintingEmptyLayerDies) { |
| auto layer = std::make_shared<MockLayer>(SkPath(), DlPaint()); |
| |
| layer->Preroll(preroll_context()); |
| EXPECT_EQ(layer->paint_bounds(), SkPath().getBounds()); |
| |
| EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()), |
| "needs_painting\\(context\\)"); |
| } |
| #endif |
| |
| TEST_F(MockLayerTest, SimpleParams) { |
| const SkPath path = SkPath().addRect(5.0f, 6.0f, 20.5f, 21.5f); |
| const DlPaint paint = DlPaint(DlColor::kBlue()); |
| const SkMatrix start_matrix = SkMatrix::Translate(1.0f, 2.0f); |
| const SkMatrix scale_matrix = SkMatrix::Scale(0.5f, 0.5f); |
| const SkMatrix combined_matrix = SkMatrix::Concat(start_matrix, scale_matrix); |
| const SkRect local_cull_rect = SkRect::MakeWH(5.0f, 5.0f); |
| const SkRect device_cull_rect = combined_matrix.mapRect(local_cull_rect); |
| const bool parent_has_platform_view = true; |
| auto layer = std::make_shared<MockLayer>(path, paint); |
| |
| preroll_context()->state_stack.set_preroll_delegate(device_cull_rect, |
| start_matrix); |
| auto mutator = preroll_context()->state_stack.save(); |
| mutator.transform(scale_matrix); |
| preroll_context()->has_platform_view = parent_has_platform_view; |
| layer->Preroll(preroll_context()); |
| EXPECT_EQ(preroll_context()->has_platform_view, false); |
| EXPECT_EQ(layer->paint_bounds(), path.getBounds()); |
| EXPECT_TRUE(layer->needs_painting(paint_context())); |
| EXPECT_EQ(layer->parent_mutators(), std::vector{Mutator(scale_matrix)}); |
| EXPECT_EQ(layer->parent_matrix(), combined_matrix); |
| EXPECT_EQ(layer->parent_cull_rect(), local_cull_rect); |
| EXPECT_EQ(layer->parent_has_platform_view(), parent_has_platform_view); |
| |
| layer->Paint(paint_context()); |
| EXPECT_EQ(mock_canvas().draw_calls(), |
| std::vector({MockCanvas::DrawCall{ |
| 0, MockCanvas::DrawPathData{path, paint}}})); |
| } |
| |
| TEST_F(MockLayerTest, FakePlatformView) { |
| auto layer = std::make_shared<MockLayer>(SkPath(), DlPaint()); |
| layer->set_fake_has_platform_view(true); |
| EXPECT_EQ(preroll_context()->has_platform_view, false); |
| |
| layer->Preroll(preroll_context()); |
| EXPECT_EQ(preroll_context()->has_platform_view, true); |
| } |
| |
| TEST_F(MockLayerTest, SaveLayerOnLeafNodesCanvas) { |
| auto layer = std::make_shared<MockLayer>(SkPath(), DlPaint()); |
| layer->set_fake_has_platform_view(true); |
| EXPECT_EQ(preroll_context()->has_platform_view, false); |
| |
| layer->Preroll(preroll_context()); |
| EXPECT_EQ(preroll_context()->has_platform_view, true); |
| } |
| |
| TEST_F(MockLayerTest, OpacityInheritance) { |
| auto path1 = SkPath().addRect({10, 10, 30, 30}); |
| PrerollContext* context = preroll_context(); |
| |
| auto mock1 = std::make_shared<MockLayer>(path1); |
| mock1->Preroll(context); |
| EXPECT_EQ(context->renderable_state_flags, 0); |
| |
| auto mock2 = MockLayer::MakeOpacityCompatible(path1); |
| mock2->Preroll(context); |
| EXPECT_EQ(context->renderable_state_flags, |
| LayerStateStack::kCallerCanApplyOpacity); |
| } |
| |
| TEST_F(MockLayerTest, FlagGetSet) { |
| auto mock_layer = std::make_shared<MockLayer>(SkPath()); |
| |
| EXPECT_EQ(mock_layer->parent_has_platform_view(), false); |
| mock_layer->set_parent_has_platform_view(true); |
| EXPECT_EQ(mock_layer->parent_has_platform_view(), true); |
| |
| EXPECT_EQ(mock_layer->parent_has_texture_layer(), false); |
| mock_layer->set_parent_has_texture_layer(true); |
| EXPECT_EQ(mock_layer->parent_has_texture_layer(), true); |
| |
| EXPECT_EQ(mock_layer->fake_has_platform_view(), false); |
| mock_layer->set_fake_has_platform_view(true); |
| EXPECT_EQ(mock_layer->fake_has_platform_view(), true); |
| |
| EXPECT_EQ(mock_layer->fake_reads_surface(), false); |
| mock_layer->set_fake_reads_surface(true); |
| EXPECT_EQ(mock_layer->fake_reads_surface(), true); |
| |
| EXPECT_EQ(mock_layer->fake_opacity_compatible(), false); |
| mock_layer->set_fake_opacity_compatible(true); |
| EXPECT_EQ(mock_layer->fake_opacity_compatible(), true); |
| |
| EXPECT_EQ(mock_layer->fake_has_texture_layer(), false); |
| mock_layer->set_fake_has_texture_layer(true); |
| EXPECT_EQ(mock_layer->fake_has_texture_layer(), true); |
| } |
| |
| } // namespace testing |
| } // namespace flutter |