5 #include "display_list/display_list.h"
6 #include "display_list/dl_blend_mode.h"
7 #include "display_list/dl_builder.h"
8 #include "display_list/dl_color.h"
9 #include "display_list/dl_paint.h"
10 #include "display_list/dl_sampling_options.h"
11 #include "display_list/dl_tile_mode.h"
12 #include "display_list/effects/dl_color_filter.h"
13 #include "display_list/effects/dl_color_source.h"
14 #include "display_list/effects/dl_image_filter.h"
15 #include "display_list/effects/dl_mask_filter.h"
18 #include "gmock/gmock.h"
22 #include "impeller/renderer/testing/mocks.h"
23 #include "include/core/SkRRect.h"
24 #include "include/core/SkRect.h"
25 #include "third_party/imgui/imgui.h"
40 DisplayListBuilder builder;
41 builder.Scale(GetContentScale().x, GetContentScale().y);
43 std::vector<float> sigmas = {0.0, 0.01, 1.0};
44 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
46 for (uint32_t i = 0; i < sigmas.size(); ++i) {
48 paint.setColor(colors[i]);
50 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
53 builder.Translate(100 + (i * 100), 100);
55 SkRRect::MakeRectXY(SkRect::MakeXYWH(0, 0, 60.0f, 160.0f), 50, 100);
56 builder.DrawRRect(rrect, paint);
60 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
66 DisplayListBuilder builder;
67 builder.Scale(content_Scale.
x, content_Scale.
y);
69 DlPaint background_paint;
70 background_paint.setColor(DlColor(1, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
71 builder.DrawPaint(background_paint);
73 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue()};
74 std::vector<Scalar> stops = {0.0, 1.0};
77 paint.setMaskFilter(DlBlurMaskFilter::Make(style, sigma));
78 auto gradient = DlColorSource::MakeLinear(
79 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kClamp);
80 paint.setColorSource(gradient);
81 paint.setColor(DlColor::kWhite());
82 paint.setDrawStyle(DlDrawStyle::kStroke);
83 paint.setStrokeWidth(20);
86 builder.Translate(100, 100);
90 line_paint.setColor(DlColor::kWhite());
91 builder.DrawLine({100, 0}, {100, 60}, line_paint);
92 builder.DrawLine({0, 30}, {200, 30}, line_paint);
96 SkRRect::MakeRectXY(SkRect::MakeXYWH(0, 0, 200.0f, 60.0f), 50, 100);
97 builder.DrawRRect(rrect, paint);
100 return builder.Build();
106 GetContentScale(), 10, DlBlurStyle::kNormal)));
111 GetContentScale(), 0, DlBlurStyle::kNormal)));
116 GetContentScale(), 10, DlBlurStyle::kOuter)));
121 GetContentScale(), 10, DlBlurStyle::kInner)));
126 GetContentScale(), 10, DlBlurStyle::kSolid)));
130 DisplayListBuilder builder;
131 builder.Scale(GetContentScale().x, GetContentScale().y);
133 std::vector<float> sigmas = {0.0, 0.01, 1.0};
134 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
136 for (uint32_t i = 0; i < sigmas.size(); ++i) {
138 paint.setColor(colors[i]);
140 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
143 builder.Translate(100 + (i * 100), 100);
145 SkRRect::MakeRectXY(SkRect::MakeXYWH(0, 0, 100.0f, 100.0f), 100, 100);
146 builder.DrawRRect(rrect, paint);
150 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
154 DisplayListBuilder builder;
157 paint.setColor(DlColor::kGreen());
158 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 99999));
159 builder.DrawCircle({400, 400}, 300, paint);
162 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
168 DisplayListBuilder builder;
169 builder.ClipRect(SkRect::MakeXYWH(100, 150, 400, 400));
172 paint.setColor(DlColor::kWhite());
176 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
177 paint.setColorFilter(
178 DlBlendColorFilter::Make(DlColor::kGreen(), DlBlendMode::kSrc));
179 builder.DrawCircle({400, 400}, 200, paint);
181 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
187 DisplayListBuilder builder;
188 builder.ClipRect(SkRect::MakeXYWH(100, 150, 400, 400));
192 DlColor::RGBA(128.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1.0f));
196 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
197 paint.setColorFilter(
198 DlBlendColorFilter::Make(DlColor::kGreen(), DlBlendMode::kColor));
199 builder.DrawCircle({400, 400}, 200, paint);
202 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
206 auto callback = [&]() -> sk_sp<DisplayList> {
211 DisplayListBuilder builder;
213 paint.setColor(DlColor::kCornflowerBlue());
214 builder.DrawCircle({100, 100}, 50, paint);
216 paint.setColor(DlColor::kGreenYellow());
217 builder.DrawCircle({300, 200}, 100, paint);
219 paint.setColor(DlColor::kDarkMagenta());
220 builder.DrawCircle({140, 170}, 75, paint);
222 paint.setColor(DlColor::kOrangeRed());
223 builder.DrawCircle({180, 120}, 100, paint);
226 SkRRect::MakeRectXY(SkRect::MakeLTRB(a.x, a.y,
b.x,
b.y), 20, 20);
227 builder.ClipRRect(rrect);
230 save_paint.setBlendMode(DlBlendMode::kSrc);
232 auto backdrop_filter = DlBlurImageFilter::Make(20, 20, DlTileMode::kClamp);
233 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
236 return builder.Build();
239 ASSERT_TRUE(OpenPlaygroundHere(callback));
243 DisplayListBuilder builder;
246 paint.setColor(DlColor::kCornflowerBlue());
247 builder.DrawCircle({100, 100}, 50, paint);
249 paint.setColor(DlColor::kGreenYellow());
250 builder.DrawCircle({300, 200}, 100, paint);
252 paint.setColor(DlColor::kDarkMagenta());
253 builder.DrawCircle({140, 170}, 75, paint);
255 paint.setColor(DlColor::kOrangeRed());
256 builder.DrawCircle({180, 120}, 100, paint);
259 SkRRect::MakeRectXY(SkRect::MakeLTRB(75, 50, 375, 275), 20, 20);
260 builder.ClipRRect(rrect);
263 save_paint.setBlendMode(DlBlendMode::kSrc);
264 auto backdrop_filter = DlBlurImageFilter::Make(30, 30, DlTileMode::kClamp);
265 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
268 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
272 DisplayListBuilder builder;
275 paint.setColor(DlColor::kGreen());
276 builder.DrawCircle({400, 400}, 300, paint);
279 save_paint.setBlendMode(DlBlendMode::kSrc);
281 auto backdrop_filter =
282 DlBlurImageFilter::Make(999999, 999999, DlTileMode::kClamp);
283 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
286 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
290 DisplayListBuilder builder;
291 builder.ClipRect(SkRect::MakeXYWH(100, 150, 400, 400));
294 paint.setColor(DlColor::kGreen());
295 paint.setImageFilter(DlBlurImageFilter::Make(20, 20, DlTileMode::kDecal));
296 builder.DrawCircle({400, 400}, 200, paint);
299 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
303 auto callback = [&]() -> sk_sp<DisplayList> {
308 DisplayListBuilder builder;
309 auto location = point -
Point(400, 400);
310 builder.Translate(location.x, location.y);
315 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
316 paint.setColor(DlColor::kRed());
318 SkPath path =
SkPath::Rect(SkRect::MakeLTRB(0, 0, 800, 800));
319 path.addCircle(0, 0, 0.5);
320 builder.DrawPath(path, paint);
321 return builder.Build();
323 ASSERT_TRUE(OpenPlaygroundHere(callback));
327 DisplayListBuilder builder;
328 builder.Translate(0, -400);
333 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
334 paint.setColor(DlColor::kRed());
336 SkPath path =
SkPath::Rect(SkRect::MakeLTRB(0, 0, 800, 800));
337 path.addCircle(0, 0, 0.5);
338 builder.DrawPath(path, paint);
340 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
344 DisplayListBuilder builder;
346 paint.setColor(DlColor::kBlue());
347 builder.DrawRect(SkRect::MakeXYWH(0, 0, 600.0, 600.0), paint);
350 clear.setBlendMode(DlBlendMode::kClear);
351 clear.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
353 builder.DrawCircle({300.0, 300.0}, 200.0, clear);
355 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
360 auto callback = [&]() -> sk_sp<DisplayList> {
362 ImGuiWindowFlags_AlwaysAutoResize)) {
363 ImGui::SliderFloat(
"Sigma", &sigma, 0, 50);
366 DisplayListBuilder builder;
367 builder.Scale(GetContentScale().x, GetContentScale().y);
368 builder.DrawPaint({});
371 paint.setColor(DlColor::kGreen());
372 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
374 builder.DrawRect(SkRect::MakeXYWH(300, 300, 200, 200), paint);
375 return builder.Build();
378 ASSERT_TRUE(OpenPlaygroundHere(callback));
382 DisplayListBuilder builder;
385 paint.setColor(DlColor::kBlue());
386 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 0));
388 builder.DrawCircle({300, 300}, 200, paint);
389 builder.DrawRect(SkRect::MakeLTRB(100, 300, 500, 600), paint);
391 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
395 DlBlurStyle style = DlBlurStyle::kNormal;
399 bool invert_colors =
false;
400 DlBlendMode blend_mode = DlBlendMode::kSrcOver;
406 DisplayListBuilder builder;
409 builder.Scale(0.8f, 0.8f);
410 builder.Translate(50.f, 50.f);
416 builder.DrawPaint(draw_paint);
419 paint.setMaskFilter(DlBlurMaskFilter::Make(config.
style, config.
sigma));
425 const Scalar radius = 20.0f;
426 const Scalar y_spacing = 100.0f;
430 paint.setColor(DlColor::kCrimson().withAlpha(alpha));
431 builder.DrawRect(SkRect::MakeXYWH(x + 25 - radius / 2, y + radius / 2,
432 radius, 60.0f - radius),
436 paint.setColor(DlColor::kBlue().withAlpha(alpha));
437 builder.DrawCircle({x + 25, y + 25}, radius, paint);
440 paint.setColor(DlColor::kGreen().withAlpha(alpha));
441 builder.DrawOval(SkRect::MakeXYWH(x + 25 - radius / 2, y + radius / 2,
442 radius, 60.0f - radius),
446 paint.setColor(DlColor::kPurple().withAlpha(alpha));
448 SkRRect::MakeRectXY(SkRect::MakeXYWH(x, y, 60.0f, 60.0f), radius, radius);
449 builder.DrawRRect(rrect, paint);
452 paint.setColor(DlColor::kOrange().withAlpha(alpha));
455 SkRRect::MakeRectXY(SkRect::MakeXYWH(x, y, 60.0f, 60.0f), radius, 5.0);
456 builder.DrawRRect(rrect, paint);
459 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
463 path.moveTo(x + 0, y + 60);
464 path.lineTo(x + 30, y + 0);
465 path.lineTo(x + 60, y + 60);
468 builder.DrawPath(path, paint);
472 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
475 path.addArc(SkRect::MakeXYWH(x + 5, y, 50, 50), 90, 180);
476 path.addArc(SkRect::MakeXYWH(x + 25, y, 50, 50), 90, 180);
478 builder.DrawPath(path, paint);
481 return builder.Build();
486 {
"NormalTranslucentZeroSigma",
487 {.style = DlBlurStyle::kNormal, .sigma = 0.0f, .alpha = 0.5f}},
489 {
"NormalTranslucent",
490 {.style = DlBlurStyle::kNormal, .sigma = 8.0f, .alpha = 0.5f}},
493 {.style = DlBlurStyle::kSolid, .sigma = 8.0f, .alpha = 0.5f}},
495 {
"SolidOpaque", {.style = DlBlurStyle::kSolid, .sigma = 8.0f}},
497 {
"SolidTranslucentWithFilters",
498 {.style = DlBlurStyle::kSolid,
501 .image_filter = DlBlurImageFilter::Make(3, 3, DlTileMode::kClamp),
502 .invert_colors =
true}},
504 {
"SolidTranslucentExclusionBlend",
505 {.style = DlBlurStyle::kSolid,
508 .blend_mode = DlBlendMode::kExclusion}},
511 {.style = DlBlurStyle::kInner, .sigma = 8.0f, .alpha = 0.5f}},
513 {
"InnerTranslucentWithBlurImageFilter",
514 {.style = DlBlurStyle::kInner,
517 .image_filter = DlBlurImageFilter::Make(3, 3, DlTileMode::kClamp)}},
520 {.style = DlBlurStyle::kOuter, .sigma = 8.0f, .alpha = 0.5f}},
522 {
"OuterOpaqueWithBlurImageFilter",
523 {.style = DlBlurStyle::kOuter,
525 .image_filter = DlBlurImageFilter::Make(3, 3, DlTileMode::kClamp)}},
528 #define MASK_BLUR_VARIANT_TEST(config) \
529 TEST_P(AiksTest, MaskBlurVariantTest##config) { \
530 ASSERT_TRUE(OpenPlaygroundHere( \
531 MaskBlurVariantTest(*this, kPaintVariations.at(#config)))); \
545 #undef MASK_BLUR_VARIANT_TEST
548 DisplayListBuilder builder;
549 builder.Scale(GetContentScale().x, GetContentScale().y);
552 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1));
553 builder.DrawPaint(paint);
555 paint.setColor(DlColor::kGreen());
556 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
559 path.moveTo(200, 200);
560 path.lineTo(300, 400);
561 path.lineTo(100, 400);
564 builder.DrawPath(path, paint);
568 red.setColor(DlColor::kRed());
569 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
571 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
575 DisplayListBuilder builder;
576 builder.Scale(GetContentScale().x, GetContentScale().y);
579 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
580 builder.DrawPaint(paint);
582 paint.setColor(DlColor::kGreen());
583 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
586 path.moveTo(200, 200);
587 path.lineTo(300, 400);
588 path.lineTo(100, 400);
591 builder.DrawPath(path, paint);
595 red.setColor(DlColor::kRed());
596 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
598 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
602 DisplayListBuilder builder;
603 builder.Scale(GetContentScale().x, GetContentScale().y);
606 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
607 builder.DrawPaint(paint);
609 paint.setColor(DlColor::kGreen());
610 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
613 path.moveTo(200, 200);
614 path.lineTo(300, 400);
615 path.lineTo(100, 400);
618 builder.DrawPath(path, paint);
622 red.setColor(DlColor::kRed());
623 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
625 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
630 auto callback = [&]() -> sk_sp<DisplayList> {
632 ImGuiWindowFlags_AlwaysAutoResize)) {
633 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
637 DisplayListBuilder builder;
638 builder.Scale(GetContentScale().x, GetContentScale().y);
641 paint.setColor(DlColor::kGreen());
642 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
646 {200, 200}, DlImageSampling::kNearestNeighbor, &paint);
649 red.setColor(DlColor::kRed());
650 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
652 return builder.Build();
654 ASSERT_TRUE(OpenPlaygroundHere(callback));
659 auto callback = [&]() -> sk_sp<DisplayList> {
661 ImGuiWindowFlags_AlwaysAutoResize)) {
662 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
666 DisplayListBuilder builder;
667 builder.Scale(GetContentScale().x, GetContentScale().y);
670 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
671 builder.DrawPaint(paint);
673 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
675 builder.Transform(SkMatrix::Translate(100, 100) *
676 SkMatrix::Scale(0.5, 0.5));
678 paint.setColorSource(std::make_shared<DlImageColorSource>(
680 DlImageSampling::kMipmapLinear));
681 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
683 builder.DrawRect(SkRect::MakeXYWH(0, 0, boston->GetSize().width,
684 boston->GetSize().height),
687 return builder.Build();
689 ASSERT_TRUE(OpenPlaygroundHere(callback));
693 DisplayListBuilder builder;
696 builder.Scale(GetContentScale().x, GetContentScale().y);
698 paint.setColor(DlColor::kLimeGreen());
699 SkRRect rrect = SkRRect::MakeRectXY(
700 SkRect::MakeLTRB(0, 0, GetWindowSize().width, 100), 10, 10);
701 builder.DrawRRect(rrect, paint);
703 paint.setColor(DlColor::kMagenta());
704 rrect = SkRRect::MakeRectXY(
705 SkRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
706 builder.DrawRRect(rrect, paint);
707 builder.ClipRect(SkRect::MakeLTRB(100, 0, 200, GetWindowSize().height));
710 save_paint.setBlendMode(DlBlendMode::kSrc);
712 auto backdrop_filter = DlBlurImageFilter::Make(20, 20, DlTileMode::kClamp);
714 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
717 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
721 DisplayListBuilder builder;
723 builder.Scale(GetContentScale().x, GetContentScale().y);
724 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
725 builder.DrawImageRect(
727 SkRect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height),
728 SkRect::MakeLTRB(0, 0, GetWindowSize().width, 100),
729 DlImageSampling::kNearestNeighbor);
732 paint.setColor(DlColor::kMagenta());
734 SkRRect rrect = SkRRect::MakeRectXY(
735 SkRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
736 builder.DrawRRect(rrect, paint);
737 builder.ClipRect(SkRect::MakeLTRB(0, 50, GetWindowSize().width, 150));
740 save_paint.setBlendMode(DlBlendMode::kSrc);
742 auto backdrop_filter = DlBlurImageFilter::Make(20, 20, DlTileMode::kClamp);
743 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
746 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
755 CreateTextureForFixture(
"boston.jpg",
true);
761 auto callback = [&]() -> sk_sp<DisplayList> {
763 ImGuiWindowFlags_AlwaysAutoResize)) {
764 ImGui::SliderFloat(
"Sigma", &sigma, 0, 200);
765 ImGui::SliderFloat(
"Frequency", &freq, 0.01, 2.0);
766 ImGui::SliderFloat(
"Amplitude", &, 1, 100);
770 DisplayListBuilder builder;
771 builder.Scale(GetContentScale().x, GetContentScale().y);
772 Scalar y = amp * sin(freq * 2.0 * M_PI * count / 60);
775 SkPoint::Make(1024 / 2 - boston->GetSize().width / 2,
776 (768 / 2 - boston->GetSize().height / 2) + y),
777 DlImageSampling::kMipmapLinear);
783 SkRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
784 builder.ClipRect(SkRect::MakeLTRB(100, 100, 900, 700));
787 paint.setBlendMode(DlBlendMode::kSrc);
789 auto backdrop_filter =
790 DlBlurImageFilter::Make(sigma, sigma, DlTileMode::kClamp);
791 builder.SaveLayer(
nullptr, &paint, backdrop_filter.get());
793 return builder.Build();
795 ASSERT_TRUE(OpenPlaygroundHere(callback));
799 DisplayListBuilder builder;
801 builder.Scale(GetContentScale().x, GetContentScale().y);
804 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
805 builder.DrawPaint(paint);
807 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
808 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
809 std::vector<Scalar> stops = {0.0, 1.0};
812 paint.setColorSource(DlColorSource::MakeLinear(
818 DlTileMode::kMirror));
819 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
822 path.moveTo(200, 200);
823 path.lineTo(300, 400);
824 path.lineTo(100, 400);
826 builder.DrawPath(path, paint);
830 red.setColor(DlColor::kRed());
831 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
833 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
837 DisplayListBuilder builder;
838 builder.Scale(GetContentScale().x, GetContentScale().y);
841 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
842 builder.DrawPaint(paint);
844 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
845 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
846 std::vector<Scalar> stops = {0.0, 1.0};
849 paint.setColorSource(DlColorSource::MakeLinear(
855 DlTileMode::kMirror));
856 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
859 path.moveTo(200, 200);
860 path.lineTo(300, 400);
861 path.lineTo(100, 400);
863 builder.DrawPath(path, paint);
867 red.setColor(DlColor::kRed());
868 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
869 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
873 DisplayListBuilder builder;
874 builder.Scale(GetContentScale().x, GetContentScale().y);
877 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
878 builder.DrawPaint(paint);
880 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
881 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
882 std::vector<Scalar> stops = {0.0, 1.0};
885 paint.setColorSource(DlColorSource::MakeLinear(
891 DlTileMode::kMirror));
892 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
895 path.moveTo(200, 200);
896 path.lineTo(300, 400);
897 path.lineTo(100, 400);
899 builder.DrawPath(path, paint);
903 red.setColor(DlColor::kRed());
904 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
905 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
909 DisplayListBuilder builder;
910 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
912 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
916 paint.setImageFilter(DlBlurImageFilter::Make(20, 20, DlTileMode::kDecal));
920 builder.Scale(GetContentScale().x, GetContentScale().y);
924 builder.ClipRect(SkRect::MakeLTRB(rect.GetLeft(), rect.GetTop(),
925 rect.GetRight(), rect.GetBottom()));
926 builder.Translate(center.
x, center.
y);
927 builder.Scale(0.6, 0.6);
929 SkRect sk_bounds = SkRect::MakeLTRB(bounds.
GetLeft(), bounds.
GetTop(),
932 SkRect sk_dst = SkRect::MakeLTRB(dest.
GetLeft(), dest.
GetTop(),
935 sk_dst, DlImageSampling::kNearestNeighbor,
938 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
942 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
944 auto callback = [&]() -> sk_sp<DisplayList> {
945 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
946 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
947 DlTileMode::kMirror, DlTileMode::kDecal};
949 static float rotation = 0;
950 static float scale = 0.6;
951 static int selected_tile_mode = 3;
954 ImGuiWindowFlags_AlwaysAutoResize)) {
955 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
956 ImGui::SliderFloat(
"Scale", &
scale, 0, 2.0);
957 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
958 sizeof(tile_mode_names) /
sizeof(
char*));
962 DisplayListBuilder builder;
964 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
967 paint.setImageFilter(
968 DlBlurImageFilter::Make(20, 20, tile_modes[selected_tile_mode]));
975 builder.Scale(GetContentScale().x, GetContentScale().y);
977 SkRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
978 builder.Translate(center.
x, center.
y);
982 SkRect sk_bounds = SkRect::MakeLTRB(bounds.
GetLeft(), bounds.
GetTop(),
985 SkRect sk_dst = SkRect::MakeLTRB(dest.
GetLeft(), dest.
GetTop(),
988 sk_dst, DlImageSampling::kNearestNeighbor,
990 return builder.Build();
993 ASSERT_TRUE(OpenPlaygroundHere(callback));
997 DisplayListBuilder builder;
999 builder.Scale(GetContentScale().x, GetContentScale().y);
1000 builder.Scale(0.5, 0.5);
1002 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1006 paint.setBlendMode(DlBlendMode::kSrc);
1008 auto backdrop_filter = DlBlurImageFilter::Make(50, 0, DlTileMode::kClamp);
1009 builder.SaveLayer(
nullptr, &paint, backdrop_filter.get());
1011 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1019 DisplayListBuilder builder;
1021 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1023 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1026 paint.setImageFilter(DlBlurImageFilter::Make(20, 20, DlTileMode::kDecal));
1029 Vector2 clip_size = {150, 75};
1031 builder.Scale(GetContentScale().x, GetContentScale().y);
1035 builder.ClipRect(SkRect::MakeLTRB(clip_bounds.GetLeft(), clip_bounds.GetTop(),
1036 clip_bounds.GetRight(),
1037 clip_bounds.GetBottom()));
1038 builder.Translate(center.
x, center.
y);
1039 builder.Scale(0.6, 0.6);
1042 auto dst_rect = bounds.
Shift(-image_center);
1043 builder.DrawImageRect(
1048 SkRect::MakeLTRB(dst_rect.GetLeft(), dst_rect.GetTop(),
1049 dst_rect.GetRight(), dst_rect.GetBottom()),
1050 DlImageSampling::kMipmapLinear, &paint);
1052 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1056 auto callback = [&]() -> sk_sp<DisplayList> {
1057 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
1058 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
1059 DlTileMode::kMirror, DlTileMode::kDecal};
1061 static float rotation = 45;
1062 static float scale = 0.6;
1063 static int selected_tile_mode = 3;
1066 ImGuiWindowFlags_AlwaysAutoResize)) {
1067 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
1068 ImGui::SliderFloat(
"Scale", &
scale, 0, 2.0);
1069 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
1070 sizeof(tile_mode_names) /
sizeof(
char*));
1074 DisplayListBuilder builder;
1077 paint.setColor(DlColor::kGreen());
1078 paint.setImageFilter(
1079 DlBlurImageFilter::Make(50, 0, tile_modes[selected_tile_mode]));
1082 builder.Scale(GetContentScale().x, GetContentScale().y);
1083 builder.Translate(center.
x, center.
y);
1085 builder.
Rotate(rotation);
1088 SkRRect::MakeRectXY(SkRect::MakeXYWH(-100, -100, 200, 200), 10, 10);
1089 builder.DrawRRect(rrect, paint);
1090 return builder.Build();
1093 ASSERT_TRUE(OpenPlaygroundHere(callback));
1097 DisplayListBuilder builder;
1098 builder.Scale(GetContentScale().x, GetContentScale().y);
1100 auto paint_lines = [&builder](
Scalar dx,
Scalar dy, DlPaint paint) {
1101 auto draw_line = [&builder, &paint](SkPoint a, SkPoint
b) {
1102 SkPath line = SkPath::Line(a,
b);
1103 builder.DrawPath(line, paint);
1105 paint.setStrokeWidth(5);
1106 paint.setDrawStyle(DlDrawStyle::kStroke);
1107 draw_line(SkPoint::Make(dx + 100, dy + 100),
1108 SkPoint::Make(dx + 200, dy + 200));
1109 draw_line(SkPoint::Make(dx + 100, dy + 200),
1110 SkPoint::Make(dx + 200, dy + 100));
1111 draw_line(SkPoint::Make(dx + 150, dy + 100),
1112 SkPoint::Make(dx + 200, dy + 150));
1113 draw_line(SkPoint::Make(dx + 100, dy + 150),
1114 SkPoint::Make(dx + 150, dy + 200));
1118 DisplayListBuilder recorder_builder;
1119 for (
int x = 0; x < 5; ++x) {
1120 for (
int y = 0; y < 5; ++y) {
1121 SkRect rect = SkRect::MakeXYWH(x * 20, y * 20, 20, 20);
1123 paint.setColor(((x + y) & 1) == 0 ? DlColor::kYellow()
1124 : DlColor::kBlue());
1126 recorder_builder.DrawRect(rect, paint);
1132 auto image_source = std::make_shared<DlImageColorSource>(
1134 auto blur_filter = DlBlurImageFilter::Make(5, 5, DlTileMode::kDecal);
1137 paint.setColor(DlColor::kDarkGreen());
1138 builder.DrawRect(SkRect::MakeLTRB(0, 0, 300, 600), paint);
1140 paint.setColorSource(image_source);
1141 builder.DrawRect(SkRect::MakeLTRB(100, 100, 200, 200), paint);
1143 paint.setColorSource(
nullptr);
1144 paint.setColor(DlColor::kRed());
1145 builder.DrawRect(SkRect::MakeLTRB(300, 0, 600, 600), paint);
1147 paint.setColorSource(image_source);
1148 paint.setImageFilter(blur_filter);
1149 builder.DrawRect(SkRect::MakeLTRB(400, 100, 500, 200), paint);
1151 paint.setImageFilter(
nullptr);
1152 paint_lines(0, 300, paint);
1154 paint.setImageFilter(blur_filter);
1155 paint_lines(300, 300, paint);
1157 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1163 <<
"This backend doesn't yet support setting device capabilities.";
1165 if (!WillRenderSomething()) {
1169 GTEST_SKIP() <<
"This test requires playgrounds.";
1172 std::shared_ptr<const Capabilities> old_capabilities =
1173 GetContext()->GetCapabilities();
1174 auto mock_capabilities = std::make_shared<MockCapabilities>();
1175 EXPECT_CALL(*mock_capabilities, SupportsDecalSamplerAddressMode())
1176 .Times(::testing::AtLeast(1))
1177 .WillRepeatedly(::testing::Return(
false));
1178 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultColorFormat);
1179 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultStencilFormat);
1180 FLT_FORWARD(mock_capabilities, old_capabilities,
1181 GetDefaultDepthStencilFormat);
1182 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsOffscreenMSAA);
1183 FLT_FORWARD(mock_capabilities, old_capabilities,
1184 SupportsImplicitResolvingMSAA);
1185 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsReadFromResolve);
1186 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsFramebufferFetch);
1187 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsSSBO);
1188 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsCompute);
1189 FLT_FORWARD(mock_capabilities, old_capabilities,
1190 SupportsTextureToTextureBlits);
1191 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultGlyphAtlasFormat);
1192 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsTriangleFan);
1193 ASSERT_TRUE(SetCapabilities(mock_capabilities).ok());
1197 DisplayListBuilder builder;
1198 builder.Scale(GetContentScale().x * 0.5, GetContentScale().y * 0.5);
1201 paint.setColor(DlColor::kBlack());
1202 builder.DrawPaint(paint);
1204 auto blur_filter = DlBlurImageFilter::Make(20, 20, DlTileMode::kDecal);
1205 paint.setImageFilter(blur_filter);
1206 builder.DrawImage(texture, SkPoint::Make(200, 200), {}, &paint);
1207 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1216 for (int32_t i = 1; i < 5; ++i) {
1217 DisplayListBuilder builder;
1220 path.moveTo(100, 100);
1221 path.lineTo(100 + fi, 100 + fi);
1224 paint.setColor(DlColor::kChartreuse());
1225 auto blur_filter = DlBlurImageFilter::Make(0.1, 0.1, DlTileMode::kClamp);
1226 paint.setImageFilter(blur_filter);
1228 builder.DrawPath(path, paint);
1231 EXPECT_TRUE(image) <<
" length " << i;
1240 for (int32_t i = 1; i < 5; ++i) {
1241 DisplayListBuilder builder;
1246 SkRect::MakeXYWH(400, 400, clip_size.
width, clip_size.
height));
1249 paint.setColor(DlColor::kGreen());
1250 auto blur_filter = DlBlurImageFilter::Make(0.1, 0.1, DlTileMode::kDecal);
1251 paint.setImageFilter(blur_filter);
1253 builder.DrawCircle({400, 400}, 200, paint);
1257 EXPECT_TRUE(image) <<
" length " << i;