5#include "flutter/display_list/display_list.h"
6#include "flutter/display_list/dl_color.h"
7#include "flutter/display_list/dl_paint.h"
8#include "flutter/flow/compositor_context.h"
9#include "flutter/flow/layers/color_filter_layer.h"
11#include "flutter/display_list/effects/dl_color_filter.h"
12#include "flutter/flow/layers/layer_tree.h"
13#include "flutter/flow/layers/opacity_layer.h"
14#include "flutter/flow/raster_cache.h"
15#include "flutter/flow/raster_cache_key.h"
16#include "flutter/flow/testing/layer_test.h"
17#include "flutter/flow/testing/mock_layer.h"
18#include "flutter/fml/macros.h"
30 auto layer = std::make_shared<ColorFilterLayer>(
nullptr);
32 layer->Preroll(preroll_context());
34 EXPECT_EQ(layer->child_paint_bounds(),
kEmptyRect);
35 EXPECT_FALSE(layer->needs_painting(paint_context()));
37 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
38 "needs_painting\\(context\\)");
44 auto mock_layer = std::make_shared<MockLayer>(child_path);
46 auto layer = std::make_shared<ColorFilterLayer>(
nullptr);
47 layer->Add(mock_layer);
50 EXPECT_EQ(layer->child_paint_bounds(),
kEmptyRect);
51 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
52 "needs_painting\\(context\\)");
61 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
62 auto layer = std::make_shared<ColorFilterLayer>(
nullptr);
63 layer->Add(mock_layer);
65 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
66 layer->Preroll(preroll_context());
67 EXPECT_EQ(layer->paint_bounds(), child_bounds);
68 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
69 EXPECT_TRUE(layer->needs_painting(paint_context()));
70 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform);
72 layer->Paint(display_list_paint_context());
73 DisplayListBuilder expected_builder;
75 expected_builder.Save();
78 expected_builder.DrawPath(child_path, child_paint);
81 expected_builder.Restore();
93 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
94 auto layer = std::make_shared<ColorFilterLayer>(dl_color_filter);
95 layer->Add(mock_layer);
97 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
98 layer->Preroll(preroll_context());
99 EXPECT_EQ(layer->paint_bounds(), child_bounds);
100 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
101 EXPECT_TRUE(layer->needs_painting(paint_context()));
102 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform);
104 DisplayListBuilder expected_builder;
107 dl_paint.setColorFilter(dl_color_filter.get());
108 expected_builder.SaveLayer(&child_bounds, &dl_paint);
115 expected_builder.Restore();
116 auto expected_display_list = expected_builder.Build();
118 layer->Paint(display_list_paint_context());
126 const SkPath child_path2 =
130 auto mock_layer1 = std::make_shared<MockLayer>(child_path1, child_paint1);
131 auto mock_layer2 = std::make_shared<MockLayer>(child_path2, child_paint2);
133 auto layer = std::make_shared<ColorFilterLayer>(dl_color_filter);
134 layer->Add(mock_layer1);
135 layer->Add(mock_layer2);
139 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
140 layer->Preroll(preroll_context());
141 EXPECT_EQ(mock_layer1->paint_bounds(), child_path1.
getBounds());
142 EXPECT_EQ(mock_layer2->paint_bounds(), child_path2.
getBounds());
143 EXPECT_EQ(layer->paint_bounds(), children_bounds);
144 EXPECT_EQ(layer->child_paint_bounds(), children_bounds);
145 EXPECT_TRUE(mock_layer1->needs_painting(paint_context()));
146 EXPECT_TRUE(mock_layer2->needs_painting(paint_context()));
147 EXPECT_TRUE(layer->needs_painting(paint_context()));
148 EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform);
149 EXPECT_EQ(mock_layer2->parent_matrix(), initial_transform);
151 DisplayListBuilder expected_builder;
154 dl_paint.setColorFilter(dl_color_filter.get());
155 expected_builder.SaveLayer(&children_bounds, &dl_paint);
161 expected_builder.DrawPath(child_path2, DlPaint(
DlColor::kCyan()));
165 expected_builder.Restore();
166 auto expected_display_list = expected_builder.Build();
168 layer->Paint(display_list_paint_context());
176 const SkPath child_path2 =
180 auto mock_layer1 = std::make_shared<MockLayer>(child_path1, child_paint1);
181 auto mock_layer2 = std::make_shared<MockLayer>(child_path2, child_paint2);
183 auto layer1 = std::make_shared<ColorFilterLayer>(dl_color_filter);
185 auto layer2 = std::make_shared<ColorFilterLayer>(dl_color_filter);
186 layer2->Add(mock_layer2);
187 layer1->Add(mock_layer1);
192 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
193 layer1->Preroll(preroll_context());
194 EXPECT_EQ(mock_layer1->paint_bounds(), child_path1.
getBounds());
195 EXPECT_EQ(mock_layer2->paint_bounds(), child_path2.
getBounds());
196 EXPECT_EQ(layer1->paint_bounds(), children_bounds);
197 EXPECT_EQ(layer1->child_paint_bounds(), children_bounds);
198 EXPECT_EQ(layer2->paint_bounds(), mock_layer2->paint_bounds());
199 EXPECT_EQ(layer2->child_paint_bounds(), mock_layer2->paint_bounds());
200 EXPECT_TRUE(mock_layer1->needs_painting(paint_context()));
201 EXPECT_TRUE(mock_layer2->needs_painting(paint_context()));
202 EXPECT_TRUE(layer1->needs_painting(paint_context()));
203 EXPECT_TRUE(layer2->needs_painting(paint_context()));
204 EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform);
205 EXPECT_EQ(mock_layer2->parent_matrix(), initial_transform);
207 DisplayListBuilder expected_builder;
210 dl_paint.setColorFilter(dl_color_filter.get());
211 expected_builder.SaveLayer(&children_bounds, &dl_paint);
217 DlPaint child_dl_paint;
219 child_dl_paint.setColorFilter(dl_color_filter.get());
220 expected_builder.SaveLayer(&child_path2.
getBounds(), &child_dl_paint);
223 expected_builder.DrawPath(child_path2, DlPaint(
DlColor::kCyan()));
225 expected_builder.Restore();
229 expected_builder.Restore();
231 auto expected_display_list = expected_builder.Build();
233 layer1->Paint(display_list_paint_context());
238 auto initial_transform =
SkMatrix();
241 auto layer = std::make_shared<ColorFilterLayer>(
243 preroll_context()->surface_needs_readback =
false;
244 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
245 layer->Preroll(preroll_context());
246 EXPECT_FALSE(preroll_context()->surface_needs_readback);
249 auto mock_layer = std::make_shared<MockLayer>(
SkPath(), DlPaint());
250 mock_layer->set_fake_reads_surface(
true);
251 layer->Add(mock_layer);
252 preroll_context()->surface_needs_readback =
false;
253 layer->Preroll(preroll_context());
254 EXPECT_FALSE(preroll_context()->surface_needs_readback);
263 auto mock_layer = std::make_shared<MockLayer>(child_path);
264 auto layer = std::make_shared<ColorFilterLayer>(layer_filter);
265 layer->Add(mock_layer);
267 SkMatrix cache_ctm = initial_transform;
273 use_mock_raster_cache();
274 const auto* cacheable_color_filter_item = layer->raster_cache_item();
276 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
277 EXPECT_EQ(cacheable_color_filter_item->cache_state(),
279 EXPECT_FALSE(cacheable_color_filter_item->GetId().has_value());
281 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
282 layer->Preroll(preroll_context());
285 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
286 EXPECT_EQ(cacheable_color_filter_item->cache_state(),
289 cacheable_color_filter_item->GetId().value(),
292 EXPECT_FALSE(raster_cache()->
Draw(
293 cacheable_color_filter_item->GetId().value(), other_canvas, &
paint));
294 EXPECT_TRUE(raster_cache()->
Draw(cacheable_color_filter_item->GetId().value(),
295 cache_canvas, &
paint));
304 auto mock_layer1 = std::make_shared<MockLayer>(child_path1);
305 auto mock_layer2 = std::make_shared<MockLayer>(child_path2);
306 auto layer = std::make_shared<ColorFilterLayer>(layer_filter);
307 layer->Add(mock_layer1);
308 layer->Add(mock_layer2);
311 SkMatrix cache_ctm = initial_transform;
317 use_mock_raster_cache();
319 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
320 const auto* cacheable_color_filter_item = layer->raster_cache_item();
321 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
323 EXPECT_EQ(cacheable_color_filter_item->cache_state(),
325 EXPECT_FALSE(cacheable_color_filter_item->GetId().has_value());
327 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
328 layer->Preroll(preroll_context());
331 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
332 EXPECT_EQ(cacheable_color_filter_item->cache_state(),
335 cacheable_color_filter_item->GetId().value(),
338 EXPECT_FALSE(raster_cache()->
Draw(
339 cacheable_color_filter_item->GetId().value(), other_canvas, &
paint));
340 EXPECT_TRUE(raster_cache()->
Draw(cacheable_color_filter_item->GetId().value(),
341 cache_canvas, &
paint));
350 auto mock_layer1 = std::make_shared<MockLayer>(child_path1);
351 auto mock_layer2 = std::make_shared<MockLayer>(child_path2);
352 auto layer = std::make_shared<ColorFilterLayer>(layer_filter);
353 layer->Add(mock_layer1);
354 layer->Add(mock_layer2);
357 SkMatrix cache_ctm = initial_transform;
363 use_mock_raster_cache();
364 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
365 const auto* cacheable_color_filter_item = layer->raster_cache_item();
368 layer->Preroll(preroll_context());
369 layer->Paint(paint_context());
371 layer->Preroll(preroll_context());
374 EXPECT_EQ(cacheable_color_filter_item->cache_state(),
376 EXPECT_TRUE(raster_cache()->
Draw(cacheable_color_filter_item->GetId().value(),
377 cache_canvas, &
paint));
378 EXPECT_FALSE(raster_cache()->
Draw(
379 cacheable_color_filter_item->GetId().value(), other_canvas, &
paint));
380 layer->Paint(paint_context());
383 layer->Preroll(preroll_context());
384 layer->Paint(paint_context());
389 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)2);
392 EXPECT_EQ(cacheable_color_filter_item->cache_state(),
394 EXPECT_EQ(cacheable_color_filter_item->GetId(),
396 EXPECT_TRUE(raster_cache()->
Draw(cacheable_color_filter_item->GetId().value(),
397 cache_canvas, &
paint));
398 EXPECT_FALSE(raster_cache()->
Draw(
399 cacheable_color_filter_item->GetId().value(), other_canvas, &
paint));
411 auto layer_filter = DlMatrixColorFilter(matrix);
414 auto mock_layer = std::make_shared<MockLayer>(child_path);
415 auto color_filter_layer = std::make_shared<ColorFilterLayer>(
416 std::make_shared<DlMatrixColorFilter>(matrix));
417 color_filter_layer->Add(mock_layer);
419 PrerollContext* context = preroll_context();
420 context->state_stack.set_preroll_delegate(initial_transform);
421 color_filter_layer->Preroll(preroll_context());
424 EXPECT_EQ(context->renderable_state_flags,
427 int opacity_alpha = 0x7F;
429 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha,
offset);
430 opacity_layer->Add(color_filter_layer);
431 preroll_context()->state_stack.set_preroll_delegate(
SkMatrix::I());
432 opacity_layer->Preroll(context);
433 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
435 DisplayListBuilder expected_builder;
437 expected_builder.Save();
442 dl_paint.setColor(DlColor(opacity_alpha << 24));
443 dl_paint.setColorFilter(&layer_filter);
444 expected_builder.SaveLayer(&child_path.
getBounds(), &dl_paint);
446 expected_builder.DrawPath(child_path, DlPaint(DlColor(0xFF000000)));
448 expected_builder.Restore();
451 expected_builder.Restore();
454 opacity_layer->Paint(display_list_paint_context());
static SkMatrix Scale(SkScalar sx, SkScalar sy)
static SkMatrix Translate(SkScalar dx, SkScalar dy)
static const SkMatrix & I()
const SkRect & getBounds() const
SkPath & addRect(const SkRect &rect, SkPathDirection dir, unsigned start)
void Transform(const SkMatrix *matrix) override
static const std::shared_ptr< DlLinearToSrgbGammaColorFilter > kInstance
static const std::shared_ptr< DlSrgbToLinearGammaColorFilter > kInstance
static constexpr int kCallerCanApplyOpacity
static void TryToRasterCache(const std::vector< RasterCacheItem * > &raster_cached_entries, const PaintContext *paint_context, bool ignore_raster_cache=false)
static std::optional< std::vector< RasterCacheKeyID > > LayerChildrenIds(const Layer *layer)
static void Draw(SkCanvas *canvas, const SkRect &rect)
TEST_F(DisplayListTest, Defaults)
LayerTestBase<::testing::Test > LayerTest
LayerTest ColorFilterLayerTest
bool DisplayListsEQ_Verbose(const DisplayList *a, const DisplayList *b)
static constexpr SkRect kEmptyRect
static constexpr SkPoint Make(float x, float y)
constexpr SkRect makeOffset(float dx, float dy) const
void join(const SkRect &r)
static constexpr SkRect MakeWH(float w, float h)
static constexpr SkRect MakeLTRB(float l, float t, float r, float b)
static constexpr DlColor kBlack()
static constexpr DlColor kYellow()
static constexpr DlColor kCyan()
#define EXPECT_TRUE(handle)