35 Point scale = aiks_test->GetContentScale();
36 builder.
Scale(scale.
x, scale.
y);
40 std::vector<DlColor> colors = {
43 std::vector<Scalar> stops = {0.0, 1.0};
46 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), tile_mode);
50 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
56 CanRenderLinearGradient(
this, DlTileMode::kClamp);
59 CanRenderLinearGradient(
this, DlTileMode::kRepeat);
62 CanRenderLinearGradient(
this, DlTileMode::kMirror);
65 CanRenderLinearGradient(
this, DlTileMode::kDecal);
70 Point scale = GetContentScale();
71 builder.
Scale(scale.
x, scale.
y);
75 std::vector<DlColor> colors = {
78 std::vector<Scalar> stops = {0.0, 1.0};
81 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kDecal));
86 DlBlendMode::kSrcOver));
89 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
94 Point scale = GetContentScale();
95 builder.
Scale(scale.
x, scale.
y);
99 std::vector<DlColor> colors = {
102 std::vector<Scalar> stops = {0.0, 1.0};
105 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kClamp));
109 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
119 std::vector<DlColor> colors = {
DlColor(0xFFCCCCCC),
DlColor(0xFF333333)};
120 std::vector<Scalar> stops = {0.0, 1.0};
123 {0, 0}, {800, 500}, 2, colors.data(), stops.data(), DlTileMode::kClamp));
140 std::vector<Scalar> stops = {0.0, 1.0};
143 {600, 600}, 600, 2, colors.data(), stops.data(), DlTileMode::kClamp));
161 std::vector<Scalar> stops = {0.0, 1.0};
164 {100, 100}, 45, 135, 2, colors.data(), stops.data(),
165 DlTileMode::kMirror));
184 std::vector<Scalar> stops = {0.0, 1.0};
187 colors.data(), stops.data(),
188 DlTileMode::kMirror));
199void CanRenderLinearGradientWithOverlappingStops(
AiksTest* aiks_test,
205 std::vector<DlColor> colors = {
210 std::vector<Scalar> stops = {0.0, 0.5, 0.5, 1.0};
213 stops.size(), colors.data(),
214 stops.data(), tile_mode));
218 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
224 CanRenderLinearGradientWithOverlappingStops(
this, DlTileMode::kClamp);
228void CanRenderGradientWithIncompleteStops(
AiksTest* aiks_test,
239 const DlScalar quadrant_size = test_size + test_border * 2;
245 for (
int quadrant = 0; quadrant < 4; quadrant++) {
247 builder.
Translate((quadrant & 1) * quadrant_size + test_border,
248 (quadrant >> 1) * quadrant_size + test_border);
250 if (
type == DlColorSourceType::kLinearGradient) {
254 DlScalar ten_percent = gradient_size * 0.1;
255 for (
int i = gradient_size / 2;
i <= test_size / 2;
i += gradient_size) {
264 DlScalar across_distance = test_size / 2 + 10 - offset;
265 DlPoint across(across_distance, -across_distance);
267 canvas.
DrawLine(center - along - across,
268 center - along + across,
270 canvas.
DrawLine(center + along - across,
271 center + along + across,
282 std::vector<DlColor> colors = {
288 std::vector<Scalar> stops = {0.1, 0.3, 0.7, 0.9};
292 case DlColorSourceType::kLinearGradient:
294 {test_size / 2 - gradient_size / 2,
295 test_size / 2 - gradient_size / 2},
296 {test_size / 2 + gradient_size / 2,
297 test_size / 2 + gradient_size / 2},
298 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
300 case DlColorSourceType::kRadialGradient:
302 {test_size / 2, test_size / 2}, gradient_size,
303 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
305 case DlColorSourceType::kConicalGradient:
307 {test_size / 2, test_size / 2}, 0,
308 {test_size / 2 + 20, test_size / 2 - 10}, gradient_size,
309 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
311 case DlColorSourceType::kSweepGradient:
313 {test_size / 2, test_size / 2}, 0, 45,
314 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
324 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
329 CanRenderGradientWithIncompleteStops(
this,
330 DlColorSourceType::kLinearGradient);
333 CanRenderGradientWithIncompleteStops(
this,
334 DlColorSourceType::kRadialGradient);
337 CanRenderGradientWithIncompleteStops(
this,
338 DlColorSourceType::kConicalGradient);
341 CanRenderGradientWithIncompleteStops(
this, DlColorSourceType::kSweepGradient);
345void CanRenderLinearGradientManyColors(
AiksTest* aiks_test,
348 builder.
Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
352 std::vector<DlColor> colors = {
360 std::vector<Scalar> stops = {
371 stops.size(), colors.data(),
372 stops.data(), tile_mode));
377 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
382 CanRenderLinearGradientManyColors(
this, DlTileMode::kClamp);
385 CanRenderLinearGradientManyColors(
this, DlTileMode::kRepeat);
388 CanRenderLinearGradientManyColors(
this, DlTileMode::kMirror);
391 CanRenderLinearGradientManyColors(
this, DlTileMode::kDecal);
395void CanRenderLinearGradientWayManyColors(
AiksTest* aiks_test,
401 std::vector<DlColor> colors;
402 std::vector<Scalar> stops;
403 auto current_stop = 0.0;
404 for (
int i = 0;
i < 2000;
i++) {
405 colors.push_back(color);
406 stops.push_back(current_stop);
407 current_stop += 1 / 2000.0;
409 stops[2000 - 1] = 1.0;
412 stops.size(), colors.data(),
413 stops.data(), tile_mode));
416 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
422 CanRenderLinearGradientWayManyColors(
this, DlTileMode::kClamp);
426 auto callback = [&]() -> sk_sp<DisplayList> {
427 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
428 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
429 DlTileMode::kMirror, DlTileMode::kDecal};
431 static int selected_tile_mode = 0;
434 ImGuiWindowFlags_AlwaysAutoResize)) {
435 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
436 sizeof(tile_mode_names) /
sizeof(
char*));
437 std::string label =
"##1";
438 for (
int i = 0;
i < 4;
i++) {
439 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
440 &(matrix.
vec[
i]), 4, NULL, NULL,
"%.2f", 0);
449 auto tile_mode = tile_modes[selected_tile_mode];
451 std::vector<DlColor> colors = {
459 std::vector<Scalar> stops = {
460 0.0, 2.0 / 62.0, 4.0 / 62.0, 8.0 / 62.0, 16.0 / 62.0, 32.0 / 62.0, 1.0,
464 stops.size(), colors.data(),
465 stops.data(), tile_mode));
468 return builder.
Build();
470 ASSERT_TRUE(OpenPlaygroundHere(
callback));
476 std::vector<DlColor> colors = {
480 std::vector<Scalar> stops = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5,
481 0.6, 0.7, 0.8, 0.9, 1.0};
486 {200, 200}, {400, 400}, stops.size(), colors.data(), stops.data(),
487 DlTileMode::kClamp));
493 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
497 auto callback = [&]() -> sk_sp<DisplayList> {
498 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
499 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
500 DlTileMode::kMirror, DlTileMode::kDecal};
502 static int selected_tile_mode = 0;
505 ImGuiWindowFlags_AlwaysAutoResize)) {
506 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
507 sizeof(tile_mode_names) /
sizeof(
char*));
508 std::string label =
"##1";
509 for (
int i = 0;
i < 4;
i++) {
510 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
511 &(matrix.
vec[
i]), 4, NULL, NULL,
"%.2f", 0);
520 auto tile_mode = tile_modes[selected_tile_mode];
522 std::vector<DlColor> colors = {
525 std::vector<Scalar> stops = {0.0, 1.0};
528 {100, 100}, 100, 2, colors.data(), stops.data(), tile_mode));
531 return builder.
Build();
533 ASSERT_TRUE(OpenPlaygroundHere(
callback));
537 auto callback = [&]() -> sk_sp<DisplayList> {
538 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
539 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
540 DlTileMode::kMirror, DlTileMode::kDecal};
542 static int selected_tile_mode = 0;
550 ImGuiWindowFlags_AlwaysAutoResize)) {
551 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
552 sizeof(tile_mode_names) /
sizeof(
char*));
553 std::string label =
"##1";
554 for (
int i = 0;
i < 4;
i++) {
555 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
556 &(matrix.
vec[
i]), 4, NULL, NULL,
"%.2f", 0);
565 auto tile_mode = tile_modes[selected_tile_mode];
567 std::vector<DlColor> colors = {
575 std::vector<Scalar> stops = {
586 {100, 100}, 100, stops.size(), colors.data(), stops.data(), tile_mode));
589 return builder.
Build();
591 ASSERT_TRUE(OpenPlaygroundHere(
callback));
597 builder.
Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
601 std::vector<DlColor> colors = {
604 std::vector<Scalar> stops = {0.0, 1.0};
607 {100, 100}, 45, 135, 2, colors.data(),
608 stops.data(), tile_mode));
611 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
616 CanRenderSweepGradient(
this, DlTileMode::kClamp);
619 CanRenderSweepGradient(
this, DlTileMode::kRepeat);
622 CanRenderSweepGradient(
this, DlTileMode::kMirror);
625 CanRenderSweepGradient(
this, DlTileMode::kDecal);
629void CanRenderSweepGradientManyColors(
AiksTest* aiks_test,
635 std::vector<DlColor> colors = {
643 std::vector<Scalar> stops = {
654 stops.size(), colors.data(),
655 stops.data(), tile_mode));
658 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
663 CanRenderSweepGradientManyColors(
this, DlTileMode::kClamp);
666 CanRenderSweepGradientManyColors(
this, DlTileMode::kRepeat);
669 CanRenderSweepGradientManyColors(
this, DlTileMode::kMirror);
672 CanRenderSweepGradientManyColors(
this, DlTileMode::kDecal);
681 std::vector<DlColor> colors = {
686 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
687 std::array<std::tuple<DlPoint, float, DlPoint, float>, 8> array{
705 for (
int i = 0;
i < 8;
i++) {
709 std::get<2>(array[
i]),
710 std::get<3>(array[
i]),
711 std::get<0>(array[
i]),
712 std::get<1>(array[
i]),
716 DlTileMode::kClamp));
720 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
724 std::vector<DlColor> colors = {
729 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
731 std::array<std::shared_ptr<DlColorSource>, 3> color_sources = {
733 stops.data(), DlTileMode::kDecal),
735 stops.data(), DlTileMode::kDecal),
737 stops.data(), DlTileMode::kDecal),
744 for (
int i = 0;
i < 3;
i++) {
751 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
756 auto callback = [&]() -> sk_sp<DisplayList> {
757 static float scale = 3;
758 static bool add_circle_clip =
true;
759 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
760 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
761 DlTileMode::kMirror, DlTileMode::kDecal};
762 static int selected_tile_mode = 0;
763 static float alpha = 1;
766 ImGuiWindowFlags_AlwaysAutoResize)) {
767 ImGui::SliderFloat(
"Scale", &scale, 0, 6);
768 ImGui::Checkbox(
"Circle clip", &add_circle_clip);
769 ImGui::SliderFloat(
"Alpha", &alpha, 0, 1);
770 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
771 sizeof(tile_mode_names) /
sizeof(
char*));
776 builder.
Scale(GetContentScale().
x, GetContentScale().
y);
784 auto tile_mode = tile_modes[selected_tile_mode];
786 std::vector<DlColor> colors = {
789 std::vector<Scalar> stops = {0.0, 1.0};
792 stops.size(), colors.data(),
793 stops.data(), tile_mode));
798 path_builder.
Close();
803 builder.
Scale(scale, scale);
805 if (add_circle_clip) {
810 auto [handle_a, handle_b] =
817 ip_matrix = ip_matrix.
Invert();
818 Point point_a = ip_matrix * handle_a * GetContentScale();
819 Point point_b = ip_matrix * handle_b * GetContentScale();
821 Point middle = (point_a + point_b) / 2;
822 auto radius = point_a.GetDistance(middle);
827 {DlStrokeJoin::kBevel, DlStrokeJoin::kRound, DlStrokeJoin::kMiter}) {
830 {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
838 return builder.
Build();
841 ASSERT_TRUE(OpenPlaygroundHere(
callback));
852 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
855 colors.data(), stops.data(),
856 DlTileMode::kClamp));
864 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
875 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
878 colors.data(), stops.data(),
879 DlTileMode::kClamp));
887 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
898 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
901 colors.data(), stops.data(),
902 DlTileMode::kClamp));
910 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
921 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
924 colors.data(), stops.data(),
925 DlTileMode::kClamp));
933 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
943 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
949 stops.data(), DlTileMode::kRepeat));
957 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
void DrawRoundRect(const DlRoundRect &rrect, const DlPaint &paint) override
DlMatrix GetMatrix() const override
void DrawCircle(const DlPoint ¢er, DlScalar radius, const DlPaint &paint) override
void Scale(DlScalar sx, DlScalar sy) override
void Translate(DlScalar tx, DlScalar ty) override
void DrawPaint(const DlPaint &paint) override
sk_sp< DisplayList > Build()
void DrawPath(const DlPath &path, const DlPaint &paint) override
void ClipPath(const DlPath &path, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
void DrawRect(const DlRect &rect, const DlPaint &paint) override
static std::shared_ptr< DlMaskFilter > Make(DlBlurStyle style, SkScalar sigma, bool respect_ctm=true)
Developer-facing API for rendering anything within the engine.
virtual void DrawLine(const DlPoint &p0, const DlPoint &p1, const DlPaint &paint)=0
static std::shared_ptr< const DlColorFilter > MakeBlend(DlColor color, DlBlendMode mode)
static std::shared_ptr< DlColorSource > MakeSweep(DlPoint center, DlScalar start, DlScalar end, uint32_t stop_count, const DlColor *colors, const float *stops, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
static std::shared_ptr< DlColorSource > MakeLinear(const DlPoint start_point, const DlPoint end_point, uint32_t stop_count, const DlColor *colors, const float *stops, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
static std::shared_ptr< DlColorSource > MakeConical(DlPoint start_center, DlScalar start_radius, DlPoint end_center, DlScalar end_radius, uint32_t stop_count, const DlColor *colors, const float *stops, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
static std::shared_ptr< DlColorSource > MakeRadial(DlPoint center, DlScalar radius, uint32_t stop_count, const DlColor *colors, const float *stops, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
static std::shared_ptr< DlImageFilter > MakeBlur(DlScalar sigma_x, DlScalar sigma_y, DlTileMode tile_mode)
DlPaint & setColor(DlColor color)
DlPaint & setStrokeCap(DlStrokeCap cap)
DlPaint & setStrokeWidth(float width)
DlPaint & setImageFilter(std::nullptr_t filter)
DlPaint & setMaskFilter(std::nullptr_t filter)
DlPaint & setDrawStyle(DlDrawStyle style)
DlPaint & setStrokeJoin(DlStrokeJoin join)
DlPaint & setColorFilter(std::nullptr_t filter)
DlPaint & setColorSource(std::nullptr_t source)
DlPathBuilder & MoveTo(DlPoint p2)
Start a new contour that will originate at the indicated point p2.
const DlPath TakePath()
Returns the path constructed by this path builder and resets its internal state to the default state ...
DlPathBuilder & QuadraticCurveTo(DlPoint cp, DlPoint p2)
Draw a quadratic bezier curve from the current point to the indicated point p2, using the indicated p...
DlPathBuilder & Close()
The path is closed back to the location of the most recent MoveTo call. Contours that are filled are ...
static DlPath MakeCircle(const DlPoint center, DlScalar radius)
bool OpenPlaygroundHere(const AiksDlPlaygroundCallback &callback)
static bool ImGuiBegin(const char *name, bool *p_open, ImGuiWindowFlags flags)
Point GetContentScale() const
FlutterDesktopBinaryReply callback
#define FML_UNREACHABLE()
impeller::Scalar DlScalar
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
static void CanRenderLinearGradientWithDithering(AiksTest *aiks_test)
static void CanRenderRadialGradientWithDithering(AiksTest *aiks_test)
TEST_P(AiksTest, DrawAtlasNoColor)
static void CanRenderConicalGradientWithDithering(AiksTest *aiks_test)
static void CanRenderSweepGradientWithDithering(AiksTest *aiks_test)
std::tuple< Point, Point > DrawPlaygroundLine(PlaygroundPoint &point_a, PlaygroundPoint &point_b)
impeller::ShaderType type
static constexpr DlColor kWhite()
static constexpr DlColor kBlue()
static constexpr DlColor kPurple()
static constexpr DlColor kMidGrey()
static constexpr DlColor kRed()
static constexpr DlColor kGreen()
static constexpr DlColor kOrange()
static constexpr DlColor kDarkGrey()
uint32_t ToARGB() const
Convert to ARGB 32 bit color.
static constexpr Color Red()
static constexpr Color MakeRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
A 4x4 matrix using column-major storage.
bool IsInvertible() const
static RoundRect MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
static constexpr TRect MakeWH(Type width, Type height)
static constexpr TRect MakeXYWH(Type x, Type y, Type width, Type height)
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)