7 #include "flutter/display_list/dl_builder.h"
8 #include "flutter/display_list/dl_paint.h"
9 #include "flutter/display_list/effects/dl_color_source.h"
10 #include "flutter/display_list/effects/dl_image_filter.h"
11 #include "flutter/display_list/effects/dl_runtime_effect.h"
22 std::shared_ptr<DlColorSource> MakeRuntimeEffect(
24 std::string_view name,
25 const std::shared_ptr<std::vector<uint8_t>>& uniform_data = {},
26 const std::vector<std::shared_ptr<DlColorSource>>& samplers = {}) {
27 auto runtime_stages = test->OpenAssetAsRuntimeStage(name.data());
30 FML_CHECK(runtime_stage);
31 FML_CHECK(runtime_stage->IsDirty());
35 return DlColorSource::MakeRuntimeEffect(dl_runtime_effect, samplers,
45 } frag_uniforms = {.iResolution =
Vector2(400, 400), .iTime = 100.0};
46 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
47 uniform_data->resize(
sizeof(FragUniforms));
48 memcpy(uniform_data->data(), &frag_uniforms,
sizeof(FragUniforms));
52 MakeRuntimeEffect(
this,
"runtime_stage_example.frag.iplr", uniform_data));
54 DisplayListBuilder builder;
56 builder.ClipRoundRect(
57 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 400, 400), 10.0, 10.0),
58 DlClipOp::kIntersect);
59 builder.DrawRect(DlRect::MakeXYWH(0, 0, 400, 400), paint);
62 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
69 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
70 uniform_data->resize(
sizeof(FragUniforms));
71 memcpy(uniform_data->data(), &frag_uniforms,
sizeof(FragUniforms));
75 MakeRuntimeEffect(
this,
"gradient.frag.iplr", uniform_data));
77 DisplayListBuilder builder;
79 builder.Scale(GetContentScale().
x, GetContentScale().y);
80 builder.DrawPaint(paint);
83 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
88 OpenAssetAsRuntimeStage(
"runtime_stage_filter_example.frag.iplr");
90 std::shared_ptr<RuntimeStage> runtime_stage =
92 ASSERT_TRUE(runtime_stage);
93 ASSERT_TRUE(runtime_stage->IsDirty());
95 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
98 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
99 uniform_data->resize(
sizeof(
Vector2));
102 paint.setColor(DlColor::kAqua());
103 paint.setImageFilter(DlImageFilter::MakeRuntimeEffect(
107 DisplayListBuilder builder;
108 builder.DrawRect(DlRect::MakeXYWH(0, 0, 400, 400), paint);
110 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
117 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
118 flutter::DlColor::kRed()};
119 const float stops[2] = {0.0, 1.0};
120 auto linear = flutter::DlColorSource::MakeLinear({0.0, 0.0}, {300.0, 300.0},
121 2, colors.data(), stops,
122 flutter::DlTileMode::kClamp);
123 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
127 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
128 uniform_data->resize(
sizeof(
Vector2));
131 paint.setColorSource(
132 MakeRuntimeEffect(
this,
"runtime_stage_filter_example.frag.iplr",
133 uniform_data, sampler_inputs));
135 DisplayListBuilder builder;
136 builder.DrawPaint(paint);
138 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
142 DisplayListBuilder builder;
144 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
145 builder.DrawPaint(background);
148 paint.setColor(DlColor::kGreen());
155 std::shared_ptr<DlImageFilter> color_filter =
156 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix));
158 auto runtime_stages =
159 OpenAssetAsRuntimeStage(
"runtime_stage_filter_warp.frag.iplr");
161 std::shared_ptr<RuntimeStage> runtime_stage =
163 ASSERT_TRUE(runtime_stage);
164 ASSERT_TRUE(runtime_stage->IsDirty());
166 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
169 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
170 uniform_data->resize(
sizeof(
Vector2));
172 auto runtime_filter = DlImageFilter::MakeRuntimeEffect(
176 builder.Translate(50, 50);
177 builder.Scale(0.7, 0.7);
179 paint.setImageFilter(
180 DlImageFilter::MakeCompose(runtime_filter, color_filter));
182 builder.DrawImage(image,
DlPoint(100.0, 100.0),
183 DlImageSampling::kNearestNeighbor, &paint);
186 green.setColor(DlColor::kGreen());
187 builder.DrawLine({100, 100}, {200, 100}, green);
188 builder.DrawLine({100, 100}, {100, 200}, green);
190 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
194 auto runtime_stages =
195 OpenAssetAsRuntimeStage(
"runtime_stage_filter_warp.frag.iplr");
197 std::shared_ptr<RuntimeStage> runtime_stage =
199 ASSERT_TRUE(runtime_stage);
200 ASSERT_TRUE(runtime_stage->IsDirty());
205 bool compare =
false;
207 auto callback = [&]() -> sk_sp<DisplayList> {
209 ImGuiWindowFlags_AlwaysAutoResize)) {
210 ImGui::SliderFloat(
"xoffset", &xoffset, -50, 50);
211 ImGui::SliderFloat(
"yoffset", &yoffset, -50, 50);
212 ImGui::SliderFloat(
"xscale", &xscale, 0, 1);
213 ImGui::SliderFloat(
"yscale", &yscale, 0, 1);
214 ImGui::Checkbox(
"compare", &compare);
217 DisplayListBuilder builder;
219 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
220 builder.DrawPaint(background);
223 paint.setColor(DlColor::kGreen());
230 std::shared_ptr<DlImageFilter> color_filter =
231 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix));
233 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
236 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
237 uniform_data->resize(
sizeof(
Vector2));
239 auto runtime_filter = DlImageFilter::MakeRuntimeEffect(
243 builder.Translate(xoffset, yoffset);
244 builder.Scale(xscale, yscale);
246 paint.setImageFilter(
247 DlImageFilter::MakeCompose(color_filter, runtime_filter));
249 builder.DrawImage(image,
DlPoint(100.0, 100.0),
250 DlImageSampling::kNearestNeighbor, &paint);
253 paint.setImageFilter(
254 DlImageFilter::MakeCompose(runtime_filter, color_filter));
255 builder.DrawImage(image,
DlPoint(800.0, 100.0),
256 DlImageSampling::kNearestNeighbor, &paint);
258 paint.setImageFilter(runtime_filter);
259 builder.DrawImage(image,
DlPoint(100.0, 800.0),
260 DlImageSampling::kNearestNeighbor, &paint);
264 green.setColor(DlColor::kGreen());
265 builder.DrawLine({100, 100}, {200, 100}, green);
266 builder.DrawLine({100, 100}, {100, 200}, green);
268 builder.DrawLine({800, 100}, {900, 100}, green);
269 builder.DrawLine({800, 100}, {800, 200}, green);
270 builder.DrawLine({100, 800}, {200, 800}, green);
271 builder.DrawLine({100, 800}, {100, 900}, green);
274 return builder.Build();
277 ASSERT_TRUE(OpenPlaygroundHere(callback));
281 auto runtime_stages =
282 OpenAssetAsRuntimeStage(
"runtime_stage_filter_circle.frag.iplr");
284 std::shared_ptr<RuntimeStage> runtime_stage =
286 ASSERT_TRUE(runtime_stage);
287 ASSERT_TRUE(runtime_stage->IsDirty());
290 auto callback = [&]() -> sk_sp<DisplayList> {
292 ImGuiWindowFlags_AlwaysAutoResize)) {
293 ImGui::SliderFloat(
"sigma", &sigma, 0, 20);
296 DisplayListBuilder builder;
298 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
299 builder.DrawPaint(background);
302 DlImageFilter::MakeBlur(sigma, sigma, DlTileMode::kClamp);
304 std::vector<std::shared_ptr<DlColorSource>> sampler_inputs = {
307 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
308 uniform_data->resize(
sizeof(
Vector2));
310 auto runtime_filter = DlImageFilter::MakeRuntimeEffect(
314 auto backdrop_filter = DlImageFilter::MakeCompose(runtime_filter,
319 builder.DrawImage(image,
DlPoint(100.0, 100.0),
320 DlImageSampling::kNearestNeighbor, &paint);
323 save_paint.setBlendMode(DlBlendMode::kSrc);
324 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
328 green.setColor(DlColor::kGreen());
329 builder.DrawLine({100, 100}, {200, 100}, green);
330 builder.DrawLine({100, 100}, {100, 200}, green);
332 return builder.Build();
335 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)