7 #include "display_list/display_list.h"
8 #include "display_list/dl_sampling_options.h"
9 #include "display_list/dl_tile_mode.h"
10 #include "display_list/effects/dl_color_filter.h"
11 #include "display_list/effects/dl_color_source.h"
12 #include "display_list/effects/dl_mask_filter.h"
15 #include "flutter/display_list/dl_blend_mode.h"
16 #include "flutter/display_list/dl_builder.h"
17 #include "flutter/display_list/dl_color.h"
18 #include "flutter/display_list/dl_paint.h"
25 #include "impeller/renderer/testing/mocks.h"
37 #define BLEND_MODE_TUPLE(blend_mode) {#blend_mode, BlendMode::k##blend_mode},
45 std::vector<const char*> blend_mode_names;
46 std::vector<BlendMode> blend_mode_values;
48 const std::vector<std::tuple<const char*, BlendMode>> blends = {
50 assert(blends.size() ==
52 for (
const auto& [name, mode] : blends) {
53 blend_mode_names.push_back(name);
54 blend_mode_values.push_back(mode);
58 return {blend_mode_names, blend_mode_values};
62 DisplayListBuilder builder;
64 DlRect layer_rect = DlRect::MakeXYWH(0, 0, 500, 500);
65 builder.ClipRect(layer_rect);
68 save_paint.setColorFilter(DlColorFilter::MakeBlend(
69 DlColor::RGBA(0, 1, 0, 0.5), DlBlendMode::kDifference));
70 builder.SaveLayer(layer_rect, &save_paint);
73 paint.setColor(DlColor::kBlack());
74 builder.DrawPaint(paint);
75 paint.setColor(DlColor::kWhite());
76 builder.DrawRect(DlRect::MakeXYWH(100, 100, 300, 300), paint);
79 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
83 DisplayListBuilder builder;
86 paint.setColor(DlColor::kRed());
87 builder.DrawPaint(paint);
89 paint.setBlendMode(DlBlendMode::kSrcOver);
90 builder.SaveLayer(std::nullopt, &paint);
92 paint.setColor(DlColor::kWhite());
93 builder.DrawRect(DlRect::MakeXYWH(100, 100, 400, 400), paint);
95 paint.setBlendMode(DlBlendMode::kSrc);
96 builder.SaveLayer(std::nullopt, &paint);
98 paint.setColor(DlColor::kBlue());
99 builder.DrawRect(DlRect::MakeXYWH(200, 200, 200, 200), paint);
104 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
108 DisplayListBuilder builder;
110 builder.Scale(0.2, 0.2);
112 paint.setColor(DlColor::RGBA(
115 builder.DrawPaint(paint);
119 paint.setBlendMode(DlBlendMode::kHue);
120 builder.DrawPaint(paint);
122 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
127 paint.setColor(DlColor::kBlack());
128 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 60));
130 DisplayListBuilder builder;
131 paint.setColor(DlColor::kWhite());
132 builder.DrawPaint(paint);
133 paint.setColor(DlColor::kBlack());
134 builder.DrawCircle(
DlPoint(300, 300), 200, paint);
135 paint.setColor(DlColor::kGreen());
136 paint.setBlendMode(DlBlendMode::kScreen);
137 builder.DrawPaint(paint);
139 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
143 DisplayListBuilder builder;
146 draw_paint.setColor(DlColor::kBlue());
147 builder.DrawPaint(draw_paint);
149 builder.ClipRect(DlRect::MakeLTRB(0, 0, 200, 200));
151 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
152 DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0)};
153 std::vector<Scalar> stops = {0.0, 1.0};
156 DlMatrix matrix = DlMatrix::MakeScale({0.3, 0.3, 1.0});
157 paint.setColorSource(DlColorSource::MakeLinear(
166 paint.setBlendMode(DlBlendMode::kLighten);
168 builder.DrawCircle(
DlPoint(100, 100), 100, paint);
169 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
174 DisplayListBuilder builder;
177 paint.setColor(DlColor::RGBA(1, 0, 0, 0.5));
178 builder.DrawCircle(
DlPoint(150, 200), 100, paint);
180 paint.setColor(DlColor::RGBA(0, 1, 0, 0.5));
181 builder.DrawCircle(
DlPoint(250, 200), 100, paint);
183 paint.setBlendMode(DlBlendMode::kPlus);
185 paint.setColor(DlColor::kRed());
186 builder.DrawCircle(
DlPoint(450, 250), 100, paint);
188 paint.setColor(DlColor::kGreen());
189 builder.DrawCircle(
DlPoint(550, 250), 100, paint);
191 paint.setColor(DlColor::kBlue());
192 builder.DrawCircle(
DlPoint(500, 150), 100, paint);
194 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
199 bool has_color_filter =
true;
200 auto callback = [&]() -> sk_sp<DisplayList> {
202 ImGuiWindowFlags_AlwaysAutoResize)) {
203 ImGui::Checkbox(
"has color filter", &has_color_filter);
207 DisplayListBuilder builder;
208 builder.Scale(GetContentScale().
x, GetContentScale().y);
215 std::vector<DlBlendMode> blend_modes = {
216 DlBlendMode::kSrc, DlBlendMode::kSrcATop, DlBlendMode::kSrcOver,
217 DlBlendMode::kSrcIn, DlBlendMode::kSrcOut, DlBlendMode::kDst,
218 DlBlendMode::kDstATop, DlBlendMode::kDstOver, DlBlendMode::kDstIn,
219 DlBlendMode::kDstOut, DlBlendMode::kClear, DlBlendMode::kXor};
221 for (uint32_t i = 0; i < blend_modes.size(); ++i) {
223 builder.Translate((i % 5) * 200, (i / 5) * 200);
224 builder.Scale(0.4, 0.4);
227 builder.DrawImage(dst_image,
DlPoint(0, 0),
228 DlImageSampling::kMipmapLinear, &dstPaint);
232 srcPaint.setBlendMode(blend_modes[i]);
233 if (has_color_filter) {
234 std::shared_ptr<const DlColorFilter> color_filter =
235 DlColorFilter::MakeBlend(DlColor::RGBA(0.9, 0.5, 0.0, 1.0),
236 DlBlendMode::kSrcIn);
237 srcPaint.setColorFilter(color_filter);
239 builder.DrawImage(src_image,
DlPoint(0, 0),
240 DlImageSampling::kMipmapLinear, &srcPaint);
244 return builder.Build();
246 ASSERT_TRUE(OpenPlaygroundHere(callback));
251 bool has_color_filter =
true;
252 auto callback = [&]() -> sk_sp<DisplayList> {
254 ImGuiWindowFlags_AlwaysAutoResize)) {
255 ImGui::Checkbox(
"has color filter", &has_color_filter);
259 DisplayListBuilder builder;
260 builder.Scale(GetContentScale().
x, GetContentScale().y);
267 std::vector<DlBlendMode> blend_modes = {
268 DlBlendMode::kScreen, DlBlendMode::kOverlay,
269 DlBlendMode::kDarken, DlBlendMode::kLighten,
270 DlBlendMode::kColorDodge, DlBlendMode::kColorBurn,
271 DlBlendMode::kHardLight, DlBlendMode::kSoftLight,
272 DlBlendMode::kDifference, DlBlendMode::kExclusion,
273 DlBlendMode::kMultiply, DlBlendMode::kHue,
274 DlBlendMode::kSaturation, DlBlendMode::kColor,
275 DlBlendMode::kLuminosity,
278 for (uint32_t i = 0; i < blend_modes.size(); ++i) {
280 builder.Translate((i % 5) * 200, (i / 5) * 200);
281 builder.Scale(0.4, 0.4);
284 builder.DrawImage(dst_image,
DlPoint(0, 0),
285 DlImageSampling::kMipmapLinear, &dstPaint);
289 srcPaint.setBlendMode(blend_modes[i]);
290 if (has_color_filter) {
291 std::shared_ptr<const DlColorFilter> color_filter =
292 DlColorFilter::MakeBlend(DlColor::RGBA(0.9, 0.5, 0.0, 1.0),
293 DlBlendMode::kSrcIn);
294 srcPaint.setColorFilter(color_filter);
296 builder.DrawImage(src_image,
DlPoint(0, 0),
297 DlImageSampling::kMipmapLinear, &srcPaint);
301 return builder.Build();
303 ASSERT_TRUE(OpenPlaygroundHere(callback));
312 <<
"This backend doesn't yet support setting device capabilities.";
314 if (!WillRenderSomething()) {
315 GTEST_SKIP() <<
"This test requires playgrounds.";
318 std::shared_ptr<const Capabilities> old_capabilities =
319 GetContext()->GetCapabilities();
320 auto mock_capabilities = std::make_shared<MockCapabilities>();
321 EXPECT_CALL(*mock_capabilities, SupportsFramebufferFetch())
322 .Times(::testing::AtLeast(1))
323 .WillRepeatedly(::testing::Return(
false));
324 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultColorFormat);
325 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultStencilFormat);
326 FLT_FORWARD(mock_capabilities, old_capabilities,
327 GetDefaultDepthStencilFormat);
328 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsOffscreenMSAA);
329 FLT_FORWARD(mock_capabilities, old_capabilities,
330 SupportsImplicitResolvingMSAA);
331 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsReadFromResolve);
332 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsSSBO);
333 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsCompute);
334 FLT_FORWARD(mock_capabilities, old_capabilities,
335 SupportsTextureToTextureBlits);
336 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultGlyphAtlasFormat);
337 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsTriangleFan);
338 FLT_FORWARD(mock_capabilities, old_capabilities,
339 SupportsDecalSamplerAddressMode);
340 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsPrimitiveRestart);
341 ASSERT_TRUE(SetCapabilities(mock_capabilities).ok());
343 bool has_color_filter =
true;
344 auto callback = [&]() -> sk_sp<DisplayList> {
346 ImGuiWindowFlags_AlwaysAutoResize)) {
347 ImGui::Checkbox(
"has color filter", &has_color_filter);
351 DisplayListBuilder builder;
352 builder.Scale(GetContentScale().
x, GetContentScale().y);
359 std::vector<DlBlendMode> blend_modes = {
360 DlBlendMode::kScreen, DlBlendMode::kOverlay,
361 DlBlendMode::kDarken, DlBlendMode::kLighten,
362 DlBlendMode::kColorDodge, DlBlendMode::kColorBurn,
363 DlBlendMode::kHardLight, DlBlendMode::kSoftLight,
364 DlBlendMode::kDifference, DlBlendMode::kExclusion,
365 DlBlendMode::kMultiply, DlBlendMode::kHue,
366 DlBlendMode::kSaturation, DlBlendMode::kColor,
367 DlBlendMode::kLuminosity,
370 for (uint32_t i = 0; i < blend_modes.size(); ++i) {
372 builder.Translate((i % 5) * 200, (i / 5) * 200);
373 builder.Scale(0.4, 0.4);
376 builder.DrawImage(dst_image,
DlPoint(0, 0),
377 DlImageSampling::kMipmapLinear, &dstPaint);
381 srcPaint.setBlendMode(blend_modes[i]);
382 if (has_color_filter) {
383 std::shared_ptr<const DlColorFilter> color_filter =
384 DlColorFilter::MakeBlend(DlColor::RGBA(0.9, 0.5, 0.0, 1.0),
385 DlBlendMode::kMultiply);
386 srcPaint.setColorFilter(color_filter);
388 builder.DrawImage(src_image,
DlPoint(0, 0),
389 DlImageSampling::kMipmapLinear, &srcPaint);
393 return builder.Build();
395 ASSERT_TRUE(OpenPlaygroundHere(callback));
400 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
402 auto texture = CreateTextureForFixture(
"airplane.jpg",
405 DisplayListBuilder builder;
407 builder.Scale(GetContentScale().
x, GetContentScale().y);
409 paint.setColor(DlColor::RGBA(0.9, 1, 0.9, 1.0));
410 builder.DrawPaint(paint);
411 builder.SaveLayer(std::nullopt);
413 paint.setBlendMode(DlBlendMode::kPlus);
414 paint.setColor(DlColor::kRed());
416 builder.DrawRect(DlRect::MakeXYWH(100, 100, 400, 400), paint);
417 paint.setColor(DlColor::kWhite());
420 builder.DrawImageRect(
422 DlRect::MakeWH(texture->GetSize().width, texture->GetSize().height),
423 DlRect::MakeLTRB(rect.GetLeft(), rect.GetTop(),
424 rect.GetRight(), rect.GetBottom()),
425 DlImageSampling::kMipmapLinear, &paint);
427 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
432 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
434 auto texture = CreateTextureForFixture(
"airplane.jpg",
437 DisplayListBuilder builder;
438 builder.Scale(GetContentScale().
x, GetContentScale().y);
441 paint.setColor(DlColor::RGBA(0.1, 0.2, 0.1, 1.0));
442 builder.DrawPaint(paint);
445 save_paint.setColorFilter(
446 DlColorFilter::MakeBlend(DlColor::RGBA(1, 0, 0, 1), DlBlendMode::kPlus));
447 builder.SaveLayer(std::nullopt, &save_paint);
449 paint.setColor(DlColor::kRed());
450 builder.DrawRect(DlRect::MakeXYWH(100, 100, 400, 400), paint);
452 paint.setColor(DlColor::kWhite());
455 builder.DrawImageRect(
457 DlRect::MakeWH(texture->GetSize().width, texture->GetSize().height),
458 DlRect::MakeLTRB(rect.GetLeft(), rect.GetTop(),
459 rect.GetRight(), rect.GetBottom()),
460 DlImageSampling::kMipmapLinear, &paint);
463 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
467 DisplayListBuilder builder;
470 save_paint.setColorFilter(
471 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kColorDodge));
472 builder.SaveLayer(std::nullopt, &save_paint);
474 builder.Translate(500, 300);
478 paint.setColor(DlColor::kBlue());
479 builder.DrawRect(DlRect::MakeXYWH(100, 100, 200, 200), paint);
481 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
485 DisplayListBuilder builder;
488 blue.setColor(DlColor::kBlue());
489 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600.0, 600.0), blue);
492 clear.setBlendMode(DlBlendMode::kClear);
494 builder.DrawCircle(
DlPoint(300.0, 300.0), 200.0, clear);
496 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
501 const sk_sp<DlImageImpeller>& src_image,
502 const sk_sp<DlImageImpeller>& dst_image,
505 ImGuiWindowFlags_AlwaysAutoResize)) {
506 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
515 DisplayListBuilder builder;
518 paint.setColor(DlColor::kBlack());
519 builder.DrawPaint(paint);
530 for (
const auto& color : source_colors) {
533 builder.ClipRect(DlRect::MakeXYWH(25, 25, 100, 100));
537 builder.SaveLayer(std::nullopt);
541 DlColor::RGBA(destination_color.
red, destination_color.
green,
542 destination_color.
blue, destination_color.
alpha));
543 builder.DrawPaint(draw_paint);
548 save_paint.setBlendMode(
static_cast<DlBlendMode
>(blend_mode));
549 builder.SaveLayer(std::nullopt, &save_paint);
553 DlColor::RGBA(color.red, color.green, color.blue, color.alpha));
554 builder.DrawRect(DlRect::MakeXYWH(25, 25, 100, 100), paint);
561 builder.Translate(100, 0);
563 builder.RestoreToCount(0);
570 builder.Translate(0, 100);
573 builder.SaveLayer(std::nullopt);
574 for (
const auto& color : source_colors) {
577 auto dest = destination_color.
Blend(color, blend_mode);
578 paint.setColor(DlColor::RGBA(dest.red, dest.green, dest.blue, dest.alpha));
579 paint.setBlendMode(DlBlendMode::kSrcOver);
580 builder.DrawRect(DlRect::MakeXYWH(25, 25, 100, 100), paint);
581 builder.Translate(100, 0);
593 builder.Translate(0, 250);
598 paint.setColor(DlColor::RGBA(41 / 255.0, 41 / 255.0, 41 / 255.0, 1));
599 builder.DrawRect(DlRect::MakeLTRB(0, 0, 800, 400), paint);
602 DlPaint square_paint;
603 square_paint.setColor(DlColor::RGBA(15 / 255.0, 15 / 255.0, 15 / 255.0, 1));
604 for (
int y = 0; y < 400 / 8; y++) {
605 for (
int x = 0;
x < 800 / 16;
x++) {
606 builder.DrawRect(DlRect::MakeXYWH(
x * 16 + (y % 2) * 8, y * 8, 8, 8),
613 paint.setBlendMode(DlBlendMode::kSrcOver);
615 builder.SaveLayer(std::nullopt, &paint);
617 builder.DrawImage(dst_image,
DlPoint(0, 0), DlImageSampling::kMipmapLinear,
620 paint.setColor(DlColor::kWhite().withAlpha(src_alpha * 255));
621 paint.setBlendMode(
static_cast<DlBlendMode
>(blend_mode));
622 builder.DrawImage(src_image,
DlPoint(0, 0), DlImageSampling::kMipmapLinear,
632 builder.SaveLayer(std::nullopt, &save_paint);
634 builder.DrawImage(dst_image,
DlPoint(400, 0),
635 DlImageSampling::kMipmapLinear,
nullptr);
638 save_paint.setColor(DlColor::kWhite().withAlpha(src_alpha * 255));
639 save_paint.setBlendMode(
static_cast<DlBlendMode
>(blend_mode));
640 builder.SaveLayer(std::nullopt, &save_paint);
642 builder.DrawImage(src_image,
DlPoint(400, 0),
643 DlImageSampling::kMipmapLinear,
nullptr);
650 return builder.Build();
653 #define BLEND_MODE_TEST(blend_mode) \
654 TEST_P(AiksTest, BlendMode##blend_mode) { \
656 DlImageImpeller::Make(CreateTextureForFixture("blend_mode_src.png")); \
658 DlImageImpeller::Make(CreateTextureForFixture("blend_mode_dst.png")); \
659 auto callback = [&]() -> sk_sp<DisplayList> { \
660 return BlendModeTest(GetContentScale(), BlendMode::k##blend_mode, \
661 src_image, dst_image,
1.0); \
663 OpenPlaygroundHere(callback); \
667 #define BLEND_MODE_SRC_ALPHA_TEST(blend_mode) \
668 TEST_P(AiksTest, BlendModeSrcAlpha##blend_mode) { \
670 DlImageImpeller::Make(CreateTextureForFixture("blend_mode_src.png")); \
672 DlImageImpeller::Make(CreateTextureForFixture("blend_mode_dst.png")); \
673 auto callback = [&]() -> sk_sp<DisplayList> { \
674 return BlendModeTest(GetContentScale(), BlendMode::k##blend_mode, \
675 src_image, dst_image,
0.5); \
677 OpenPlaygroundHere(callback); \
684 auto callback = [&]() -> sk_sp<DisplayList> {
686 static Color foreground = Color::Color::OrangeRed().
WithAlpha(0.5);
687 static int current_blend_index = 3;
690 ImGuiWindowFlags_AlwaysAutoResize)) {
691 ImGui::ColorEdit4(
"Background",
reinterpret_cast<float*
>(&background));
692 ImGui::ColorEdit4(
"Foreground",
reinterpret_cast<float*
>(&foreground));
693 ImGui::ListBox(
"Blend mode", ¤t_blend_index,
694 modes.blend_mode_names.data(),
695 modes.blend_mode_names.size());
699 DisplayListBuilder builder;
700 builder.Scale(0.2, 0.2);
702 paint.setColor(DlColor(background.
ToARGB()));
703 builder.DrawPaint(paint);
705 paint.setColor(DlColor(foreground.
ToARGB()));
706 paint.setBlendMode(
static_cast<DlBlendMode
>(current_blend_index));
707 builder.DrawPaint(paint);
708 return builder.Build();
710 ASSERT_TRUE(OpenPlaygroundHere(callback));
714 auto texture = CreateTextureForFixture(
"airplane.jpg",
717 DisplayListBuilder builder;
721 image_paint.setColorFilter(DlColorFilter::MakeBlend(
722 DlColor::RGBA(255.0f / 255.0f, 165.0f / 255.0f, 0.0f / 255.0f, 1.0f),
723 DlBlendMode::kSrcIn));
726 DlImageSampling::kMipmapLinear, &image_paint);
728 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
732 auto texture = CreateTextureForFixture(
"airplane.jpg",
735 DisplayListBuilder builder;
739 image_paint.setColorFilter(DlColorFilter::MakeBlend(
740 DlColor::RGBA(255.0f / 255.0f, 165.0f / 255.0f, 0.0f / 255.0f, 1.0f),
741 DlBlendMode::kColorDodge));
744 DlImageSampling::kMipmapLinear, &image_paint);
746 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
750 auto texture = CreateTextureForFixture(
"airplane.jpg",
755 DisplayListBuilder builder;
759 DlColor::RGBA(169.0f / 255.0f, 169.0f / 255.0f, 169.0f / 255.0f, 1.0f));
760 builder.DrawPaint(paint);
761 builder.Scale(0.4, 0.4);
764 image_paint.setBlendMode(DlBlendMode::kMultiply);
767 DlImageSampling::kMipmapLinear, &image_paint);
769 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
777 auto draw_color_wheel = [](DisplayListBuilder& builder) ->
void {
780 auto color_wheel_sampler = [](
Radians r) {
784 auto color_cycle = [](
Scalar x) {
785 Scalar cycle = std::fmod(
x, 6.0f);
786 return std::max(0.0f, std::min(1.0f, 2 - std::abs(2 - cycle)));
788 return Color(color_cycle(6 *
x + 1),
789 color_cycle(6 *
x - 1),
790 color_cycle(6 *
x - 3),
795 paint.setBlendMode(DlBlendMode::kSrcOver);
799 const int max_dist = 900;
800 for (
int i = 0; i <= 900; i++) {
803 Scalar normalized_distance =
static_cast<Scalar>(i) / max_dist;
805 auto color = color_wheel_sampler(r).WithAlpha(1.0f - normalized_distance);
807 DlColor::RGBA(color.red, color.green, color.blue, color.alpha));
811 builder.DrawCircle(position, 9 + normalized_distance * 3, paint);
815 auto callback = [&]() -> sk_sp<DisplayList> {
817 static bool cache_the_wheel =
true;
818 static int current_blend_index = 3;
819 static float dst_alpha = 1;
820 static float src_alpha = 1;
821 static DlColor color0 = DlColor::kRed();
822 static DlColor color1 = DlColor::kGreen();
823 static DlColor color2 = DlColor::kBlue();
826 ImGuiWindowFlags_AlwaysAutoResize)) {
827 ImGui::Checkbox(
"Cache the wheel", &cache_the_wheel);
828 ImGui::ListBox(
"Blending mode", ¤t_blend_index,
831 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
832 ImGui::ColorEdit4(
"Color A",
reinterpret_cast<float*
>(&color0));
833 ImGui::ColorEdit4(
"Color B",
reinterpret_cast<float*
>(&color1));
834 ImGui::ColorEdit4(
"Color C",
reinterpret_cast<float*
>(&color2));
835 ImGui::SliderFloat(
"Destination alpha", &dst_alpha, 0, 1);
839 DisplayListBuilder builder;
842 paint.setColor(DlColor::kWhite().withAlpha(dst_alpha * 255));
843 paint.setBlendMode(DlBlendMode::kSrc);
844 builder.SaveLayer(std::nullopt, &paint);
847 paint.setColor(DlColor::kWhite());
848 builder.DrawPaint(paint);
850 builder.SaveLayer(std::nullopt,
nullptr);
851 builder.Scale(GetContentScale().
x, GetContentScale().y);
852 builder.Translate(500, 400);
854 draw_color_wheel(builder);
859 builder.Scale(GetContentScale().
x, GetContentScale().y);
860 builder.Translate(500, 400);
865 save_paint.setColor(DlColor::kWhite().withAlpha(src_alpha * 255));
866 save_paint.setBlendMode(
static_cast<DlBlendMode
>(
868 builder.SaveLayer(std::nullopt, &save_paint);
871 paint.setBlendMode(DlBlendMode::kPlus);
874 paint.setColor(color0);
875 builder.DrawCircle(
DlPoint(-
x * 45, y * 45), 65, paint);
876 paint.setColor(color1);
877 builder.DrawCircle(
DlPoint(0, -45), 65, paint);
878 paint.setColor(color2);
879 builder.DrawCircle(
DlPoint(
x * 45, y * 45), 65, paint);
883 return builder.Build();
886 ASSERT_TRUE(OpenPlaygroundHere(callback));
890 DisplayListBuilder builder;
893 paint.setColor(DlColor::kBlue());
894 builder.DrawPaint(paint);
897 save_paint.setColorFilter(
898 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kSrc));
899 builder.SaveLayer(std::nullopt, &save_paint);
903 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
907 DisplayListBuilder builder;
909 builder.DrawPaint(DlPaint(DlColor::kWhite()));
912 save_paint.setOpacity(0.3);
913 save_paint.setColorFilter(DlColorFilter::MakeBlend(DlColor::kTransparent(),
914 DlBlendMode::kSaturation));
915 builder.SaveLayer(std::nullopt, &save_paint);
916 builder.DrawRect(DlRect::MakeXYWH(100, 100, 300, 300),
917 DlPaint(DlColor::kMaroon()));
918 builder.DrawRect(DlRect::MakeXYWH(200, 200, 300, 300),
919 DlPaint(DlColor::kBlue()));
923 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
#define BLEND_MODE_TUPLE(blend_mode)
#define BLEND_MODE_SRC_ALPHA_TEST(blend_mode)
#define BLEND_MODE_TEST(blend_mode)
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)
static constexpr BlendMode kLastAdvancedBlendMode
#define IMPELLER_FOR_EACH_BLEND_MODE(V)
TEST_P(AiksTest, DrawAtlasNoColor)
static sk_sp< DisplayList > BlendModeTest(Vector2 content_scale, BlendMode blend_mode, const sk_sp< DlImageImpeller > &src_image, const sk_sp< DlImageImpeller > &dst_image, Scalar src_alpha)
static BlendModeSelection GetBlendModeSelection()
static constexpr Color LimeGreen()
constexpr uint32_t ToARGB() const
Convert to ARGB 32 bit color.
static constexpr Color Black()
static constexpr Color CornflowerBlue()
static constexpr Color MediumTurquoise()
static constexpr Color White()
constexpr Color WithAlpha(Scalar new_alpha) const
static constexpr Color OrangeRed()
Color Blend(Color source, BlendMode blend_mode) const
Blends an unpremultiplied destination color into a given unpremultiplied source color to form a new u...
constexpr TRect< T > Expand(T left, T top, T right, T bottom) const
Returns a rectangle with expanded edges. Negative expansion results in shrinking.
constexpr static TRect MakeXYWH(Type x, Type y, Type width, Type height)
std::vector< BlendMode > blend_mode_values
std::vector< const char * > blend_mode_names