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"
26 #include "include/core/SkMatrix.h"
38 #define BLEND_MODE_TUPLE(blend_mode) {#blend_mode, BlendMode::k##blend_mode},
46 std::vector<const char*> blend_mode_names;
47 std::vector<BlendMode> blend_mode_values;
49 const std::vector<std::tuple<const char*, BlendMode>> blends = {
51 assert(blends.size() ==
53 for (
const auto& [name, mode] : blends) {
54 blend_mode_names.push_back(name);
55 blend_mode_values.push_back(mode);
59 return {blend_mode_names, blend_mode_values};
63 DisplayListBuilder builder;
65 SkRect layer_rect = SkRect::MakeXYWH(0, 0, 500, 500);
66 builder.ClipRect(layer_rect);
69 save_paint.setColorFilter(DlColorFilter::MakeBlend(
70 DlColor::RGBA(0, 1, 0, 0.5), DlBlendMode::kDifference));
71 builder.SaveLayer(&layer_rect, &save_paint);
74 paint.setColor(DlColor::kBlack());
75 builder.DrawPaint(paint);
76 paint.setColor(DlColor::kWhite());
77 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
80 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
84 DisplayListBuilder builder;
87 paint.setColor(DlColor::kRed());
88 builder.DrawPaint(paint);
90 paint.setBlendMode(DlBlendMode::kSrcOver);
91 builder.SaveLayer(
nullptr, &paint);
93 paint.setColor(DlColor::kWhite());
94 builder.DrawRect(SkRect::MakeXYWH(100, 100, 400, 400), paint);
96 paint.setBlendMode(DlBlendMode::kSrc);
97 builder.SaveLayer(
nullptr, &paint);
99 paint.setColor(DlColor::kBlue());
100 builder.DrawRect(SkRect::MakeXYWH(200, 200, 200, 200), paint);
105 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
109 DisplayListBuilder builder;
111 builder.Scale(0.2, 0.2);
113 paint.setColor(DlColor::RGBA(
116 builder.DrawPaint(paint);
120 paint.setBlendMode(DlBlendMode::kHue);
121 builder.DrawPaint(paint);
123 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
128 paint.setColor(DlColor::kBlack());
129 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 60));
131 DisplayListBuilder builder;
132 paint.setColor(DlColor::kWhite());
133 builder.DrawPaint(paint);
134 paint.setColor(DlColor::kBlack());
135 builder.DrawCircle(SkPoint{300, 300}, 200, paint);
136 paint.setColor(DlColor::kGreen());
137 paint.setBlendMode(DlBlendMode::kScreen);
138 builder.DrawPaint(paint);
140 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
144 DisplayListBuilder builder;
147 draw_paint.setColor(DlColor::kBlue());
148 builder.DrawPaint(draw_paint);
150 builder.ClipRect(SkRect::MakeLTRB(0, 0, 200, 200));
152 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
153 DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0)};
154 std::vector<Scalar> stops = {0.0, 1.0};
157 DlMatrix matrix = DlMatrix::MakeScale({0.3, 0.3, 1.0});
158 paint.setColorSource(DlColorSource::MakeLinear(
167 paint.setBlendMode(DlBlendMode::kLighten);
169 builder.DrawCircle(SkPoint{100, 100}, 100, paint);
170 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
175 DisplayListBuilder builder;
178 paint.setColor(DlColor::RGBA(1, 0, 0, 0.5));
179 builder.DrawCircle(SkPoint{150, 200}, 100, paint);
181 paint.setColor(DlColor::RGBA(0, 1, 0, 0.5));
182 builder.DrawCircle(SkPoint{250, 200}, 100, paint);
184 paint.setBlendMode(DlBlendMode::kPlus);
186 paint.setColor(DlColor::kRed());
187 builder.DrawCircle(SkPoint{450, 250}, 100, paint);
189 paint.setColor(DlColor::kGreen());
190 builder.DrawCircle(SkPoint{550, 250}, 100, paint);
192 paint.setColor(DlColor::kBlue());
193 builder.DrawCircle(SkPoint{500, 150}, 100, paint);
195 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
200 bool has_color_filter =
true;
201 auto callback = [&]() -> sk_sp<DisplayList> {
203 ImGuiWindowFlags_AlwaysAutoResize)) {
204 ImGui::Checkbox(
"has color filter", &has_color_filter);
208 DisplayListBuilder builder;
209 builder.Scale(GetContentScale().
x, GetContentScale().y);
216 std::vector<DlBlendMode> blend_modes = {
217 DlBlendMode::kSrc, DlBlendMode::kSrcATop, DlBlendMode::kSrcOver,
218 DlBlendMode::kSrcIn, DlBlendMode::kSrcOut, DlBlendMode::kDst,
219 DlBlendMode::kDstATop, DlBlendMode::kDstOver, DlBlendMode::kDstIn,
220 DlBlendMode::kDstOut, DlBlendMode::kClear, DlBlendMode::kXor};
222 for (uint32_t i = 0; i < blend_modes.size(); ++i) {
224 builder.Translate((i % 5) * 200, (i / 5) * 200);
225 builder.Scale(0.4, 0.4);
228 builder.DrawImage(dst_image, SkPoint{0, 0},
229 DlImageSampling::kMipmapLinear, &dstPaint);
233 srcPaint.setBlendMode(blend_modes[i]);
234 if (has_color_filter) {
235 std::shared_ptr<const DlColorFilter> color_filter =
236 DlColorFilter::MakeBlend(DlColor::RGBA(0.9, 0.5, 0.0, 1.0),
237 DlBlendMode::kSrcIn);
238 srcPaint.setColorFilter(color_filter);
240 builder.DrawImage(src_image, SkPoint{0, 0},
241 DlImageSampling::kMipmapLinear, &srcPaint);
245 return builder.Build();
247 ASSERT_TRUE(OpenPlaygroundHere(callback));
252 bool has_color_filter =
true;
253 auto callback = [&]() -> sk_sp<DisplayList> {
255 ImGuiWindowFlags_AlwaysAutoResize)) {
256 ImGui::Checkbox(
"has color filter", &has_color_filter);
260 DisplayListBuilder builder;
261 builder.Scale(GetContentScale().
x, GetContentScale().y);
268 std::vector<DlBlendMode> blend_modes = {
269 DlBlendMode::kScreen, DlBlendMode::kOverlay,
270 DlBlendMode::kDarken, DlBlendMode::kLighten,
271 DlBlendMode::kColorDodge, DlBlendMode::kColorBurn,
272 DlBlendMode::kHardLight, DlBlendMode::kSoftLight,
273 DlBlendMode::kDifference, DlBlendMode::kExclusion,
274 DlBlendMode::kMultiply, DlBlendMode::kHue,
275 DlBlendMode::kSaturation, DlBlendMode::kColor,
276 DlBlendMode::kLuminosity,
279 for (uint32_t i = 0; i < blend_modes.size(); ++i) {
281 builder.Translate((i % 5) * 200, (i / 5) * 200);
282 builder.Scale(0.4, 0.4);
285 builder.DrawImage(dst_image, SkPoint{0, 0},
286 DlImageSampling::kMipmapLinear, &dstPaint);
290 srcPaint.setBlendMode(blend_modes[i]);
291 if (has_color_filter) {
292 std::shared_ptr<const DlColorFilter> color_filter =
293 DlColorFilter::MakeBlend(DlColor::RGBA(0.9, 0.5, 0.0, 1.0),
294 DlBlendMode::kSrcIn);
295 srcPaint.setColorFilter(color_filter);
297 builder.DrawImage(src_image, SkPoint{0, 0},
298 DlImageSampling::kMipmapLinear, &srcPaint);
302 return builder.Build();
304 ASSERT_TRUE(OpenPlaygroundHere(callback));
313 <<
"This backend doesn't yet support setting device capabilities.";
315 if (!WillRenderSomething()) {
316 GTEST_SKIP() <<
"This test requires playgrounds.";
319 std::shared_ptr<const Capabilities> old_capabilities =
320 GetContext()->GetCapabilities();
321 auto mock_capabilities = std::make_shared<MockCapabilities>();
322 EXPECT_CALL(*mock_capabilities, SupportsFramebufferFetch())
323 .Times(::testing::AtLeast(1))
324 .WillRepeatedly(::testing::Return(
false));
325 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultColorFormat);
326 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultStencilFormat);
327 FLT_FORWARD(mock_capabilities, old_capabilities,
328 GetDefaultDepthStencilFormat);
329 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsOffscreenMSAA);
330 FLT_FORWARD(mock_capabilities, old_capabilities,
331 SupportsImplicitResolvingMSAA);
332 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsReadFromResolve);
333 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsSSBO);
334 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsCompute);
335 FLT_FORWARD(mock_capabilities, old_capabilities,
336 SupportsTextureToTextureBlits);
337 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultGlyphAtlasFormat);
338 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsTriangleFan);
339 FLT_FORWARD(mock_capabilities, old_capabilities,
340 SupportsDecalSamplerAddressMode);
341 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsPrimitiveRestart);
342 ASSERT_TRUE(SetCapabilities(mock_capabilities).ok());
344 bool has_color_filter =
true;
345 auto callback = [&]() -> sk_sp<DisplayList> {
347 ImGuiWindowFlags_AlwaysAutoResize)) {
348 ImGui::Checkbox(
"has color filter", &has_color_filter);
352 DisplayListBuilder builder;
353 builder.Scale(GetContentScale().
x, GetContentScale().y);
360 std::vector<DlBlendMode> blend_modes = {
361 DlBlendMode::kScreen, DlBlendMode::kOverlay,
362 DlBlendMode::kDarken, DlBlendMode::kLighten,
363 DlBlendMode::kColorDodge, DlBlendMode::kColorBurn,
364 DlBlendMode::kHardLight, DlBlendMode::kSoftLight,
365 DlBlendMode::kDifference, DlBlendMode::kExclusion,
366 DlBlendMode::kMultiply, DlBlendMode::kHue,
367 DlBlendMode::kSaturation, DlBlendMode::kColor,
368 DlBlendMode::kLuminosity,
371 for (uint32_t i = 0; i < blend_modes.size(); ++i) {
373 builder.Translate((i % 5) * 200, (i / 5) * 200);
374 builder.Scale(0.4, 0.4);
377 builder.DrawImage(dst_image, SkPoint{0, 0},
378 DlImageSampling::kMipmapLinear, &dstPaint);
382 srcPaint.setBlendMode(blend_modes[i]);
383 if (has_color_filter) {
384 std::shared_ptr<const DlColorFilter> color_filter =
385 DlColorFilter::MakeBlend(DlColor::RGBA(0.9, 0.5, 0.0, 1.0),
386 DlBlendMode::kMultiply);
387 srcPaint.setColorFilter(color_filter);
389 builder.DrawImage(src_image, SkPoint{0, 0},
390 DlImageSampling::kMipmapLinear, &srcPaint);
394 return builder.Build();
396 ASSERT_TRUE(OpenPlaygroundHere(callback));
401 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
403 auto texture = CreateTextureForFixture(
"airplane.jpg",
406 DisplayListBuilder builder;
408 builder.Scale(GetContentScale().
x, GetContentScale().y);
410 paint.setColor(DlColor::RGBA(0.9, 1, 0.9, 1.0));
411 builder.DrawPaint(paint);
412 builder.SaveLayer(
nullptr);
414 paint.setBlendMode(DlBlendMode::kPlus);
415 paint.setColor(DlColor::kRed());
417 builder.DrawRect(SkRect::MakeXYWH(100, 100, 400, 400), paint);
418 paint.setColor(DlColor::kWhite());
421 builder.DrawImageRect(
424 SkSize::Make(texture->GetSize().width, texture->GetSize().height)),
425 SkRect::MakeLTRB(rect.GetLeft(), rect.GetTop(), rect.GetRight(),
427 DlImageSampling::kMipmapLinear, &paint);
429 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
434 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
436 auto texture = CreateTextureForFixture(
"airplane.jpg",
439 DisplayListBuilder builder;
440 builder.Scale(GetContentScale().
x, GetContentScale().y);
443 paint.setColor(DlColor::RGBA(0.1, 0.2, 0.1, 1.0));
444 builder.DrawPaint(paint);
447 save_paint.setColorFilter(
448 DlColorFilter::MakeBlend(DlColor::RGBA(1, 0, 0, 1), DlBlendMode::kPlus));
449 builder.SaveLayer(
nullptr, &save_paint);
451 paint.setColor(DlColor::kRed());
452 builder.DrawRect(SkRect::MakeXYWH(100, 100, 400, 400), paint);
454 paint.setColor(DlColor::kWhite());
457 builder.DrawImageRect(
460 SkSize::Make(texture->GetSize().width, texture->GetSize().height)),
461 SkRect::MakeLTRB(rect.GetLeft(), rect.GetTop(), rect.GetRight(),
463 DlImageSampling::kMipmapLinear, &paint);
466 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
470 DisplayListBuilder builder;
473 save_paint.setColorFilter(
474 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kColorDodge));
475 builder.SaveLayer(
nullptr, &save_paint);
477 builder.Translate(500, 300);
481 paint.setColor(DlColor::kBlue());
482 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), paint);
484 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
488 DisplayListBuilder builder;
491 blue.setColor(DlColor::kBlue());
492 builder.DrawRect(SkRect::MakeXYWH(0, 0, 600.0, 600.0), blue);
495 clear.setBlendMode(DlBlendMode::kClear);
497 builder.DrawCircle(SkPoint{300.0, 300.0}, 200.0, clear);
499 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
504 const sk_sp<DlImageImpeller>& src_image,
505 const sk_sp<DlImageImpeller>& dst_image,
508 ImGuiWindowFlags_AlwaysAutoResize)) {
509 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
518 DisplayListBuilder builder;
521 paint.setColor(DlColor::kBlack());
522 builder.DrawPaint(paint);
533 for (
const auto& color : source_colors) {
536 builder.ClipRect(SkRect::MakeXYWH(25, 25, 100, 100));
540 builder.SaveLayer({});
544 DlColor::RGBA(destination_color.
red, destination_color.
green,
545 destination_color.
blue, destination_color.
alpha));
546 builder.DrawPaint(draw_paint);
551 save_paint.setBlendMode(
static_cast<DlBlendMode
>(blend_mode));
552 builder.SaveLayer(
nullptr, &save_paint);
556 DlColor::RGBA(color.red, color.green, color.blue, color.alpha));
557 builder.DrawRect(SkRect::MakeXYWH(25, 25, 100, 100), paint);
564 builder.Translate(100, 0);
566 builder.RestoreToCount(0);
573 builder.Translate(0, 100);
576 builder.SaveLayer({});
577 for (
const auto& color : source_colors) {
580 auto dest = destination_color.
Blend(color, blend_mode);
581 paint.setColor(DlColor::RGBA(dest.red, dest.green, dest.blue, dest.alpha));
582 paint.setBlendMode(DlBlendMode::kSrcOver);
583 builder.DrawRect(SkRect::MakeXYWH(25, 25, 100, 100), paint);
584 builder.Translate(100, 0);
596 builder.Translate(0, 250);
601 paint.setColor(DlColor::RGBA(41 / 255.0, 41 / 255.0, 41 / 255.0, 1));
602 builder.DrawRect(SkRect::MakeLTRB(0, 0, 800, 400), paint);
605 DlPaint square_paint;
606 square_paint.setColor(DlColor::RGBA(15 / 255.0, 15 / 255.0, 15 / 255.0, 1));
607 for (
int y = 0; y < 400 / 8; y++) {
608 for (
int x = 0;
x < 800 / 16;
x++) {
609 builder.DrawRect(SkRect::MakeXYWH(
x * 16 + (y % 2) * 8, y * 8, 8, 8),
616 paint.setBlendMode(DlBlendMode::kSrcOver);
618 builder.SaveLayer(
nullptr, &paint);
620 builder.DrawImage(dst_image, SkPoint{0, 0}, DlImageSampling::kMipmapLinear,
623 paint.setColor(DlColor::kWhite().withAlpha(src_alpha * 255));
624 paint.setBlendMode(
static_cast<DlBlendMode
>(blend_mode));
625 builder.DrawImage(src_image, SkPoint{0, 0}, DlImageSampling::kMipmapLinear,
635 builder.SaveLayer(
nullptr, &save_paint);
637 builder.DrawImage(dst_image, SkPoint{400, 0},
638 DlImageSampling::kMipmapLinear,
nullptr);
641 save_paint.setColor(DlColor::kWhite().withAlpha(src_alpha * 255));
642 save_paint.setBlendMode(
static_cast<DlBlendMode
>(blend_mode));
643 builder.SaveLayer(
nullptr, &save_paint);
645 builder.DrawImage(src_image, SkPoint{400, 0},
646 DlImageSampling::kMipmapLinear,
nullptr);
653 return builder.Build();
656 #define BLEND_MODE_TEST(blend_mode) \
657 TEST_P(AiksTest, BlendMode##blend_mode) { \
659 DlImageImpeller::Make(CreateTextureForFixture("blend_mode_src.png")); \
661 DlImageImpeller::Make(CreateTextureForFixture("blend_mode_dst.png")); \
662 auto callback = [&]() -> sk_sp<DisplayList> { \
663 return BlendModeTest(GetContentScale(), BlendMode::k##blend_mode, \
664 src_image, dst_image,
1.0); \
666 OpenPlaygroundHere(callback); \
670 #define BLEND_MODE_SRC_ALPHA_TEST(blend_mode) \
671 TEST_P(AiksTest, BlendModeSrcAlpha##blend_mode) { \
673 DlImageImpeller::Make(CreateTextureForFixture("blend_mode_src.png")); \
675 DlImageImpeller::Make(CreateTextureForFixture("blend_mode_dst.png")); \
676 auto callback = [&]() -> sk_sp<DisplayList> { \
677 return BlendModeTest(GetContentScale(), BlendMode::k##blend_mode, \
678 src_image, dst_image,
0.5); \
680 OpenPlaygroundHere(callback); \
687 auto callback = [&]() -> sk_sp<DisplayList> {
689 static Color foreground = Color::Color::OrangeRed().
WithAlpha(0.5);
690 static int current_blend_index = 3;
693 ImGuiWindowFlags_AlwaysAutoResize)) {
694 ImGui::ColorEdit4(
"Background",
reinterpret_cast<float*
>(&background));
695 ImGui::ColorEdit4(
"Foreground",
reinterpret_cast<float*
>(&foreground));
696 ImGui::ListBox(
"Blend mode", ¤t_blend_index,
697 modes.blend_mode_names.data(),
698 modes.blend_mode_names.size());
702 DisplayListBuilder builder;
703 builder.Scale(0.2, 0.2);
705 paint.setColor(DlColor(background.
ToARGB()));
706 builder.DrawPaint(paint);
708 paint.setColor(DlColor(foreground.
ToARGB()));
709 paint.setBlendMode(
static_cast<DlBlendMode
>(current_blend_index));
710 builder.DrawPaint(paint);
711 return builder.Build();
713 ASSERT_TRUE(OpenPlaygroundHere(callback));
717 auto texture = CreateTextureForFixture(
"airplane.jpg",
720 DisplayListBuilder builder;
724 image_paint.setColorFilter(DlColorFilter::MakeBlend(
725 DlColor::RGBA(255.0f / 255.0f, 165.0f / 255.0f, 0.0f / 255.0f, 1.0f),
726 DlBlendMode::kSrcIn));
729 DlImageSampling::kMipmapLinear, &image_paint);
731 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
735 auto texture = CreateTextureForFixture(
"airplane.jpg",
738 DisplayListBuilder builder;
742 image_paint.setColorFilter(DlColorFilter::MakeBlend(
743 DlColor::RGBA(255.0f / 255.0f, 165.0f / 255.0f, 0.0f / 255.0f, 1.0f),
744 DlBlendMode::kColorDodge));
747 DlImageSampling::kMipmapLinear, &image_paint);
749 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
753 auto texture = CreateTextureForFixture(
"airplane.jpg",
758 DisplayListBuilder builder;
762 DlColor::RGBA(169.0f / 255.0f, 169.0f / 255.0f, 169.0f / 255.0f, 1.0f));
763 builder.DrawPaint(paint);
764 builder.Scale(0.4, 0.4);
767 image_paint.setBlendMode(DlBlendMode::kMultiply);
770 DlImageSampling::kMipmapLinear, &image_paint);
772 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
780 auto draw_color_wheel = [](DisplayListBuilder& builder) ->
void {
783 auto color_wheel_sampler = [](
Radians r) {
787 auto color_cycle = [](
Scalar x) {
788 Scalar cycle = std::fmod(
x, 6.0f);
789 return std::max(0.0f, std::min(1.0f, 2 - std::abs(2 - cycle)));
791 return Color(color_cycle(6 *
x + 1),
792 color_cycle(6 *
x - 1),
793 color_cycle(6 *
x - 3),
798 paint.setBlendMode(DlBlendMode::kSrcOver);
802 const int max_dist = 900;
803 for (
int i = 0; i <= 900; i++) {
806 Scalar normalized_distance =
static_cast<Scalar>(i) / max_dist;
808 auto color = color_wheel_sampler(r).WithAlpha(1.0f - normalized_distance);
810 DlColor::RGBA(color.red, color.green, color.blue, color.alpha));
814 builder.DrawCircle(position, 9 + normalized_distance * 3, paint);
818 auto callback = [&]() -> sk_sp<DisplayList> {
820 static bool cache_the_wheel =
true;
821 static int current_blend_index = 3;
822 static float dst_alpha = 1;
823 static float src_alpha = 1;
824 static DlColor color0 = DlColor::kRed();
825 static DlColor color1 = DlColor::kGreen();
826 static DlColor color2 = DlColor::kBlue();
829 ImGuiWindowFlags_AlwaysAutoResize)) {
830 ImGui::Checkbox(
"Cache the wheel", &cache_the_wheel);
831 ImGui::ListBox(
"Blending mode", ¤t_blend_index,
834 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
835 ImGui::ColorEdit4(
"Color A",
reinterpret_cast<float*
>(&color0));
836 ImGui::ColorEdit4(
"Color B",
reinterpret_cast<float*
>(&color1));
837 ImGui::ColorEdit4(
"Color C",
reinterpret_cast<float*
>(&color2));
838 ImGui::SliderFloat(
"Destination alpha", &dst_alpha, 0, 1);
842 DisplayListBuilder builder;
845 paint.setColor(DlColor::kWhite().withAlpha(dst_alpha * 255));
846 paint.setBlendMode(DlBlendMode::kSrc);
847 builder.SaveLayer(
nullptr, &paint);
850 paint.setColor(DlColor::kWhite());
851 builder.DrawPaint(paint);
853 builder.SaveLayer(
nullptr,
nullptr);
854 builder.Scale(GetContentScale().
x, GetContentScale().y);
855 builder.Translate(500, 400);
857 draw_color_wheel(builder);
862 builder.Scale(GetContentScale().
x, GetContentScale().y);
863 builder.Translate(500, 400);
868 save_paint.setColor(DlColor::kWhite().withAlpha(src_alpha * 255));
869 save_paint.setBlendMode(
static_cast<DlBlendMode
>(
871 builder.SaveLayer(
nullptr, &save_paint);
874 paint.setBlendMode(DlBlendMode::kPlus);
877 paint.setColor(color0);
878 builder.DrawCircle(SkPoint::Make(-
x * 45, y * 45), 65, paint);
879 paint.setColor(color1);
880 builder.DrawCircle(SkPoint::Make(0, -45), 65, paint);
881 paint.setColor(color2);
882 builder.DrawCircle(SkPoint::Make(
x * 45, y * 45), 65, paint);
886 return builder.Build();
889 ASSERT_TRUE(OpenPlaygroundHere(callback));
893 DisplayListBuilder builder;
896 paint.setColor(DlColor::kBlue());
897 builder.DrawPaint(paint);
900 save_paint.setColorFilter(
901 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kSrc));
902 builder.SaveLayer(
nullptr, &save_paint);
906 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
910 DisplayListBuilder builder;
912 builder.DrawPaint(DlPaint(DlColor::kWhite()));
915 save_paint.setOpacity(0.3);
916 save_paint.setColorFilter(DlColorFilter::MakeBlend(DlColor::kTransparent(),
917 DlBlendMode::kSaturation));
918 builder.SaveLayer(
nullptr, &save_paint);
919 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300),
920 DlPaint(DlColor::kMaroon()));
921 builder.DrawRect(SkRect::MakeXYWH(200, 200, 300, 300),
922 DlPaint(DlColor::kBlue()));
926 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