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()));
99 std::vector<DlColor> colors = {
DlColor(0xFFCCCCCC),
DlColor(0xFF333333)};
100 std::vector<Scalar> stops = {0.0, 1.0};
103 {0, 0}, {800, 500}, 2, colors.data(), stops.data(), DlTileMode::kClamp));
120 std::vector<Scalar> stops = {0.0, 1.0};
123 {600, 600}, 600, 2, colors.data(), stops.data(), DlTileMode::kClamp));
141 std::vector<Scalar> stops = {0.0, 1.0};
144 {100, 100}, 45, 135, 2, colors.data(), stops.data(),
145 DlTileMode::kMirror));
164 std::vector<Scalar> stops = {0.0, 1.0};
167 colors.data(), stops.data(),
168 DlTileMode::kMirror));
179void CanRenderLinearGradientWithOverlappingStops(
AiksTest* aiks_test,
185 std::vector<DlColor> colors = {
190 std::vector<Scalar> stops = {0.0, 0.5, 0.5, 1.0};
193 stops.size(), colors.data(),
194 stops.data(), tile_mode));
198 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
204 CanRenderLinearGradientWithOverlappingStops(
this, DlTileMode::kClamp);
208void CanRenderGradientWithIncompleteStops(
AiksTest* aiks_test,
219 const DlScalar quadrant_size = test_size + test_border * 2;
225 for (
int quadrant = 0; quadrant < 4; quadrant++) {
227 builder.
Translate((quadrant & 1) * quadrant_size + test_border,
228 (quadrant >> 1) * quadrant_size + test_border);
230 if (
type == DlColorSourceType::kLinearGradient) {
234 DlScalar ten_percent = gradient_size * 0.1;
235 for (
int i = gradient_size / 2;
i <= test_size / 2;
i += gradient_size) {
244 DlScalar across_distance = test_size / 2 + 10 - offset;
245 DlPoint across(across_distance, -across_distance);
247 canvas.
DrawLine(center - along - across,
248 center - along + across,
250 canvas.
DrawLine(center + along - across,
251 center + along + across,
262 std::vector<DlColor> colors = {
268 std::vector<Scalar> stops = {0.1, 0.3, 0.7, 0.9};
272 case DlColorSourceType::kLinearGradient:
274 {test_size / 2 - gradient_size / 2,
275 test_size / 2 - gradient_size / 2},
276 {test_size / 2 + gradient_size / 2,
277 test_size / 2 + gradient_size / 2},
278 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
280 case DlColorSourceType::kRadialGradient:
282 {test_size / 2, test_size / 2}, gradient_size,
283 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
285 case DlColorSourceType::kConicalGradient:
287 {test_size / 2, test_size / 2}, 0,
288 {test_size / 2 + 20, test_size / 2 - 10}, gradient_size,
289 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
291 case DlColorSourceType::kSweepGradient:
293 {test_size / 2, test_size / 2}, 0, 45,
294 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
304 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
309 CanRenderGradientWithIncompleteStops(
this,
310 DlColorSourceType::kLinearGradient);
313 CanRenderGradientWithIncompleteStops(
this,
314 DlColorSourceType::kRadialGradient);
317 CanRenderGradientWithIncompleteStops(
this,
318 DlColorSourceType::kConicalGradient);
321 CanRenderGradientWithIncompleteStops(
this, DlColorSourceType::kSweepGradient);
325void CanRenderLinearGradientManyColors(
AiksTest* aiks_test,
328 builder.
Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
332 std::vector<DlColor> colors = {
340 std::vector<Scalar> stops = {
351 stops.size(), colors.data(),
352 stops.data(), tile_mode));
357 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
362 CanRenderLinearGradientManyColors(
this, DlTileMode::kClamp);
365 CanRenderLinearGradientManyColors(
this, DlTileMode::kRepeat);
368 CanRenderLinearGradientManyColors(
this, DlTileMode::kMirror);
371 CanRenderLinearGradientManyColors(
this, DlTileMode::kDecal);
375void CanRenderLinearGradientWayManyColors(
AiksTest* aiks_test,
381 std::vector<DlColor> colors;
382 std::vector<Scalar> stops;
383 auto current_stop = 0.0;
384 for (
int i = 0;
i < 2000;
i++) {
385 colors.push_back(color);
386 stops.push_back(current_stop);
387 current_stop += 1 / 2000.0;
389 stops[2000 - 1] = 1.0;
392 stops.size(), colors.data(),
393 stops.data(), tile_mode));
396 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
402 CanRenderLinearGradientWayManyColors(
this, DlTileMode::kClamp);
406 auto callback = [&]() -> sk_sp<DisplayList> {
407 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
408 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
409 DlTileMode::kMirror, DlTileMode::kDecal};
411 static int selected_tile_mode = 0;
414 ImGuiWindowFlags_AlwaysAutoResize)) {
415 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
416 sizeof(tile_mode_names) /
sizeof(
char*));
417 std::string label =
"##1";
418 for (
int i = 0;
i < 4;
i++) {
419 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
420 &(matrix.
vec[
i]), 4, NULL, NULL,
"%.2f", 0);
429 auto tile_mode = tile_modes[selected_tile_mode];
431 std::vector<DlColor> colors = {
439 std::vector<Scalar> stops = {
440 0.0, 2.0 / 62.0, 4.0 / 62.0, 8.0 / 62.0, 16.0 / 62.0, 32.0 / 62.0, 1.0,
444 stops.size(), colors.data(),
445 stops.data(), tile_mode));
448 return builder.
Build();
450 ASSERT_TRUE(OpenPlaygroundHere(
callback));
456 std::vector<DlColor> colors = {
460 std::vector<Scalar> stops = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5,
461 0.6, 0.7, 0.8, 0.9, 1.0};
466 {200, 200}, {400, 400}, stops.size(), colors.data(), stops.data(),
467 DlTileMode::kClamp));
473 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
477 auto callback = [&]() -> sk_sp<DisplayList> {
478 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
479 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
480 DlTileMode::kMirror, DlTileMode::kDecal};
482 static int selected_tile_mode = 0;
485 ImGuiWindowFlags_AlwaysAutoResize)) {
486 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
487 sizeof(tile_mode_names) /
sizeof(
char*));
488 std::string label =
"##1";
489 for (
int i = 0;
i < 4;
i++) {
490 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
491 &(matrix.
vec[
i]), 4, NULL, NULL,
"%.2f", 0);
500 auto tile_mode = tile_modes[selected_tile_mode];
502 std::vector<DlColor> colors = {
505 std::vector<Scalar> stops = {0.0, 1.0};
508 {100, 100}, 100, 2, colors.data(), stops.data(), tile_mode));
511 return builder.
Build();
513 ASSERT_TRUE(OpenPlaygroundHere(
callback));
517 auto callback = [&]() -> sk_sp<DisplayList> {
518 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
519 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
520 DlTileMode::kMirror, DlTileMode::kDecal};
522 static int selected_tile_mode = 0;
530 ImGuiWindowFlags_AlwaysAutoResize)) {
531 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
532 sizeof(tile_mode_names) /
sizeof(
char*));
533 std::string label =
"##1";
534 for (
int i = 0;
i < 4;
i++) {
535 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
536 &(matrix.
vec[
i]), 4, NULL, NULL,
"%.2f", 0);
545 auto tile_mode = tile_modes[selected_tile_mode];
547 std::vector<DlColor> colors = {
555 std::vector<Scalar> stops = {
566 {100, 100}, 100, stops.size(), colors.data(), stops.data(), tile_mode));
569 return builder.
Build();
571 ASSERT_TRUE(OpenPlaygroundHere(
callback));
577 builder.
Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
581 std::vector<DlColor> colors = {
584 std::vector<Scalar> stops = {0.0, 1.0};
587 {100, 100}, 45, 135, 2, colors.data(),
588 stops.data(), tile_mode));
591 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
596 CanRenderSweepGradient(
this, DlTileMode::kClamp);
599 CanRenderSweepGradient(
this, DlTileMode::kRepeat);
602 CanRenderSweepGradient(
this, DlTileMode::kMirror);
605 CanRenderSweepGradient(
this, DlTileMode::kDecal);
609void CanRenderSweepGradientManyColors(
AiksTest* aiks_test,
615 std::vector<DlColor> colors = {
623 std::vector<Scalar> stops = {
634 stops.size(), colors.data(),
635 stops.data(), tile_mode));
638 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.
Build()));
643 CanRenderSweepGradientManyColors(
this, DlTileMode::kClamp);
646 CanRenderSweepGradientManyColors(
this, DlTileMode::kRepeat);
649 CanRenderSweepGradientManyColors(
this, DlTileMode::kMirror);
652 CanRenderSweepGradientManyColors(
this, DlTileMode::kDecal);
661 std::vector<DlColor> colors = {
666 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
667 std::array<std::tuple<DlPoint, float, DlPoint, float>, 8> array{
685 for (
int i = 0;
i < 8;
i++) {
689 std::get<2>(array[
i]),
690 std::get<3>(array[
i]),
691 std::get<0>(array[
i]),
692 std::get<1>(array[
i]),
696 DlTileMode::kClamp));
700 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
704 std::vector<DlColor> colors = {
709 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
711 std::array<std::shared_ptr<DlColorSource>, 3> color_sources = {
713 stops.data(), DlTileMode::kDecal),
715 stops.data(), DlTileMode::kDecal),
717 stops.data(), DlTileMode::kDecal),
724 for (
int i = 0;
i < 3;
i++) {
731 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
736 auto callback = [&]() -> sk_sp<DisplayList> {
737 static float scale = 3;
738 static bool add_circle_clip =
true;
739 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
740 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
741 DlTileMode::kMirror, DlTileMode::kDecal};
742 static int selected_tile_mode = 0;
743 static float alpha = 1;
746 ImGuiWindowFlags_AlwaysAutoResize)) {
747 ImGui::SliderFloat(
"Scale", &scale, 0, 6);
748 ImGui::Checkbox(
"Circle clip", &add_circle_clip);
749 ImGui::SliderFloat(
"Alpha", &alpha, 0, 1);
750 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
751 sizeof(tile_mode_names) /
sizeof(
char*));
756 builder.
Scale(GetContentScale().
x, GetContentScale().
y);
764 auto tile_mode = tile_modes[selected_tile_mode];
766 std::vector<DlColor> colors = {
769 std::vector<Scalar> stops = {0.0, 1.0};
772 stops.size(), colors.data(),
773 stops.data(), tile_mode));
778 path_builder.
Close();
783 builder.
Scale(scale, scale);
785 if (add_circle_clip) {
790 auto [handle_a, handle_b] =
797 ip_matrix = ip_matrix.
Invert();
798 Point point_a = ip_matrix * handle_a * GetContentScale();
799 Point point_b = ip_matrix * handle_b * GetContentScale();
801 Point middle = (point_a + point_b) / 2;
802 auto radius = point_a.GetDistance(middle);
807 {DlStrokeJoin::kBevel, DlStrokeJoin::kRound, DlStrokeJoin::kMiter}) {
810 {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
818 return builder.
Build();
821 ASSERT_TRUE(OpenPlaygroundHere(
callback));
832 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
835 colors.data(), stops.data(),
836 DlTileMode::kClamp));
844 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
855 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
858 colors.data(), stops.data(),
859 DlTileMode::kClamp));
867 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
878 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
881 colors.data(), stops.data(),
882 DlTileMode::kClamp));
890 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
901 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
904 colors.data(), stops.data(),
905 DlTileMode::kClamp));
913 ASSERT_TRUE(OpenPlaygroundHere(builder.
Build()));
923 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
929 stops.data(), DlTileMode::kRepeat));
937 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)
DlPaint & setColor(DlColor color)
DlPaint & setStrokeCap(DlStrokeCap cap)
DlPaint & setStrokeWidth(float width)
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)
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)