15 #include "flutter/testing/testing.h"
16 #include "gtest/gtest.h"
21 #include "impeller/aiks/testing/context_spy.h"
39 #include "third_party/imgui/imgui.h"
40 #include "third_party/skia/include/core/SkFontMgr.h"
41 #include "txt/platform.h"
60 ASSERT_EQ(canvas.
Restore(),
false);
87 auto image = std::make_shared<Image>(CreateTextureForFixture(
"kalimba.jpg"));
96 auto image = std::make_shared<Image>(CreateTextureForFixture(
"kalimba.jpg"));
100 paint.invert_colors =
true;
112 paint.invert_colors =
true;
124 paint.invert_colors =
true;
131 bool GenerateMipmap(
const std::shared_ptr<Context>& context,
132 std::shared_ptr<Texture> texture,
134 auto buffer = context->CreateCommandBuffer();
138 auto pass = buffer->CreateBlitPass();
142 pass->GenerateMipmap(std::move(texture), std::move(label));
144 pass->EncodeCommands(context->GetResourceAllocator());
145 return context->GetCommandQueue()->Submit({buffer}).ok();
148 void CanRenderTiledTexture(
AiksTest* aiks_test,
150 Matrix local_matrix = {}) {
151 auto context = aiks_test->GetContext();
152 ASSERT_TRUE(context);
153 auto texture = aiks_test->CreateTextureForFixture(
"table_mountain_nx.png",
155 GenerateMipmap(context, texture,
"table_mountain_nx");
157 canvas.Scale(aiks_test->GetContentScale());
158 canvas.Translate({100.0f, 100.0f, 0});
162 paint.color = Color(1, 1, 1, 1);
178 PathBuilder path_builder;
179 path_builder.AddCircle({150, 150}, 150);
180 path_builder.AddRoundedRect(
Rect::MakeLTRB(300, 300, 600, 600), 10);
182 canvas.DrawPath(path_builder.TakePath(),
paint);
187 PathBuilder path_builder;
188 path_builder.AddCircle({150, 450}, 150);
191 canvas.DrawPath(path_builder.TakePath(),
paint);
194 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
222 auto image = std::make_shared<Image>(CreateTextureForFixture(
"kalimba.jpg"));
223 Size image_half_size =
Size(image->GetSize()) * 0.5;
227 source_rect = source_rect.Shift(
Point(image_half_size));
236 canvas.
Scale(GetContentScale());
281 std::vector<Color> gradient_colors = {
282 Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0},
283 Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0},
284 Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0},
285 Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0},
286 Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0},
287 Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0},
288 Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}};
289 std::vector<Scalar> stops = {
298 auto texture = CreateTextureForFixture(
"airplane.jpg",
302 {500, 600}, 75, std::move(gradient_colors), std::move(stops),
336 std::vector<Color> colors = {
Color{0.9568, 0.2627, 0.2118, 1.0},
337 Color{0.1294, 0.5882, 0.9529, 1.0}};
338 std::vector<Scalar> stops = {
344 {0, 0}, {100, 100}, std::move(colors), std::move(stops),
362 paint.color =
Color{0.9568, 0.2627, 0.2118, 1.0};
364 paint.color =
Color{0.1294, 0.5882, 0.9529, 1.0};
372 auto image = picture.
ToImage(renderer,
ISize{1000, 1000});
394 auto image = picture.
ToImage(renderer,
ISize{1000, 1000});
411 std::make_shared<Image>(CreateTextureForFixture(
"kalimba.jpg"));
495 CanPerformSaveLayerWithBoundsAndLargerIntermediateIsNotAllocated) {
552 const std::string& text,
553 const std::string_view& font_fixture,
557 Rect::MakeXYWH(options.position.x - 50, options.position.y, 900, 10),
558 Paint{.color = Color::Aqua().WithAlpha(0.25)});
562 Paint{.color = Color::Red().WithAlpha(0.25)});
565 auto c_font_fixture = std::string(font_fixture);
566 auto mapping = flutter::testing::OpenFixtureAsSkData(c_font_fixture.c_str());
570 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
571 SkFont sk_font(font_mgr->makeFromData(mapping), options.font_size);
572 auto blob = SkTextBlob::MakeFromString(text.c_str(), sk_font);
581 text_paint.color = options.color;
582 text_paint.mask_blur_descriptor = options.mask_blur_descriptor;
583 text_paint.stroke_width = 1;
592 const std::string& text,
593 const std::string& font_fixture,
597 Rect::MakeXYWH(options.position.x - 50, options.position.y, 900, 10),
598 Paint{.color = Color::Aqua().WithAlpha(0.25)});
602 Paint{.color = Color::Red().WithAlpha(0.25)});
605 auto mapping = flutter::testing::OpenFixtureAsMapping(font_fixture.c_str());
609 auto typeface_stb = std::make_shared<TypefaceSTB>(std::move(mapping));
612 typeface_stb, Font::Metrics{.point_size = options.font_size}, text);
615 text_paint.color = options.color;
624 GetContext(), canvas,
"the quick brown fox jumped over the lazy dog!.?",
625 "Roboto-Regular.ttf"));
633 GetContext(), canvas,
"the quick brown fox jumped over the lazy dog!.?",
634 "Roboto-Regular.ttf",
644 canvas.
Scale({0.5, 0.5, 1});
646 GetContext(), canvas,
"the quick brown fox jumped over the lazy dog!.?",
647 "Roboto-Regular.ttf"));
654 canvas.
Scale({2.625, 2.625, 1});
656 GetContext(), canvas,
"the quick brown fox jumped over the lazy dog!.?",
657 "Roboto-Regular.ttf"));
665 GetContext(), canvas,
"the quick brown fox jumped over the lazy dog!.?",
666 "Roboto-Regular.ttf"));
674 std::array<Scalar, 20> phase_offsets = {
675 7.82637e-06, 0.131538, 0.755605, 0.45865, 0.532767,
676 0.218959, 0.0470446, 0.678865, 0.679296, 0.934693,
677 0.383502, 0.519416, 0.830965, 0.0345721, 0.0534616,
678 0.5297, 0.671149, 0.00769819, 0.383416, 0.0668422};
679 auto callback = [&](
AiksContext& renderer) -> std::optional<Picture> {
681 static float phase_variation = 0.2;
682 static float speed = 0.5;
683 static float magnitude = 100;
685 ImGuiWindowFlags_AlwaysAutoResize)) {
686 ImGui::SliderFloat(
"Font size", &
font_size, 5, 50);
687 ImGui::SliderFloat(
"Phase variation", &phase_variation, 0, 1);
688 ImGui::SliderFloat(
"Oscillation speed", &speed, 0, 2);
689 ImGui::SliderFloat(
"Oscillation magnitude", &magnitude, 0, 300);
694 canvas.
Scale(GetContentScale());
696 for (
size_t i = 0; i < phase_offsets.size(); i++) {
698 Point(200 + magnitude *
699 std::sin((-phase_offsets[i] *
k2Pi * phase_variation +
700 GetSecondsElapsed() * speed)),
704 GetContext(), canvas,
705 "the quick brown fox jumped over "
707 "Roboto-Regular.ttf",
708 {.font_size =
font_size, .position = position})) {
715 ASSERT_TRUE(OpenPlaygroundHere(callback));
723 GetContext(), canvas,
"the quick brown fox jumped over the lazy dog!.?",
724 "HomemadeApple.ttf"));
730 "Apple Color Emoji.ttc";
732 "NotoColorEmoji.ttf";
740 GetContext(), canvas,
"😀 😃 😄 😁 😆 😅 😂 🤣 🥲 😊",
kFontFixture));
749 GetContext(), canvas,
"😀 😃 😄 😁 😆 😅 😂 🤣 🥲 😊",
kFontFixture,
753 .sigma =
Sigma(4)}}));
762 GetContext(), canvas,
"😀 😃 😄 😁 😆 😅 😂 🤣 🥲 😊",
kFontFixture,
777 GetContext(), canvas,
"the quick brown fox jumped over the lazy dog!.?",
778 "Roboto-Regular.ttf"));
783 GetContext(), canvas,
"the quick brown fox jumped over the lazy dog!.?",
784 "Roboto-Regular.ttf"));
794 auto mapping = flutter::testing::OpenFixtureAsSkData(
"wtf.otf");
795 ASSERT_NE(mapping,
nullptr);
798 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
799 SkFont sk_font(font_mgr->makeFromData(mapping),
font_size);
807 } text[] = {{
Point(0, 0),
"0F0F0F0"},
808 {
Point(1, 2),
"789"},
809 {
Point(1, 3),
"456"},
810 {
Point(1, 4),
"123"},
811 {
Point(0, 6),
"0F0F0F0"}};
812 for (
auto& t : text) {
816 auto blob = SkTextBlob::MakeFromString(t.text, sk_font);
817 ASSERT_NE(blob,
nullptr);
829 canvas.
Scale(GetContentScale());
837 GetContext(), canvas,
"the quick brown fox jumped over the lazy dog!.?",
838 "Roboto-Regular.ttf"));
854 canvas.
DrawPaint({.color = Color::Color::OrangeRed().WithAlpha(0.5)});
860 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
866 GetContext()->GetCapabilities()->GetDefaultColorFormat();
913 canvas.
Scale(GetContentScale());
915 const int color_count = 3;
916 Color colors[color_count] = {
928 paint.color = colors[(c_index++) % color_count];
937 std::vector<Color> gradient_colors = {
938 Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0},
939 Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0},
940 Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0},
941 Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0},
942 Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0},
943 Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0},
944 Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}};
945 std::vector<Scalar> stops = {
954 auto texture = CreateTextureForFixture(
"airplane.jpg",
958 {500, 600}, 75, std::move(gradient_colors), std::move(stops),
972 canvas.
Scale(GetContentScale());
974 const int color_count = 3;
975 Color colors[color_count] = {
988 for (
int i = 0; i < n; i++) {
989 paint.color = colors[(c_index++) % color_count];
990 canvas.DrawCircle(center, r,
paint);
996 paint.stroke_width = 1;
997 draw(canvas, {10, 10}, 2, 2, 14);
998 paint.stroke_width = 5;
999 draw(canvas, {10, 10}, 35, 10, 56);
1001 std::vector<Color> gradient_colors = {
1002 Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0},
1003 Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0},
1004 Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0},
1005 Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0},
1006 Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0},
1007 Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0},
1008 Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}};
1009 std::vector<Scalar> stops = {
1018 auto texture = CreateTextureForFixture(
"airplane.jpg",
1022 {500, 600}, 75, std::move(gradient_colors), std::move(stops),
1024 draw(canvas, {500, 600}, 5, 10, 10);
1029 draw(canvas, {800, 300}, 5, 10, 10);
1031 ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
1036 canvas.
Scale(GetContentScale());
1038 const int color_count = 3;
1039 Color colors[color_count] = {
1049 int long_radius = 600;
1050 int short_radius = 600;
1051 while (long_radius > 0 && short_radius > 0) {
1052 paint.color = colors[(c_index++) % color_count];
1054 long_radius * 2, short_radius * 2),
1057 short_radius * 2, long_radius * 2),
1059 if (short_radius > 30) {
1068 std::vector<Color> gradient_colors = {
1069 Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0},
1070 Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0},
1071 Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0},
1072 Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0},
1073 Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0},
1074 Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0},
1075 Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}};
1076 std::vector<Scalar> stops = {
1085 auto texture = CreateTextureForFixture(
"airplane.jpg",
1091 {300, 650}, 75, std::move(gradient_colors), std::move(stops),
1107 canvas.
Scale(GetContentScale());
1109 const int color_count = 3;
1110 Color colors[color_count] = {
1120 for (
int i = 0; i < 4; i++) {
1121 for (
int j = 0; j < 4; j++) {
1122 paint.color = colors[(c_index++) % color_count];
1127 paint.color = colors[(c_index++) % color_count];
1129 paint.color = colors[(c_index++) % color_count];
1132 std::vector<Color> gradient_colors = {
1133 Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0},
1134 Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0},
1135 Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0},
1136 Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0},
1137 Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0},
1138 Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0},
1139 Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}};
1140 std::vector<Scalar> stops = {
1149 auto texture = CreateTextureForFixture(
"airplane.jpg",
1155 for (
int i = 1; i <= 10; i++) {
1158 550 + i * 20, 550 + j * 20),
1163 {200, 650}, 75, std::move(gradient_colors), std::move(stops),
1172 for (
int i = 1; i <= 10; i++) {
1175 720 + i * 20, 220 + j * 20),
1190 canvas.
Scale(GetContentScale());
1201 for (
int i = 0; i < 5; i++) {
1202 Scalar x = (i + 1) * 100;
1203 Scalar radius = x / 10.0f;
1205 radius, 60.0f - radius),
1211 for (
int i = 0; i < 5; i++) {
1212 Scalar x = (i + 1) * 100;
1213 Scalar radius = x / 10.0f;
1219 for (
int i = 0; i < 5; i++) {
1220 Scalar x = (i + 1) * 100;
1221 Scalar radius = x / 10.0f;
1223 radius, 60.0f - radius),
1229 for (
int i = 0; i < 5; i++) {
1230 Scalar x = (i + 1) * 100;
1231 Scalar radius = x / 20.0f;
1239 for (
int i = 0; i < 5; i++) {
1240 Scalar x = (i + 1) * 100;
1241 Scalar radius = x / 20.0f;
1243 {radius, 5.0f},
paint);
1251 canvas.
Scale(GetContentScale());
1261 for (
int i = 0; i < 5; i++) {
1263 Scalar y_radius = i * 15;
1264 for (
int j = 0; j < 5; j++) {
1266 Scalar x_radius = j * 15;
1268 {x_radius, y_radius},
paint);
1277 canvas.
Scale(GetContentScale());
1279 const int color_count = 3;
1280 Color colors[color_count] = {
1289 auto draw_rrect_as_path = [&canvas](
const Rect& rect,
const Size& radii,
1297 for (
int i = 0; i < 4; i++) {
1298 for (
int j = 0; j < 4; j++) {
1299 paint.color = colors[(c_index++) % color_count];
1300 draw_rrect_as_path(
Rect::MakeXYWH(i * 100 + 10, j * 100 + 20, 80, 80),
1304 paint.color = colors[(c_index++) % color_count];
1306 paint.color = colors[(c_index++) % color_count];
1309 std::vector<Color> gradient_colors = {
1310 Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0},
1311 Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0},
1312 Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0},
1313 Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0},
1314 Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0},
1315 Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0},
1316 Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}};
1317 std::vector<Scalar> stops = {
1326 auto texture = CreateTextureForFixture(
"airplane.jpg",
1332 for (
int i = 1; i <= 10; i++) {
1335 550 + i * 20, 550 + j * 20),
1340 {200, 650}, 75, std::move(gradient_colors), std::move(stops),
1349 for (
int i = 1; i <= 10; i++) {
1352 720 + i * 20, 220 + j * 20),
1366 auto callback = [&](
AiksContext& renderer) -> std::optional<Picture> {
1368 canvas.
Scale(GetContentScale());
1373 auto current =
Point{25, 25};
1375 const auto size =
Size(100, 100);
1383 .stroke_width = 5.0f,
1400 ASSERT_TRUE(OpenPlaygroundHere(callback));
1486 canvas.
Scale(GetContentScale());
1489 auto texture = std::make_shared<Image>(CreateTextureForFixture(
"boston.jpg"));
1490 auto draw_image_layer = [&canvas, &texture](
const Paint&
paint) {
1501 draw_image_layer(effect_paint);
1505 draw_image_layer(effect_paint);
1510 #if IMPELLER_ENABLE_3D
1514 flutter::testing::OpenFixtureAsMapping(
"flutter_logo_baked.glb.ipscene");
1515 ASSERT_NE(mapping,
nullptr);
1518 *mapping, *GetContext()->GetResourceAllocator());
1519 ASSERT_NE(gltf_scene,
nullptr);
1521 auto callback = [&](
AiksContext& renderer) -> std::optional<Picture> {
1528 ImGuiWindowFlags_AlwaysAutoResize)) {
1529 ImGui::SliderFloat(
"Distance", &
distance, 0, 4);
1530 ImGui::SliderFloat(
"Y", &y_pos, -3, 3);
1531 ImGui::SliderFloat(
"FOV", &fov, 1, 180);
1535 Scalar angle = GetSecondsElapsed();
1536 auto camera_position =
1539 paint.color_source = ColorSource::MakeScene(
1546 canvas.Scale(GetContentScale());
1547 canvas.DrawPaint(
paint);
1548 return canvas.EndRecordingAsPicture();
1551 ASSERT_TRUE(OpenPlaygroundHere(callback));
1553 #endif // IMPELLER_ENABLE_3D
1560 ASSERT_FALSE(
paint.HasColorFilter());
1562 paint.color_filter =
1565 ASSERT_TRUE(
paint.HasColorFilter());
1571 ASSERT_TRUE(
paint.HasColorFilter());
1573 paint.mask_blur_descriptor = {};
1575 ASSERT_TRUE(
paint.HasColorFilter());
1577 paint.color_filter =
nullptr;
1579 ASSERT_FALSE(
paint.HasColorFilter());
1591 ASSERT_EQ(picture.
pass->GetClearColor(), expected);
1593 std::shared_ptr<ContextSpy> spy = ContextSpy::Make();
1594 std::shared_ptr<Context> real_context = GetContext();
1595 std::shared_ptr<ContextMock> mock_context = spy->MakeContext(real_context);
1597 std::shared_ptr<Image> image = picture.
ToImage(renderer, {300, 300});
1599 ASSERT_EQ(spy->render_passes_.size(), 1llu);
1600 std::shared_ptr<RenderPass> render_pass = spy->render_passes_[0];
1601 ASSERT_EQ(render_pass->GetCommands().size(), 0llu);
1607 ParentSaveLayerCreatesRenderPassWhenChildBackdropFilterIsPresent) {
1617 std::shared_ptr<ContextSpy> spy = ContextSpy::Make();
1618 std::shared_ptr<Context> real_context = GetContext();
1619 std::shared_ptr<ContextMock> mock_context = spy->MakeContext(real_context);
1621 std::shared_ptr<Image> image = picture.
ToImage(renderer, {300, 300});
1623 ASSERT_EQ(spy->render_passes_.size(),
1625 std::shared_ptr<RenderPass> render_pass = spy->render_passes_[0];
1626 ASSERT_EQ(render_pass->GetCommands().size(), 0llu);
1637 std::shared_ptr<ContextSpy> spy = ContextSpy::Make();
1639 std::shared_ptr<Context> real_context = GetContext();
1640 std::shared_ptr<ContextMock> mock_context = spy->MakeContext(real_context);
1642 std::shared_ptr<Image> image = picture.
ToImage(renderer, {300, 300});
1644 ASSERT_EQ(spy->render_passes_.size(), 1llu);
1645 std::shared_ptr<RenderPass> render_pass = spy->render_passes_[0];
1646 ASSERT_EQ(render_pass->GetCommands().size(), 0llu);
1657 std::shared_ptr<ContextSpy> spy = ContextSpy::Make();
1659 std::shared_ptr<Context> real_context = GetContext();
1660 std::shared_ptr<ContextMock> mock_context = spy->MakeContext(real_context);
1662 std::shared_ptr<Image> image = picture.
ToImage(renderer, {300, 300});
1664 ASSERT_EQ(spy->render_passes_.size(), 1llu);
1665 std::shared_ptr<RenderPass> render_pass = spy->render_passes_[0];
1666 ASSERT_EQ(render_pass->GetCommands().size(), 2llu);
1677 std::shared_ptr<ContextSpy> spy = ContextSpy::Make();
1679 std::shared_ptr<Context> real_context = GetContext();
1680 std::shared_ptr<ContextMock> mock_context = spy->MakeContext(real_context);
1682 std::shared_ptr<Image> image = picture.
ToImage(renderer, {300, 300});
1684 ASSERT_EQ(spy->render_passes_.size(), 1llu);
1685 std::shared_ptr<RenderPass> render_pass = spy->render_passes_[0];
1686 ASSERT_EQ(render_pass->GetCommands().size(), 1llu);
1697 std::shared_ptr<ContextSpy> spy = ContextSpy::Make();
1699 std::shared_ptr<Context> real_context = GetContext();
1700 std::shared_ptr<ContextMock> mock_context = spy->MakeContext(real_context);
1702 std::shared_ptr<Image> image = picture.
ToImage(renderer, {301, 301});
1704 ASSERT_EQ(spy->render_passes_.size(), 1llu);
1705 std::shared_ptr<RenderPass> render_pass = spy->render_passes_[0];
1706 ASSERT_EQ(render_pass->GetCommands().size(), 2llu);
1720 ASSERT_EQ(picture.
pass->GetClearColor(), expected);
1722 std::shared_ptr<ContextSpy> spy = ContextSpy::Make();
1723 std::shared_ptr<Context> real_context = GetContext();
1724 std::shared_ptr<ContextMock> mock_context = spy->MakeContext(real_context);
1726 std::shared_ptr<Image> image = picture.
ToImage(renderer, {300, 300});
1728 ASSERT_EQ(spy->render_passes_.size(), 1llu);
1729 std::shared_ptr<RenderPass> render_pass = spy->render_passes_[0];
1730 ASSERT_EQ(render_pass->GetCommands().size(), 0llu);
1746 std::optional<Color> actual_color;
1747 bool found_subpass =
false;
1749 if (
auto subpass = std::get_if<std::unique_ptr<EntityPass>>(&element)) {
1750 actual_color = subpass->get()->GetClearColor();
1751 found_subpass =
true;
1757 EXPECT_TRUE(found_subpass);
1758 EXPECT_FALSE(actual_color.has_value());
1797 1.0, 1.0, 1.0, 1.0, 0
1900 canvas.
Scale(GetContentScale());
1902 auto test = [&canvas](
const std::shared_ptr<ImageFilter>& filter) {
1903 auto DrawLine = [&canvas](
const Point& p0,
const Point& p1,
1919 canvas.
SaveLayer({.image_filter = filter},
1946 auto rotate_filter =
1951 test(rotate_filter);
1962 test(rgb_swap_filter);
1989 canvas.
Scale(GetContentScale());
1995 canvas.
SaveLayer({.image_filter = blur_filter}, std::nullopt);
2012 auto image = std::make_shared<Image>(CreateTextureForFixture(
"airplane.jpg"));
2013 canvas.
DrawImage(image, {100, 100}, {});
2016 canvas.
DrawImage(image, {100, 500}, {});
2025 auto image = std::make_shared<Image>(CreateTextureForFixture(
"airplane.jpg"));
2026 canvas.
DrawImage(image, {100, 100}, {});
2038 canvas.
DrawImage(image, {100, 500}, {});
2047 auto image = std::make_shared<Image>(CreateTextureForFixture(
"airplane.jpg"));
2048 canvas.
DrawImage(image, {100, 100}, {});
2061 canvas.
DrawImage(image, {100, 500}, {});
2068 TranslucentSaveLayerWithColorFilterAndImageFilterDrawsCorrectly) {
2071 auto image = std::make_shared<Image>(CreateTextureForFixture(
"airplane.jpg"));
2072 canvas.
DrawImage(image, {100, 100}, {});
2087 canvas.
DrawImage(image, {100, 500}, {});
2137 std::vector<Entity> entity;
2138 std::shared_ptr<SolidColorContents> contents;
2139 picture.
pass->IterateAllEntities([e = &entity, &contents](
Entity& entity) {
2142 std::static_pointer_cast<SolidColorContents>(entity.
GetContents());
2143 e->emplace_back(entity.
Clone());
2149 ASSERT_TRUE(entity.size() >= 1);
2150 ASSERT_TRUE(contents->IsOpaque());
2170 auto runtime_stages =
2171 OpenAssetAsRuntimeStage(
"runtime_stage_example.frag.iplr");
2173 auto runtime_stage =
2175 ASSERT_TRUE(runtime_stage);
2176 ASSERT_TRUE(runtime_stage->IsDirty());
2178 struct FragUniforms {
2181 } frag_uniforms = {.iResolution =
Vector2(400, 400), .iTime = 100.0};
2182 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
2183 uniform_data->resize(
sizeof(FragUniforms));
2184 memcpy(uniform_data->data(), &frag_uniforms,
sizeof(FragUniforms));
2186 std::vector<RuntimeEffectContents::TextureInput> texture_inputs;
2190 runtime_stage, uniform_data, texture_inputs);
2203 auto runtime_stages = OpenAssetAsRuntimeStage(
"gradient.frag.iplr");
2204 auto runtime_stage =
2206 ASSERT_TRUE(runtime_stage);
2207 ASSERT_TRUE(runtime_stage->IsDirty());
2209 struct FragUniforms {
2212 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
2213 uniform_data->resize(
sizeof(FragUniforms));
2214 memcpy(uniform_data->data(), &frag_uniforms,
sizeof(FragUniforms));
2216 std::vector<RuntimeEffectContents::TextureInput> texture_inputs;
2220 runtime_stage, uniform_data, texture_inputs);
2224 canvas.
Scale(GetContentScale());
2232 std::vector<Point> points = {
2241 std::vector<PointStyle> caps = {
2262 auto texture = CreateTextureForFixture(
"table_mountain_nx.png",
2265 std::vector<Point> points = {
2274 std::vector<PointStyle> caps = {
2285 canvas.Translate({150, 0});
2288 ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
2295 auto mapping = flutter::testing::OpenFixtureAsSkData(
"Roboto-Regular.ttf");
2296 ASSERT_NE(mapping,
nullptr);
2299 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
2300 SkFont sk_font(font_mgr->makeFromData(mapping),
font_size);
2305 std::vector<Color> colors = {
Color{0.9568, 0.2627, 0.2118, 1.0},
2306 Color{0.1294, 0.5882, 0.9529, 1.0}};
2307 std::vector<Scalar> stops = {
2312 {0, 0}, {100, 100}, std::move(colors), std::move(stops),
2319 auto blob = SkTextBlob::MakeFromString(
"Hello", sk_font);
2320 ASSERT_NE(blob,
nullptr);
2322 canvas.DrawTextFrame(frame,
Point(), text_paint);
2324 ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
2381 auto result = contents.ApplyColorFilter([](
const Color&
color) {
2384 ASSERT_TRUE(result);
2386 Color(0.424452, 0.828743, 0.79105, 0.9375));
2393 0.0, 0.0, 1.0, 0.01,
2394 0.0, 0.0, 0.0, 1.0) *
2398 "Roboto-Regular.ttf"));
2409 0.0, 0.0, 1.0, 0.01,
2410 0.0, 0.0, 0.0, 1.0) *
2414 "Roboto-Regular.ttf"));
2443 auto context = MakeContext();
2444 std::weak_ptr<Texture> weak_texture;
2447 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
2450 canvas.
Scale(GetContentScale());
2466 context->Shutdown();
2469 ASSERT_TRUE(weak_texture.expired()) <<
"When the texture is no longer in use "
2470 "by the backend, it should be "
2476 auto callback = [&](
AiksContext& renderer) -> std::optional<Picture> {
2478 ImGuiWindowFlags_AlwaysAutoResize)) {
2479 ImGui::SliderFloat(
"Scale", &
scale, 1, 2);
2483 canvas.
Scale(GetContentScale());
2485 std::make_shared<Image>(CreateTextureForFixture(
"airplane.jpg"));
2488 .image_filter = std::make_shared<MatrixImageFilter>(
2497 ASSERT_TRUE(OpenPlaygroundHere(callback));
2503 canvas.
Scale(GetContentScale());
2508 .image_filter = std::make_shared<MatrixImageFilter>(
2519 MatrixImageFilterDoesntCullWhenScaledAndTranslatedFromOffscreen) {
2521 canvas.
Scale(GetContentScale());
2526 .image_filter = std::make_shared<MatrixImageFilter>(
2538 SetWindowSize({400, 400});
2540 canvas.
Scale(GetContentScale());
2543 .image_filter = std::make_shared<MatrixImageFilter>(
2553 ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
2558 canvas.
Scale(GetContentScale());
2568 canvas.
Scale(GetContentScale());
2569 auto image = std::make_shared<Image>(CreateTextureForFixture(
"airplane.jpg"));
2603 auto texture = CreateTextureForFixture(
"monkey.png");
2663 std::vector<uint32_t> expected = {
2675 std::vector<uint32_t> actual;
2678 if (
auto* subpass = std::get_if<std::unique_ptr<EntityPass>>(&element)) {
2679 actual.push_back(subpass->get()->GetClipDepth());
2681 if (
Entity* entity = std::get_if<Entity>(&element)) {
2682 actual.push_back(entity->GetClipDepth());
2687 ASSERT_EQ(actual.size(), expected.size());
2688 for (
size_t i = 0; i < expected.size(); i++) {
2689 EXPECT_EQ(expected[i], actual[i]) <<
"Index: " << i;
2696 auto callback = [&](
AiksContext& renderer) -> std::optional<Picture> {
2722 Matrix(1.0, 0.0, 0.0, 0.0,
2724 0.0, 0.0, 1.0, 0.003,
2725 0.0, 0.0, 0.0, 1.0) *
2728 std::make_shared<Image>(CreateTextureForFixture(
"airplane.jpg"));
2740 ASSERT_TRUE(OpenPlaygroundHere(callback));
2747 canvas.
Scale(GetContentScale());
2750 std::vector<Color> colors = {
Color{0.9568, 0.2627, 0.2118, 1.0},
2751 Color{0.1294, 0.5882, 0.9529, 1.0}};
2752 std::vector<Scalar> stops = {
2757 {0, 0}, {100, 100}, std::move(colors), std::move(stops),
2775 texture_descriptor.
size =
ISize{1024, 1024};
2780 std::vector<uint8_t> bytes(4194304);
2781 bool alternate =
false;
2782 for (
auto i = 0u; i < 4194304; i += 4) {
2794 alternate = !alternate;
2798 auto mapping = std::make_shared<fml::NonOwnedMapping>(
2803 GetContext()->GetResourceAllocator()->CreateTexture(texture_descriptor);
2805 auto device_buffer =
2806 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
2807 auto command_buffer = GetContext()->CreateCommandBuffer();
2808 auto blit_pass = command_buffer->CreateBlitPass();
2812 blit_pass->GenerateMipmap(texture);
2813 EXPECT_TRUE(blit_pass->EncodeCommands(GetContext()->GetResourceAllocator()));
2814 EXPECT_TRUE(GetContext()->GetCommandQueue()->Submit({command_buffer}).ok());
2816 auto image = std::make_shared<Image>(texture);
2862 "Roboto-Regular.ttf"));
2867 auto bridge = CreateTextureForFixture(
"bay_bridge.jpg");
2870 std::vector<uint8_t> bytes(100 * 100 * 4);
2871 for (
auto i = 0u; i < bytes.size(); i += 4) {
2878 std::make_shared<fml::NonOwnedMapping>(bytes.data(), bytes.size());
2879 auto device_buffer =
2880 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
2881 auto cmd_buffer = GetContext()->CreateCommandBuffer();
2882 auto blit_pass = cmd_buffer->CreateBlitPass();
2887 blit_pass->EncodeCommands(GetContext()->GetResourceAllocator()) &&
2888 GetContext()->GetCommandQueue()->Submit({std::move(cmd_buffer)}).ok();
2889 ASSERT_TRUE(did_submit);
2891 auto image = std::make_shared<Image>(bridge);