7 #include "absl/status/statusor.h"
9 #include "flutter/display_list/dl_builder.h"
10 #include "flutter/display_list/dl_paint.h"
11 #include "flutter/display_list/effects/dl_color_source.h"
12 #include "flutter/display_list/effects/dl_image_filter.h"
13 #include "flutter/display_list/effects/dl_runtime_effect.h"
17 #include "third_party/abseil-cpp/absl/status/status_matchers.h"
25 absl::StatusOr<std::shared_ptr<DlColorSource>> MakeRuntimeEffect(
27 std::string_view name,
28 const std::shared_ptr<std::vector<uint8_t>>& uniform_data = {},
29 const std::vector<std::shared_ptr<DlColorSource>>& samplers = {}) {
30 auto runtime_stages_result = test->OpenAssetAsRuntimeStage(name.data());
31 if (!runtime_stages_result.ok()) {
32 return runtime_stages_result.status();
34 std::shared_ptr<RuntimeStage> runtime_stage =
38 return absl::InternalError(
"Runtime stage not found for backend.");
40 if (!runtime_stage->IsDirty()) {
41 return absl::InternalError(
"Runtime stage is not dirty.");
46 return DlColorSource::MakeRuntimeEffect(dl_runtime_effect, samplers,
56 } frag_uniforms = {.iResolution =
Vector2(400, 400), .iTime = 100.0};
57 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
58 uniform_data->resize(
sizeof(FragUniforms));
59 memcpy(uniform_data->data(), &frag_uniforms,
sizeof(FragUniforms));
63 MakeRuntimeEffect(
this,
"runtime_stage_example.frag.iplr", uniform_data);
64 ABSL_ASSERT_OK(effect);
65 paint.setColorSource(effect.value());
67 DisplayListBuilder builder;
69 builder.ClipRoundRect(
70 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 400, 400), 10.0, 10.0),
71 DlClipOp::kIntersect);
72 builder.DrawRect(DlRect::MakeXYWH(0, 0, 400, 400), paint);
75 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
82 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
83 uniform_data->resize(
sizeof(FragUniforms));
84 memcpy(uniform_data->data(), &frag_uniforms,
sizeof(FragUniforms));
87 auto effect = MakeRuntimeEffect(
this,
"gradient.frag.iplr", uniform_data);
88 ABSL_ASSERT_OK(effect);
89 paint.setColorSource(effect.value());
91 DisplayListBuilder builder;
93 builder.Scale(GetContentScale().
x, GetContentScale().y);
94 builder.DrawPaint(paint);
97 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
101 auto runtime_stages_result =
102 OpenAssetAsRuntimeStage(
"runtime_stage_filter_example.frag.iplr");
103 ABSL_ASSERT_OK(runtime_stages_result);
104 std::shared_ptr<RuntimeStage> runtime_stage =
105 runtime_stages_result
107 ASSERT_TRUE(runtime_stage);
108 ASSERT_TRUE(runtime_stage->IsDirty());
110 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
113 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
114 uniform_data->resize(
sizeof(
Vector2));
117 paint.setColor(DlColor::kAqua());
118 paint.setImageFilter(DlImageFilter::MakeRuntimeEffect(
122 DisplayListBuilder builder;
123 builder.DrawRect(DlRect::MakeXYWH(0, 0, 400, 400), paint);
125 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
132 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
133 flutter::DlColor::kRed()};
134 const float stops[2] = {0.0, 1.0};
135 auto linear = flutter::DlColorSource::MakeLinear({0.0, 0.0}, {300.0, 300.0},
136 2, colors.data(), stops,
137 flutter::DlTileMode::kClamp);
138 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
142 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
143 uniform_data->resize(
sizeof(
Vector2));
147 MakeRuntimeEffect(
this,
"runtime_stage_filter_example.frag.iplr",
148 uniform_data, sampler_inputs);
149 ABSL_ASSERT_OK(effect);
150 paint.setColorSource(effect.value());
152 DisplayListBuilder builder;
153 builder.DrawPaint(paint);
155 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
159 DisplayListBuilder builder;
161 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
162 builder.DrawPaint(background);
165 paint.setColor(DlColor::kGreen());
172 std::shared_ptr<DlImageFilter> color_filter =
173 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix));
175 auto runtime_stages_result =
176 OpenAssetAsRuntimeStage(
"runtime_stage_filter_warp.frag.iplr");
177 ABSL_ASSERT_OK(runtime_stages_result);
178 std::shared_ptr<RuntimeStage> runtime_stage =
179 runtime_stages_result
181 ASSERT_TRUE(runtime_stage);
182 ASSERT_TRUE(runtime_stage->IsDirty());
184 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
187 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
188 uniform_data->resize(
sizeof(
Vector2));
190 auto runtime_filter = DlImageFilter::MakeRuntimeEffect(
194 builder.Translate(50, 50);
195 builder.Scale(0.7, 0.7);
197 paint.setImageFilter(
198 DlImageFilter::MakeCompose(runtime_filter, color_filter));
200 builder.DrawImage(image,
DlPoint(100.0, 100.0),
201 DlImageSampling::kNearestNeighbor, &paint);
204 green.setColor(DlColor::kGreen());
205 builder.DrawLine({100, 100}, {200, 100}, green);
206 builder.DrawLine({100, 100}, {100, 200}, green);
208 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
212 auto runtime_stages_result =
213 OpenAssetAsRuntimeStage(
"runtime_stage_filter_warp.frag.iplr");
214 ABSL_ASSERT_OK(runtime_stages_result);
215 std::shared_ptr<RuntimeStage> runtime_stage =
216 runtime_stages_result
218 ASSERT_TRUE(runtime_stage);
219 ASSERT_TRUE(runtime_stage->IsDirty());
224 bool compare =
false;
226 auto callback = [&]() -> sk_sp<DisplayList> {
228 ImGuiWindowFlags_AlwaysAutoResize)) {
229 ImGui::SliderFloat(
"xoffset", &xoffset, -50, 50);
230 ImGui::SliderFloat(
"yoffset", &yoffset, -50, 50);
231 ImGui::SliderFloat(
"xscale", &xscale, 0, 1);
232 ImGui::SliderFloat(
"yscale", &yscale, 0, 1);
233 ImGui::Checkbox(
"compare", &compare);
236 DisplayListBuilder builder;
238 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
239 builder.DrawPaint(background);
242 paint.setColor(DlColor::kGreen());
249 std::shared_ptr<DlImageFilter> color_filter =
250 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix));
252 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
255 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
256 uniform_data->resize(
sizeof(
Vector2));
258 auto runtime_filter = DlImageFilter::MakeRuntimeEffect(
262 builder.Translate(xoffset, yoffset);
263 builder.Scale(xscale, yscale);
265 paint.setImageFilter(
266 DlImageFilter::MakeCompose(color_filter, runtime_filter));
268 builder.DrawImage(image,
DlPoint(100.0, 100.0),
269 DlImageSampling::kNearestNeighbor, &paint);
272 paint.setImageFilter(
273 DlImageFilter::MakeCompose(runtime_filter, color_filter));
274 builder.DrawImage(image,
DlPoint(800.0, 100.0),
275 DlImageSampling::kNearestNeighbor, &paint);
277 paint.setImageFilter(runtime_filter);
278 builder.DrawImage(image,
DlPoint(100.0, 800.0),
279 DlImageSampling::kNearestNeighbor, &paint);
283 green.setColor(DlColor::kGreen());
284 builder.DrawLine({100, 100}, {200, 100}, green);
285 builder.DrawLine({100, 100}, {100, 200}, green);
287 builder.DrawLine({800, 100}, {900, 100}, green);
288 builder.DrawLine({800, 100}, {800, 200}, green);
289 builder.DrawLine({100, 800}, {200, 800}, green);
290 builder.DrawLine({100, 800}, {100, 900}, green);
293 return builder.Build();
296 ASSERT_TRUE(OpenPlaygroundHere(callback));
300 auto runtime_stages_result =
301 OpenAssetAsRuntimeStage(
"runtime_stage_filter_circle.frag.iplr");
302 ABSL_ASSERT_OK(runtime_stages_result);
303 std::shared_ptr<RuntimeStage> runtime_stage =
304 runtime_stages_result
306 ASSERT_TRUE(runtime_stage);
307 ASSERT_TRUE(runtime_stage->IsDirty());
310 auto callback = [&]() -> sk_sp<DisplayList> {
312 ImGuiWindowFlags_AlwaysAutoResize)) {
313 ImGui::SliderFloat(
"sigma", &sigma, 0, 20);
316 DisplayListBuilder builder;
318 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
319 builder.DrawPaint(background);
322 DlImageFilter::MakeBlur(sigma, sigma, DlTileMode::kClamp);
324 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
327 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
328 uniform_data->resize(
sizeof(
Vector2));
330 auto runtime_filter = DlImageFilter::MakeRuntimeEffect(
334 auto backdrop_filter = DlImageFilter::MakeCompose(runtime_filter,
339 builder.DrawImage(image,
DlPoint(100.0, 100.0),
340 DlImageSampling::kNearestNeighbor, &paint);
343 save_paint.setBlendMode(DlBlendMode::kSrc);
344 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
348 green.setColor(DlColor::kGreen());
349 builder.DrawLine({100, 100}, {200, 100}, green);
350 builder.DrawLine({100, 100}, {100, 200}, green);
352 return builder.Build();
355 ASSERT_TRUE(OpenPlaygroundHere(callback));
359 auto runtime_stages_result =
360 OpenAssetAsRuntimeStage(
"runtime_stage_filter_circle.frag.iplr");
361 ABSL_ASSERT_OK(runtime_stages_result);
362 std::shared_ptr<RuntimeStage> runtime_stage =
363 runtime_stages_result
365 ASSERT_TRUE(runtime_stage);
366 ASSERT_TRUE(runtime_stage->IsDirty());
369 auto callback = [&]() -> sk_sp<DisplayList> {
371 ImGuiWindowFlags_AlwaysAutoResize)) {
372 ImGui::SliderFloat(
"sigma", &sigma, 0, 20);
375 DisplayListBuilder builder;
377 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
378 builder.DrawPaint(background);
381 DlImageFilter::MakeBlur(sigma, sigma, DlTileMode::kClamp);
383 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
386 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
387 uniform_data->resize(
sizeof(
Vector2));
389 auto runtime_filter = DlImageFilter::MakeRuntimeEffect(
393 auto backdrop_filter = DlImageFilter::MakeCompose(runtime_filter,
398 builder.DrawImage(image,
DlPoint(100.0, 100.0),
399 DlImageSampling::kNearestNeighbor, &paint);
402 save_paint.setBlendMode(DlBlendMode::kSrc);
403 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
407 green.setColor(DlColor::kGreen());
408 builder.DrawLine({100, 100}, {200, 100}, green);
409 builder.DrawLine({100, 100}, {100, 200}, green);
411 return builder.Build();
414 ASSERT_TRUE(OpenPlaygroundHere(callback));
418 struct FragUniforms {
420 } frag_uniforms = {.uSize =
Vector2(400, 400)};
421 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
422 uniform_data->resize(
sizeof(FragUniforms));
423 memcpy(uniform_data->data(), &frag_uniforms,
sizeof(FragUniforms));
425 auto runtime_stages_result =
426 OpenAssetAsRuntimeStage(
"runtime_stage_border.frag.iplr");
427 ABSL_ASSERT_OK(runtime_stages_result);
428 std::shared_ptr<RuntimeStage> runtime_stage =
429 runtime_stages_result
431 ASSERT_TRUE(runtime_stage);
432 ASSERT_TRUE(runtime_stage->IsDirty());
434 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
438 auto runtime_filter = DlImageFilter::MakeRuntimeEffect(
442 DisplayListBuilder builder;
445 DlPaint background_paint;
446 background_paint.setColor(DlColor::kWhite());
447 builder.DrawPaint(background_paint);
450 DlPaint pattern_paint;
451 pattern_paint.setColor(DlColor::kRed());
452 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), pattern_paint);
453 pattern_paint.setColor(DlColor::kBlue());
454 builder.DrawRect(DlRect::MakeXYWH(200, 200, 200, 200), pattern_paint);
460 builder.ClipRect(DlRect::MakeXYWH(66, 66, 268, 268));
465 builder.SaveLayer(std::nullopt, &save_paint, runtime_filter.get());
473 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
478 auto size = image->GetBounds().GetSize();
480 struct FragUniforms {
482 } frag_uniforms = {.size =
Size(size.width, size.height)};
483 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
484 uniform_data->resize(
sizeof(FragUniforms));
485 memcpy(uniform_data->data(), &frag_uniforms,
sizeof(FragUniforms));
487 auto runtime_stages_result = OpenAssetAsRuntimeStage(
"gradient.frag.iplr");
488 ABSL_ASSERT_OK(runtime_stages_result);
489 std::shared_ptr<RuntimeStage> runtime_stage =
490 runtime_stages_result
492 ASSERT_TRUE(runtime_stage);
493 ASSERT_TRUE(runtime_stage->IsDirty());
495 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
499 auto runtime_filter = DlImageFilter::MakeRuntimeEffect(
505 auto callback = [&]() -> sk_sp<DisplayList> {
507 ImGuiWindowFlags_AlwaysAutoResize)) {
508 ImGui::SliderFloat(
"rotation", &rotation, 0, 360);
511 DisplayListBuilder builder;
512 builder.Translate(size.width * 0.5, size.height * 0.5);
513 builder.Rotate(rotation);
514 builder.Translate(-size.width * 0.5, -size.height * 0.5);
517 paint.setImageFilter(runtime_filter);
518 builder.DrawImage(image,
DlPoint(0.0, 0.0),
519 DlImageSampling::kNearestNeighbor, &paint);
521 return builder.Build();
524 ASSERT_TRUE(OpenPlaygroundHere(callback));
static sk_sp< DlRuntimeEffect > Make(std::shared_ptr< impeller::RuntimeStage > runtime_stage)
static bool ImGuiBegin(const char *name, bool *p_open, ImGuiWindowFlags flags)
static sk_sp< DlImageImpeller > Make(std::shared_ptr< Texture > texture, OwningContext owning_context=OwningContext::kIO)
TEST_P(AiksTest, DrawAtlasNoColor)
constexpr RuntimeStageBackend PlaygroundBackendToRuntimeStageBackend(PlaygroundBackend backend)
static constexpr TSize MakeWH(Type width, Type height)