5 #include <unordered_map>
7 #include "flutter/display_list/dl_tile_mode.h"
8 #include "flutter/display_list/effects/dl_image_filter.h"
9 #include "flutter/display_list/geometry/dl_geometry_types.h"
10 #include "flutter/testing/testing.h"
11 #include "gtest/gtest.h"
27 std::optional<Rect> cull_rect = std::nullopt,
28 bool requires_readback =
false) {
30 onscreen_desc.
size = {100, 100};
36 std::shared_ptr<Texture> onscreen =
37 context.
GetContext()->GetResourceAllocator()->CreateTexture(
42 if (context.
GetContext()->GetCapabilities()->SupportsOffscreenMSAA()) {
48 std::shared_ptr<Texture> onscreen_msaa =
49 context.
GetContext()->GetResourceAllocator()->CreateTexture(
61 if (cull_rect.has_value()) {
62 return std::make_unique<Canvas>(
63 context, render_target,
false,
64 requires_readback, cull_rect.value());
66 return std::make_unique<Canvas>(context, render_target,
false,
77 canvas->Translate(
Vector3(100, 200));
79 canvas->GetCurrentTransform(),
87 canvas->GetCurrentTransform(),
95 canvas->GetCurrentTransform(),
101 canvas->Translate(
Vector3(100, 200));
103 canvas->GetCurrentTransform(),
115 ASSERT_EQ(canvas->GetSaveCount(), 1u);
116 ASSERT_EQ(canvas->Restore(),
false);
118 canvas->Translate(
Size{100, 100});
120 ASSERT_EQ(canvas->GetSaveCount(), 2u);
123 ASSERT_TRUE(canvas->Restore());
124 ASSERT_EQ(canvas->GetSaveCount(), 1u);
135 canvas->Translate(
Size{100, 100});
143 GTEST_SKIP() <<
"Test requires device with framebuffer fetch";
148 canvas->SetBackdropData({}, 3);
151 flutter::DlImageFilter::MakeBlur(4, 4, flutter::DlTileMode::kClamp);
154 EXPECT_TRUE(canvas->RequiresReadback());
156 canvas->SaveLayer({}, rect, blur.get(),
160 EXPECT_TRUE(canvas->RequiresReadback());
162 canvas->SaveLayer({}, rect, blur.get(),
166 EXPECT_TRUE(canvas->RequiresReadback());
168 canvas->SaveLayer({}, rect, blur.get(),
172 EXPECT_FALSE(canvas->RequiresReadback());
178 GTEST_SKIP() <<
"Test requires device with framebuffer fetch";
183 std::unordered_map<int64_t, BackdropData>
data;
185 canvas->SetBackdropData(
data, 3);
188 flutter::DlImageFilter::MakeBlur(4, 4, flutter::DlTileMode::kClamp);
190 EXPECT_TRUE(canvas->RequiresReadback());
191 canvas->DrawRect(flutter::DlRect::MakeLTRB(0, 0, 50, 50),
193 canvas->SaveLayer({}, std::nullopt, blur.get(),
198 EXPECT_FALSE(canvas->RequiresReadback());
200 canvas->SaveLayer({}, std::nullopt, blur.get(),
205 EXPECT_FALSE(canvas->RequiresReadback());
207 canvas->SaveLayer({}, std::nullopt, blur.get(),
212 EXPECT_FALSE(canvas->RequiresReadback());
218 GTEST_SKIP() <<
"Test requires device with framebuffer fetch";
223 std::unordered_map<int64_t, BackdropData>
data;
225 canvas->SetBackdropData(
data, 3);
228 flutter::DlImageFilter::MakeBlur(4, 4, flutter::DlTileMode::kClamp);
230 EXPECT_TRUE(canvas->RequiresReadback());
231 canvas->DrawRect(flutter::DlRect::MakeLTRB(0, 0, 50, 50),
233 canvas->SaveLayer({}, std::nullopt, blur.get(),
236 EXPECT_TRUE(canvas->RequiresReadback());
238 canvas->SaveLayer({}, std::nullopt, blur.get(),
241 EXPECT_FALSE(canvas->RequiresReadback());
243 canvas->SaveLayer({}, std::nullopt, blur.get(),
246 EXPECT_FALSE(canvas->RequiresReadback());
255 GTEST_SKIP() <<
"Test requires device with framebuffer fetch";
260 canvas->SetBackdropData({}, 2);
263 flutter::DlImageFilter::MakeBlur(4, 4, flutter::DlTileMode::kClamp);
265 EXPECT_TRUE(canvas->RequiresReadback());
266 canvas->DrawRect(flutter::DlRect::MakeLTRB(0, 0, 50, 50),
268 canvas->SaveLayer({}, std::nullopt, blur.get(),
274 canvas->SaveLayer({}, std::nullopt, blur.get(),
278 EXPECT_TRUE(canvas->RequiresReadback());
281 EXPECT_TRUE(canvas->RequiresReadback());
285 RenderCallback callback = [&](
RenderTarget& render_target) {
287 Canvas canvas(context, render_target,
true,
false);
289 std::vector<flutter::DlPoint> vertex_coordinates = {
294 std::vector<flutter::DlPoint> texture_coordinates = {
299 std::vector<uint16_t> indices = {0, 1, 2};
300 flutter::DlVertices::Builder vertices_builder(
301 flutter::DlVertexMode::kTriangleStrip, vertex_coordinates.size(),
302 flutter::DlVertices::Builder::kHasTextureCoordinates, indices.size());
303 vertices_builder.store_vertices(vertex_coordinates.data());
304 vertices_builder.store_indices(indices.data());
305 vertices_builder.store_texture_coordinates(texture_coordinates.data());
306 auto vertices = vertices_builder.build();
309 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
310 flutter::DlColor::kRed()};
311 std::vector<Scalar> stops = {0.0, 1.0};
312 auto gradient = flutter::DlColorSource::MakeLinear(
313 {0, 0}, {0, 600}, 2, colors.data(), stops.data(),
314 flutter::DlTileMode::kClamp);
318 canvas.
DrawVertices(std::make_shared<DlVerticesGeometry>(vertices, context),
329 auto runtime_stages =
330 OpenAssetAsRuntimeStage(
"runtime_stage_simple.frag.iplr");
334 ASSERT_TRUE(runtime_stage);
336 auto runtime_effect = flutter::DlRuntimeEffect::MakeImpeller(runtime_stage);
337 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
338 auto color_source = flutter::DlColorSource::MakeRuntimeEffect(
339 runtime_effect, {}, uniform_data);
341 RenderCallback callback = [&](
RenderTarget& render_target) {
343 Canvas canvas(context, render_target,
true,
false);
345 std::vector<flutter::DlPoint> vertex_coordinates = {
351 std::vector<flutter::DlPoint> texture_coordinates = {
356 std::vector<uint16_t> indices = {0, 1, 2};
357 flutter::DlVertices::Builder vertices_builder(
358 flutter::DlVertexMode::kTriangleStrip, vertex_coordinates.size(),
359 flutter::DlVertices::Builder::kHasTextureCoordinates, indices.size());
360 vertices_builder.store_vertices(vertex_coordinates.data());
361 vertices_builder.store_indices(indices.data());
362 vertices_builder.store_texture_coordinates(texture_coordinates.data());
363 auto vertices = vertices_builder.build();
367 canvas.
DrawVertices(std::make_shared<DlVerticesGeometry>(vertices, context),
383 EXPECT_FALSE(canvas->SupportsBlitToOnscreen());
385 EXPECT_TRUE(canvas->SupportsBlitToOnscreen());
391 Size default_size(600, 400);
392 Point left_center(400, 700);
393 Point right_center(1300, 700);
399 std::shared_ptr<flutter::DlColorSource> color_source;
401 flutter::DlColor dl_color = flutter::DlColor(color.
ToARGB());
402 std::vector<flutter::DlColor> colors = {dl_color, dl_color};
403 std::vector<Scalar> stops = {0.0, 1.0};
404 color_source = flutter::DlColorSource::MakeLinear(
405 {0, 0}, {1000, 1000}, 2, colors.data(), stops.data(),
406 flutter::DlTileMode::kClamp);
409 auto RectMakeCenterHalfSize = [](
Point center,
Point half_size) {
410 Size size(half_size.x * 2, half_size.y * 2);
414 RenderCallback callback = [&](
RenderTarget& render_target) {
416 Canvas canvas(context, render_target,
true,
false);
421 static Scalar sigma = 0.05;
422 static Scalar radius = 200;
425 ImGui::Begin(
"Shadow",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
427 ImGui::SliderFloat(
"Sigma", &sigma, 0, 100);
428 ImGui::SliderFloat(
"Radius", &radius, 0, 1000);
433 ctm * (right_center + default_size / 2), 30,
Color::White());
435 Point half_size = (right_reference - right_center).Abs();
436 Rect left_bounds = RectMakeCenterHalfSize(left_center, half_size);
437 Rect right_bounds = RectMakeCenterHalfSize(right_center, half_size);
441 .mask_blur_descriptor =
452 paint.color_source = color_source.get();
void DrawRoundSuperellipse(const RoundSuperellipse &rse, const Paint &paint)
void DrawVertices(const std::shared_ptr< VerticesGeometry > &vertices, BlendMode blend_mode, const Paint &paint)
virtual bool SupportsFramebufferFetch() const =0
Whether the context backend is able to support pipelines with shaders that read from the framebuffer ...
virtual PixelFormat GetDefaultColorFormat() const =0
Returns a supported PixelFormat for textures that store 4-channel colors (red/green/blue/alpha).
const Capabilities & GetDeviceCapabilities() const
std::shared_ptr< Context > GetContext() const
bool OpenPlaygroundHere(const RenderCallback &render_callback)
RenderTarget & SetColorAttachment(const ColorAttachment &attachment, size_t index)
#define ASSERT_MATRIX_NEAR(a, b)
std::unique_ptr< Canvas > CreateTestCanvas(ContentContext &context, std::optional< Rect > cull_rect=std::nullopt, bool requires_readback=false)
TEST_P(AiksTest, DrawAtlasNoColor)
Point DrawPlaygroundPoint(PlaygroundPoint &point)
constexpr RuntimeStageBackend PlaygroundBackendToRuntimeStageBackend(PlaygroundBackend backend)
@ kContainsContents
The caller claims the bounds are a reasonably tight estimate of the coverage of the contents and shou...
std::shared_ptr< Texture > resolve_texture
std::shared_ptr< Texture > texture
uint32_t ToARGB() const
Convert to ARGB 32 bit color.
static constexpr Color Azure()
static constexpr Color White()
static constexpr Color Red()
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
static constexpr Matrix MakeScale(const Vector3 &s)
const flutter::DlColorSource * color_source
static RoundSuperellipse MakeRectRadius(const Rect &rect, Scalar radius)
In filters that use Gaussian distributions, "sigma" is a size of one standard deviation in terms of t...
constexpr static TRect MakeOriginSize(const TPoint< Type > &origin, const TSize< Type > &size)
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...
std::shared_ptr< const fml::Mapping > data