Flutter Engine
 
Loading...
Searching...
No Matches
texture_layer_unittests.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
11#include "flutter/fml/macros.h"
13
14namespace flutter {
15namespace testing {
16
18
19TEST_F(TextureLayerTest, InvalidTexture) {
20 const DlPoint layer_offset = DlPoint(0.0f, 0.0f);
21 const DlSize layer_size = DlSize(8.0f, 8.0f);
22 auto layer = std::make_shared<TextureLayer>(
23 layer_offset, layer_size, 0, false, DlImageSampling::kNearestNeighbor);
24
25 layer->Preroll(preroll_context());
26 EXPECT_EQ(layer->paint_bounds(),
27 DlRect::MakeOriginSize(layer_offset, layer_size));
28 EXPECT_TRUE(layer->needs_painting(paint_context()));
29
30 layer->Paint(display_list_paint_context());
31 EXPECT_TRUE(display_list()->Equals(DisplayList()));
32}
33
34#ifndef NDEBUG
35TEST_F(TextureLayerTest, PaintingEmptyLayerDies) {
36 const DlPoint layer_offset = DlPoint(0.0f, 0.0f);
37 const DlSize layer_size = DlSize(0.0f, 0.0f);
38 const int64_t texture_id = 0;
39 auto mock_texture = std::make_shared<MockTexture>(texture_id);
40 auto layer =
41 std::make_shared<TextureLayer>(layer_offset, layer_size, texture_id,
43
44 // Ensure the texture is located by the Layer.
45 preroll_context()->texture_registry->RegisterTexture(mock_texture);
46
47 layer->Preroll(preroll_context());
48 EXPECT_EQ(layer->paint_bounds(), DlRect());
49 EXPECT_FALSE(layer->needs_painting(paint_context()));
50
51 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
52 "needs_painting\\(context\\)");
53}
54
55TEST_F(TextureLayerTest, PaintBeforePrerollDies) {
56 const DlPoint layer_offset = DlPoint(0.0f, 0.0f);
57 const DlSize layer_size = DlSize(8.0f, 8.0f);
58 const int64_t texture_id = 0;
59 auto mock_texture = std::make_shared<MockTexture>(texture_id);
60 auto layer = std::make_shared<TextureLayer>(
61 layer_offset, layer_size, texture_id, false, DlImageSampling::kLinear);
62
63 // Ensure the texture is located by the Layer.
64 preroll_context()->texture_registry->RegisterTexture(mock_texture);
65
66 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
67 "needs_painting\\(context\\)");
68}
69#endif
70
71TEST_F(TextureLayerTest, PaintingWithLinearSampling) {
72 const DlPoint layer_offset = DlPoint(0.0f, 0.0f);
73 const DlSize layer_size = DlSize(8.0f, 8.0f);
74 const DlRect layer_bounds = DlRect::MakeOriginSize(layer_offset, layer_size);
75 const int64_t texture_id = 0;
76 const auto texture_image = MockTexture::MakeTestTexture(20, 20, 5);
77 auto mock_texture = std::make_shared<MockTexture>(texture_id, texture_image);
78 auto layer = std::make_shared<TextureLayer>(
79 layer_offset, layer_size, texture_id, false, DlImageSampling::kLinear);
80
81 // Ensure the texture is located by the Layer.
82 preroll_context()->texture_registry->RegisterTexture(mock_texture);
83
84 layer->Preroll(preroll_context());
85 EXPECT_EQ(layer->paint_bounds(), layer_bounds);
86 EXPECT_TRUE(layer->needs_painting(paint_context()));
87
88 layer->Paint(display_list_paint_context());
89 DisplayListBuilder expected_builder;
90 /* (Texture)layer::Paint */ {
91 expected_builder.DrawImageRect(texture_image, layer_bounds,
93 }
94 EXPECT_TRUE(DisplayListsEQ_Verbose(display_list(), expected_builder.Build()));
95}
96
98
99TEST_F(TextureLayerDiffTest, TextureInRetainedLayer) {
100 MockLayerTree tree1;
101 auto container = std::make_shared<ContainerLayer>();
102 tree1.root()->Add(container);
103 auto layer = std::make_shared<TextureLayer>(DlPoint(), DlSize(100, 100), 0,
105 container->Add(layer);
106
107 MockLayerTree tree2;
108 tree2.root()->Add(container); // retained layer
109
110 auto damage = DiffLayerTree(tree1, MockLayerTree());
111 EXPECT_EQ(damage.frame_damage, DlIRect::MakeLTRB(0, 0, 100, 100));
112
113 damage = DiffLayerTree(tree2, tree1);
114 EXPECT_EQ(damage.frame_damage, DlIRect::MakeLTRB(0, 0, 100, 100));
115}
116
117TEST_F(TextureLayerTest, OpacityInheritance) {
118 const DlPoint layer_offset = DlPoint();
119 const DlSize layer_size = DlSize(8.0f, 8.0f);
120 const DlRect layer_bounds = DlRect::MakeOriginSize(layer_offset, layer_size);
121 const int64_t texture_id = 0;
122 const auto texture_image = MockTexture::MakeTestTexture(20, 20, 5);
123 auto mock_texture = std::make_shared<MockTexture>(texture_id, texture_image);
124 uint8_t alpha = 0x7f;
125 auto texture_layer = std::make_shared<TextureLayer>(
126 layer_offset, layer_size, texture_id, false, DlImageSampling::kLinear);
127 auto layer = std::make_shared<OpacityLayer>(alpha, DlPoint());
128 layer->Add(texture_layer);
129
130 // Ensure the texture is located by the Layer.
131 PrerollContext* context = preroll_context();
132 context->texture_registry->RegisterTexture(mock_texture);
133
134 // The texture layer always reports opacity compatibility.
135 texture_layer->Preroll(context);
136 EXPECT_EQ(context->renderable_state_flags,
138
139 // Reset has_texture_layer since it is not supposed to be sent as we
140 // descend a tree in Preroll, but it was set by the previous test.
141 context->has_texture_layer = false;
142 layer->Preroll(context);
143 EXPECT_EQ(context->renderable_state_flags,
145
146 DlPaint texture_paint;
147 texture_paint.setAlpha(alpha);
148
149 layer->Paint(display_list_paint_context());
150 DisplayListBuilder expected_builder;
151 /* (Opacity)layer::Paint */ {
152 expected_builder.Save();
153 {
154 /* texture_layer::Paint */ {
155 expected_builder.DrawImageRect(texture_image, layer_bounds,
157 &texture_paint);
158 }
159 }
160 expected_builder.Restore();
161 }
162 EXPECT_TRUE(DisplayListsEQ_Verbose(display_list(), expected_builder.Build()));
163}
164
165} // namespace testing
166} // namespace flutter
virtual void Add(std::shared_ptr< Layer > layer)
void DrawImageRect(const sk_sp< DlImage > &image, const DlRect &src, const DlRect &dst, DlImageSampling sampling, const DlPaint *paint=nullptr, DlSrcRectConstraint constraint=DlSrcRectConstraint::kFast) override
sk_sp< DisplayList > Build()
Definition dl_builder.cc:66
DlPaint & setAlpha(uint8_t alpha)
Definition dl_paint.h:76
static constexpr int kCallerCanApplyOpacity
static sk_sp< DlImage > MakeTestTexture(int w, int h, int checker_size)
TEST_F(DisplayListTest, Defaults)
LayerTestBase<::testing::Test > LayerTest
Definition layer_test.h:177
bool DisplayListsEQ_Verbose(const DisplayList *a, const DisplayList *b)
impeller::Size DlSize
bool Equals(const T *a, const U *b)
impeller::Point DlPoint
std::shared_ptr< TextureRegistry > texture_registry
Definition layer.h:56
static constexpr TRect MakeOriginSize(const TPoint< Type > &origin, const TSize< Type > &size)
Definition rect.h:144
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition rect.h:129
int64_t texture_id