5#include "gtest/gtest.h"
7#include "flutter/display_list/effects/dl_color_filter.h"
8#include "flutter/display_list/effects/dl_image_filter.h"
9#include "flutter/flow/layers/layer.h"
10#include "flutter/flow/layers/layer_state_stack.h"
11#include "flutter/testing/display_list_testing.h"
21 "LayerStateStack state queried without a delegate");
23 "LayerStateStack state queried without a delegate");
25 "LayerStateStack state queried without a delegate");
27 "LayerStateStack state queried without a delegate");
29 "LayerStateStack state queried without a delegate");
32 auto mutator = state_stack.
save();
57 state_stack.
fill(dl_paint);
98 ASSERT_TRUE(builder.GetTransform().isIdentity());
103 ASSERT_TRUE(builder.GetTransform().isIdentity());
106 auto mutator = state_stack.
save();
114 ASSERT_TRUE(builder.GetTransform().isIdentity());
119 ASSERT_TRUE(builder.GetTransform().isIdentity());
125 ASSERT_TRUE(builder.GetTransform().isIdentity());
131 ASSERT_TRUE(builder.GetTransform().isIdentity());
136 SkRect rect = {10, 10, 20, 20};
141 auto mutator = state_stack.
save();
149 auto mutator2 = state_stack.
save();
160 auto restore = state_stack.
applyState(rect, 0);
166 builder.DrawRect(rect,
paint);
191 builder.DrawRect(rect,
paint);
210 SkRect rect = {10, 10, 20, 20};
211 std::shared_ptr<DlBlendColorFilter> outer_filter =
214 std::shared_ptr<DlBlendColorFilter> inner_filter =
221 auto mutator = state_stack.
save();
228 auto mutator2 = state_stack.
save();
238 auto restore = state_stack.
applyState(rect, 0);
243 builder.DrawRect(rect,
paint);
250 expected.
SaveLayer(&rect, &outer_save_paint);
251 expected.
SaveLayer(&rect, &inner_save_paint);
260 SkRect rect = {10, 10, 20, 20};
270 builder.DrawRect(rect,
paint);
290 SkRect rect = {10, 10, 20, 20};
291 std::shared_ptr<DlBlurImageFilter> outer_filter =
293 std::shared_ptr<DlBlurImageFilter> inner_filter =
295 SkRect inner_src_rect = rect;
297 ASSERT_EQ(inner_filter->map_local_bounds(rect, outer_src_rect),
303 auto mutator = state_stack.
save();
310 auto mutator2 = state_stack.
save();
320 auto restore = state_stack.
applyState(rect, 0);
325 builder.DrawRect(rect,
paint);
332 expected.
SaveLayer(&outer_src_rect, &outer_save_paint);
333 expected.
SaveLayer(&inner_src_rect, &inner_save_paint);
342 SkRect rect = {10, 10, 20, 20};
352 builder.DrawRect(rect,
paint);
359 expected.
SaveLayer(&outer_src_rect, &save_paint);
372 SkRect rect = {10, 10, 20, 20};
380 ASSERT_EQ(builder.GetSaveCount(), 1);
383 auto mutator1 = state_stack.
save();
384 ASSERT_EQ(builder.GetSaveCount(), 1);
385 mutator1.applyOpacity(rect, 0.5f);
386 ASSERT_EQ(builder.GetSaveCount(), 1);
389 auto mutator2 = state_stack.
save();
390 ASSERT_EQ(builder.GetSaveCount(), 1);
394 ASSERT_EQ(builder.GetSaveCount(), 2);
398 ASSERT_EQ(builder.GetSaveCount(), 1);
402 ASSERT_EQ(builder.GetSaveCount(), 1);
407 auto mutator1 = state_stack.
save();
408 ASSERT_EQ(builder.GetSaveCount(), 1);
410 ASSERT_EQ(builder.GetSaveCount(), 1);
413 auto mutator2 = state_stack.
save();
414 ASSERT_EQ(builder.GetSaveCount(), 1);
415 mutator2.applyOpacity(rect, 0.5f);
418 ASSERT_EQ(builder.GetSaveCount(), 1);
422 ASSERT_EQ(builder.GetSaveCount(), 1);
426 ASSERT_EQ(builder.GetSaveCount(), 1);
432 SkRect rect = {10, 10, 20, 20};
433 std::shared_ptr<DlBlurImageFilter> image_filter =
439 ASSERT_EQ(builder.GetSaveCount(), 1);
442 auto mutator1 = state_stack.
save();
443 ASSERT_EQ(builder.GetSaveCount(), 1);
444 mutator1.applyOpacity(rect, 0.5f);
445 ASSERT_EQ(builder.GetSaveCount(), 1);
448 auto mutator2 = state_stack.
save();
449 ASSERT_EQ(builder.GetSaveCount(), 1);
450 mutator2.applyImageFilter(rect, image_filter);
453 ASSERT_EQ(builder.GetSaveCount(), 1);
457 ASSERT_EQ(builder.GetSaveCount(), 1);
461 ASSERT_EQ(builder.GetSaveCount(), 1);
466 auto mutator1 = state_stack.
save();
467 ASSERT_EQ(builder.GetSaveCount(), 1);
468 mutator1.applyImageFilter(rect, image_filter);
469 ASSERT_EQ(builder.GetSaveCount(), 1);
472 auto mutator2 = state_stack.
save();
473 ASSERT_EQ(builder.GetSaveCount(), 1);
474 mutator2.applyOpacity(rect, 0.5f);
477 ASSERT_EQ(builder.GetSaveCount(), 2);
481 ASSERT_EQ(builder.GetSaveCount(), 1);
485 ASSERT_EQ(builder.GetSaveCount(), 1);
491 SkRect rect = {10, 10, 20, 20};
495 std::shared_ptr<DlBlurImageFilter> image_filter =
501 ASSERT_EQ(builder.GetSaveCount(), 1);
504 auto mutator1 = state_stack.
save();
505 ASSERT_EQ(builder.GetSaveCount(), 1);
507 ASSERT_EQ(builder.GetSaveCount(), 1);
510 auto mutator2 = state_stack.
save();
511 ASSERT_EQ(builder.GetSaveCount(), 1);
512 mutator2.applyImageFilter(rect, image_filter);
515 ASSERT_EQ(builder.GetSaveCount(), 1);
519 ASSERT_EQ(builder.GetSaveCount(), 1);
523 ASSERT_EQ(builder.GetSaveCount(), 1);
528 auto mutator1 = state_stack.
save();
529 ASSERT_EQ(builder.GetSaveCount(), 1);
530 mutator1.applyImageFilter(rect, image_filter);
531 ASSERT_EQ(builder.GetSaveCount(), 1);
534 auto mutator2 = state_stack.
save();
535 ASSERT_EQ(builder.GetSaveCount(), 1);
539 ASSERT_EQ(builder.GetSaveCount(), 2);
543 ASSERT_EQ(builder.GetSaveCount(), 1);
547 ASSERT_EQ(builder.GetSaveCount(), 1);
#define TEST(S, s, D, expected)
static sk_sp< SkImage > color_filter(const SkImage *image, SkColorFilter *colorFilter)
static SkMatrix Translate(SkScalar dx, SkScalar dy)
static const SkMatrix & I()
void DrawRect(const SkRect &rect, const DlPaint &paint) override
void SaveLayer(const SkRect *bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr) override
sk_sp< DisplayList > Build()
Developer-facing API for rendering anything within the engine.
virtual SkMatrix GetTransform() const =0
DlPaint & setColorFilter(const std::shared_ptr< const DlColorFilter > &filter)
DlPaint & setImageFilter(const std::shared_ptr< const DlImageFilter > &filter)
DlPaint & setOpacity(SkScalar opacity)
void applyColorFilter(const SkRect &bounds, const std::shared_ptr< const DlColorFilter > &filter)
void translate(SkScalar tx, SkScalar ty)
void applyImageFilter(const SkRect &bounds, const std::shared_ptr< const DlImageFilter > &filter)
void applyOpacity(const SkRect &bounds, SkScalar opacity)
std::shared_ptr< const DlImageFilter > outstanding_image_filter() const
SkRect outstanding_bounds() const
SkMatrix transform_3x3() const
void fill(MutatorsStack *mutators)
DlCanvas * canvas_delegate()
AutoRestore applyState(const SkRect &bounds, int can_apply_flags)
CheckerboardFunc checkerboard_func() const
void set_preroll_delegate(const SkRect &cull_rect, const SkMatrix &matrix)
SkM44 transform_4x4() const
SkScalar outstanding_opacity() const
SkRect device_cull_rect() const
static constexpr int kCallerCanApplyColorFilter
SkRect local_cull_rect() const
void set_delegate(DlCanvas *canvas)
bool content_culled(const SkRect &content_bounds) const
std::shared_ptr< const DlColorFilter > outstanding_color_filter() const
static constexpr int kCallerCanApplyImageFilter
static constexpr int kCallerCanApplyOpacity
static void draw_paint(SkCanvas *canvas, const SkRect &r, sk_sp< SkImageFilter > imf)
bool DisplayListsEQ_Verbose(const DisplayList *a, const DisplayList *b)
static constexpr SkRect kGiantRect
@ kColorBurn
darken destination to reflect source
static constexpr SkRect MakeWH(float w, float h)
static constexpr SkRect MakeLTRB(float l, float t, float r, float b)
static constexpr DlColor kYellow()
static constexpr DlColor kRed()