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
5#include "flutter/flow/layers/texture_layer.h"
6
7#include "flutter/flow/testing/layer_test.h"
8#include "flutter/flow/testing/mock_layer.h"
9#include "flutter/flow/testing/mock_texture.h"
10#include "flutter/fml/macros.h"
11#include "flutter/testing/mock_canvas.h"
12
13namespace flutter {
14namespace testing {
15
16using TextureLayerTest = LayerTest;
17
18TEST_F(TextureLayerTest, InvalidTexture) {
19 const SkPoint layer_offset = SkPoint::Make(0.0f, 0.0f);
20 const SkSize layer_size = SkSize::Make(8.0f, 8.0f);
21 auto layer = std::make_shared<TextureLayer>(layer_offset, layer_size, 0,
22 false, kNone_SkFilterQuality);
23
24 layer->Preroll(preroll_context(), SkMatrix());
25 EXPECT_EQ(layer->paint_bounds(),
26 (SkRect::MakeSize(layer_size)
27 .makeOffset(layer_offset.fX, layer_offset.fY)));
28 EXPECT_TRUE(layer->needs_painting());
29
30 layer->Paint(paint_context());
31 EXPECT_EQ(mock_canvas().draw_calls(), std::vector<MockCanvas::DrawCall>());
32}
33
34TEST_F(TextureLayerTest, PaintingEmptyLayerDies) {
35 const SkPoint layer_offset = SkPoint::Make(0.0f, 0.0f);
36 const SkSize layer_size = SkSize::Make(0.0f, 0.0f);
37 const int64_t texture_id = 0;
38 auto mock_texture = std::make_shared<MockTexture>(texture_id);
39 auto layer = std::make_shared<TextureLayer>(
40 layer_offset, layer_size, texture_id, false, kNone_SkFilterQuality);
41
42 // Ensure the texture is located by the Layer.
43 preroll_context()->texture_registry.RegisterTexture(mock_texture);
44
45 layer->Preroll(preroll_context(), SkMatrix());
46 EXPECT_EQ(layer->paint_bounds(), kEmptyRect);
47 EXPECT_FALSE(layer->needs_painting());
48
49 layer->Paint(paint_context());
50 EXPECT_EQ(mock_texture->paint_calls(),
51 std::vector({MockTexture::PaintCall{
52 mock_canvas(), layer->paint_bounds(), false, nullptr,
53 kNone_SkFilterQuality}}));
54 EXPECT_EQ(mock_canvas().draw_calls(), std::vector<MockCanvas::DrawCall>());
55}
56
57TEST_F(TextureLayerTest, PaintingWithLowFilterQuality) {
58 const SkPoint layer_offset = SkPoint::Make(0.0f, 0.0f);
59 const SkSize layer_size = SkSize::Make(8.0f, 8.0f);
60 const int64_t texture_id = 0;
61 auto mock_texture = std::make_shared<MockTexture>(texture_id);
62 auto layer = std::make_shared<TextureLayer>(
63 layer_offset, layer_size, texture_id, false, kLow_SkFilterQuality);
64
65 // Ensure the texture is located by the Layer.
66 preroll_context()->texture_registry.RegisterTexture(mock_texture);
67
68 layer->Preroll(preroll_context(), SkMatrix());
69 EXPECT_EQ(layer->paint_bounds(),
70 (SkRect::MakeSize(layer_size)
71 .makeOffset(layer_offset.fX, layer_offset.fY)));
72 EXPECT_TRUE(layer->needs_painting());
73
74 layer->Paint(paint_context());
75 EXPECT_EQ(mock_texture->paint_calls(),
76 std::vector({MockTexture::PaintCall{
77 mock_canvas(), layer->paint_bounds(), false, nullptr,
78 kLow_SkFilterQuality}}));
79 EXPECT_EQ(mock_canvas().draw_calls(), std::vector<MockCanvas::DrawCall>());
80}
81
82} // namespace testing
83} // namespace flutter
84