5 #include "flutter/display_list/display_list.h"
6 #include "flutter/display_list/dl_blend_mode.h"
7 #include "flutter/display_list/dl_builder.h"
8 #include "flutter/display_list/dl_color.h"
9 #include "flutter/display_list/dl_paint.h"
10 #include "flutter/display_list/dl_tile_mode.h"
11 #include "flutter/display_list/effects/dl_color_source.h"
12 #include "flutter/display_list/effects/dl_mask_filter.h"
13 #include "flutter/display_list/geometry/dl_path_builder.h"
14 #include "flutter/display_list/testing/dl_test_snippets.h"
15 #include "flutter/fml/build_config.h"
17 #include "flutter/testing/testing.h"
29 #include "txt/platform.h"
41 DlColor color = DlColor::kYellow();
43 std::shared_ptr<DlMaskFilter>
filter;
48 DisplayListBuilder& canvas,
49 const std::string& text,
50 const std::string_view& font_fixture,
52 const std::optional<SkFont>& font = std::nullopt) {
55 paint.setColor(DlColor::kAqua().withAlpha(255 * 0.25));
57 DlRect::MakeXYWH(options.position.x - 50, options.position.y, 900, 10),
61 paint.setColor(DlColor::kRed().withAlpha(255 * 0.25));
62 canvas.DrawCircle(options.position, 5.0, paint);
66 if (!font.has_value()) {
67 auto c_font_fixture = std::string(font_fixture);
69 flutter::testing::OpenFixtureAsSkData(c_font_fixture.c_str());
73 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
74 selected_font = SkFont(font_mgr->makeFromData(mapping), options.font_size);
75 if (options.is_subpixel) {
76 selected_font.setSubpixel(
true);
79 selected_font = font.value();
81 auto blob = SkTextBlob::MakeFromString(text.c_str(), selected_font);
90 text_paint.setColor(options.color);
91 text_paint.setMaskFilter(options.filter);
92 text_paint.setStrokeWidth(options.stroke_width);
93 text_paint.setDrawStyle(options.stroke ? DlDrawStyle::kStroke
94 : DlDrawStyle::kFill);
96 options.position.y, text_paint);
101 DisplayListBuilder builder;
104 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
105 builder.DrawPaint(paint);
107 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
108 "Roboto-Regular.ttf"));
110 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
114 DisplayListBuilder builder;
117 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
118 builder.DrawPaint(paint);
119 builder.Translate(1000, 0);
120 builder.Scale(-1, 1);
123 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
124 "Roboto-Regular.ttf"));
126 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
130 DisplayListBuilder builder;
133 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
134 builder.DrawPaint(paint);
137 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
138 "Roboto-Regular.ttf",
142 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
146 DisplayListBuilder builder;
149 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
150 builder.DrawPaint(paint);
158 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
162 DisplayListBuilder builder;
165 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
166 builder.DrawPaint(paint);
167 builder.Scale(0.5, 0.5);
170 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
171 "Roboto-Regular.ttf"));
172 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
177 DisplayListBuilder builder;
179 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
180 builder.DrawPaint(paint);
181 for (
int i = 0; i < 6; ++i) {
183 builder.Translate(300 * i, 0);
184 Scalar scale = 0.445 - (i / 1000.f);
185 builder.Scale(scale, scale);
187 GetContext(), builder,
"k",
"Roboto-Regular.ttf",
190 GetContext(), builder,
"k",
"Roboto-Regular.ttf",
194 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
200 auto callback = [&]() -> sk_sp<DisplayList> {
201 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
202 ImGuiWindowFlags_AlwaysAutoResize)) {
203 ImGui::SliderFloat(
"Scale", &scale, 4, 20);
207 DisplayListBuilder builder;
209 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
210 builder.DrawPaint(paint);
212 builder.Scale(scale, scale);
214 GetContext(), builder,
"HELLO",
"Roboto-Regular.ttf",
216 .color = (16 * scale >= 250) ? DlColor::kYellow()
217 : DlColor::kOrange(),
219 return builder.Build();
222 ASSERT_TRUE(OpenPlaygroundHere(callback));
229 auto callback = [&]() -> sk_sp<DisplayList> {
230 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
231 ImGuiWindowFlags_AlwaysAutoResize)) {
232 ImGui::SliderFloat(
"scale", &scale, 1.f, 300.f);
233 ImGui::SliderFloat(
"offsetx", &offsetx, -600.f, 100.f);
234 ImGui::SliderFloat(
"offsety", &offsety, 600.f, 2048.f);
237 DisplayListBuilder builder;
238 builder.Scale(GetContentScale().
x, GetContentScale().y);
240 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
241 builder.DrawPaint(paint);
242 builder.Scale(scale, scale);
245 GetContext(), builder,
"test",
"Roboto-Regular.ttf",
249 return builder.Build();
251 ASSERT_TRUE(OpenPlaygroundHere(callback));
257 auto callback = [&]() -> sk_sp<DisplayList> {
258 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
259 ImGuiWindowFlags_AlwaysAutoResize)) {
260 ImGui::SliderFloat(
"Fine Scale", &fine_scale, -1, 1);
265 DisplayListBuilder builder;
267 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
268 builder.DrawPaint(paint);
269 Scalar scale = 2.625 + fine_scale;
270 builder.Scale(scale, scale);
272 "the quick brown fox jumped over the lazy dog!.?",
273 "Roboto-Regular.ttf",
275 return builder.Build();
278 ASSERT_TRUE(OpenPlaygroundHere(callback));
283 float fpivot[2] = {200 + 30, 200 - 20};
284 float rotation = 180;
285 float foffset[2] = {200, 200};
287 auto callback = [&]() -> sk_sp<DisplayList> {
288 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
289 ImGuiWindowFlags_AlwaysAutoResize)) {
290 ImGui::SliderFloat(
"pivotx", &fpivot[0], 0, 300);
291 ImGui::SliderFloat(
"pivoty", &fpivot[1], 0, 300);
292 ImGui::SliderFloat(
"rotation", &rotation, 0, 360);
293 ImGui::SliderFloat(
"foffsetx", &foffset[0], 0, 300);
294 ImGui::SliderFloat(
"foffsety", &foffset[1], 0, 300);
297 DisplayListBuilder builder;
298 builder.Scale(GetContentScale().
x, GetContentScale().y);
299 builder.DrawPaint(DlPaint().setColor(DlColor(0xffffeeff)));
303 builder.Translate(pivot.x, pivot.y);
304 builder.Rotate(rotation);
305 builder.Translate(-pivot.x, -pivot.y);
309 .
color = DlColor::kBlack(),
310 .position =
DlPoint(foffset[0], foffset[1]),
314 return builder.Build();
316 ASSERT_TRUE(OpenPlaygroundHere(callback));
321 std::array<Scalar, 20> phase_offsets = {
322 7.82637e-06, 0.131538, 0.755605, 0.45865, 0.532767,
323 0.218959, 0.0470446, 0.678865, 0.679296, 0.934693,
324 0.383502, 0.519416, 0.830965, 0.0345721, 0.0534616,
325 0.5297, 0.671149, 0.00769819, 0.383416, 0.0668422};
326 auto callback = [&]() -> sk_sp<DisplayList> {
328 static float phase_variation = 0.2;
329 static float speed = 0.5;
330 static float magnitude = 100;
331 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
332 ImGuiWindowFlags_AlwaysAutoResize)) {
333 ImGui::SliderFloat(
"Font size", &
font_size, 5, 50);
334 ImGui::SliderFloat(
"Phase variation", &phase_variation, 0, 1);
335 ImGui::SliderFloat(
"Oscillation speed", &speed, 0, 2);
336 ImGui::SliderFloat(
"Oscillation magnitude", &magnitude, 0, 300);
340 DisplayListBuilder builder;
341 builder.Scale(GetContentScale().
x, GetContentScale().y);
343 for (
size_t i = 0; i < phase_offsets.size(); i++) {
346 magnitude * std::sin((-phase_offsets[i] *
k2Pi * phase_variation +
347 GetSecondsElapsed() * speed)),
351 GetContext(), builder,
352 "the quick brown fox jumped over "
354 "Roboto-Regular.ttf",
355 {.font_size =
font_size, .position = position})) {
359 return builder.Build();
362 ASSERT_TRUE(OpenPlaygroundHere(callback));
366 DisplayListBuilder builder;
369 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
370 builder.DrawPaint(paint);
373 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
374 "HomemadeApple.ttf"));
375 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
380 "Apple Color Emoji.ttc";
382 "NotoColorEmoji.ttf";
386 DisplayListBuilder builder;
389 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
390 builder.DrawPaint(paint);
393 GetContext(), builder,
"😀 😃 😄 😁 😆 😅 😂 🤣 🥲 😊",
kFontFixture));
394 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
398 DisplayListBuilder builder;
400 builder.Scale(GetContentScale().
x, GetContentScale().y);
402 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
403 builder.DrawPaint(paint);
406 GetContext(), builder,
"😀 😃 😄 😁 😆 😅 😂 🤣 🥲 😊",
kFontFixture,
408 .
color = DlColor::kBlue(),
409 .filter = DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 4)}));
410 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
414 DisplayListBuilder builder;
417 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
418 builder.DrawPaint(paint);
421 GetContext(), builder,
"😀 😃 😄 😁 😆 😅 😂 🤣 🥲 😊",
kFontFixture,
422 {.color = DlColor::kBlack().modulateOpacity(0.5)}));
423 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
427 DisplayListBuilder builder;
430 paint.setColor(DlColor::ARGB(0.1, 0.1, 0.1, 0.1));
431 builder.DrawPaint(paint);
433 builder.Translate(100, 100);
434 builder.Scale(0.5, 0.5);
437 paint.setBlendMode(DlBlendMode::kClear);
438 builder.SaveLayer(std::nullopt, &paint);
440 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
441 "Roboto-Regular.ttf"));
446 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
447 "Roboto-Regular.ttf"));
449 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
453 DisplayListBuilder builder;
454 builder.Translate(200, 150);
457 auto mapping = flutter::testing::OpenFixtureAsSkData(
"wtf.otf");
458 ASSERT_NE(mapping,
nullptr);
461 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
462 SkFont sk_font(font_mgr->makeFromData(mapping),
font_size);
465 text_paint.setColor(DlColor::kBlue().withAlpha(255 * 0.8));
470 } text[] = {{
DlPoint(0, 0),
"0F0F0F0"},
475 for (
auto& t : text) {
477 builder.Translate(t.position.x *
font_size * 2,
480 auto blob = SkTextBlob::MakeFromString(t.text, sk_font);
481 ASSERT_NE(blob,
nullptr);
488 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
492 DisplayListBuilder builder;
494 builder.Scale(GetContentScale().
x, GetContentScale().y);
496 paint.setColor(DlColor::ARGB(0.1, 0.1, 0.1, 1.0));
497 builder.DrawPaint(paint);
499 builder.Transform(
Matrix(0.25, -0.3, 0, -0.002,
504 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
505 "Roboto-Regular.ttf"));
507 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
511 DisplayListBuilder builder;
516 0.0, 0.0, 0.0, 1.0) *
517 Matrix::MakeRotationY({
Degrees{10}});
522 "Roboto-Regular.ttf"));
523 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
527 DisplayListBuilder builder;
532 0.0, 0.0, 0.0, 1.0) *
533 Matrix::MakeRotationY({
Degrees{10}});
537 DlRect::MakeXYWH(0, 0, GetWindowSize().width, GetWindowSize().height);
539 builder.SaveLayer(window_bounds, &save_paint);
540 builder.Transform(matrix);
543 "Roboto-Regular.ttf"));
546 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
553 DisplayListBuilder builder;
556 builder.SaveLayer(std::nullopt, &save_paint);
557 builder.Transform(
Matrix(2000, 0, 0, 0,
564 "Roboto-Regular.ttf"));
565 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
569 DisplayListBuilder text_builder;
571 "Roboto-Regular.ttf"));
572 auto text_display_list = text_builder.Build();
574 DisplayListBuilder builder;
576 Matrix matrix = Matrix::MakeRow(2.0, 0.0, 0.0, 0.0,
579 0.0, 0.002, 0.0, 1.0);
583 DlRect::MakeXYWH(0, 0, GetWindowSize().width, GetWindowSize().height);
584 builder.SaveLayer(window_bounds, &save_paint);
585 builder.Transform(matrix);
586 builder.DrawDisplayList(text_display_list, 1.0f);
589 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
596 auto mapping = flutter::testing::OpenFixtureAsSkData(
"Roboto-Regular.ttf");
597 ASSERT_NE(mapping,
nullptr);
600 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
601 SkFont sk_font(font_mgr->makeFromData(mapping),
font_size);
604 text_paint.setColor(DlColor::kBlue());
606 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
607 DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0)};
608 std::vector<Scalar> stops = {
612 text_paint.setColorSource(DlColorSource::MakeLinear(
621 DisplayListBuilder builder;
622 builder.Translate(100, 100);
625 auto blob = SkTextBlob::MakeFromString(
"Hello", sk_font);
626 ASSERT_NE(blob,
nullptr);
630 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
635 DisplayListBuilder builder;
638 DlColor clear_color(1.0, 0.5, 0.5, 0.5, DlColorSpace::kSRGB);
639 paint.setColor(clear_color);
640 builder.DrawPaint(paint);
642 DlMatrix identity = {
643 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
644 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0,
647 builder.Transform(identity);
649 DlRect frame = DlRect::MakeLTRB(1.0, 1.0, 1278.0, 763.0);
650 DlColor white(1.0, 1.0, 1.0, 1.0, DlColorSpace::kSRGB);
651 paint.setColor(white);
652 builder.DrawRect(frame, paint);
655 builder.ClipRect(frame, DlClipOp::kIntersect);
657 DlMatrix rect_xform = {
658 0.8241262, 0.56640625, 0.0, 0.0, -0.56640625, 0.8241262, 0.0, 0.0,
659 0.0, 0.0, 1.0, 0.0, 271.1137, 489.4733, 0.0, 1.0,
662 builder.Transform(rect_xform);
664 DlRect rect = DlRect::MakeLTRB(0.0, 0.0, 100.0, 100.0);
665 DlColor bluish(1.0, 0.184, 0.501, 0.929, DlColorSpace::kSRGB);
666 paint.setColor(bluish);
667 DlRoundRect rrect = DlRoundRect::MakeRectRadius(rect, 18.0);
668 builder.DrawRoundRect(rrect, paint);
671 builder.ClipRect(rect, DlClipOp::kIntersect);
676 DlMatrix path_xform = {
677 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
678 0.0, 0.0, 1.0, 0.0, 675.0, 279.5, 0.0, 1.0,
681 builder.Transform(path_xform);
683 DlPathBuilder path_builder;
684 path_builder.MoveTo(
DlPoint(87.5, 349.5));
685 path_builder.LineTo(
DlPoint(25.0, 29.5));
686 path_builder.LineTo(
DlPoint(150.0, 118.0));
687 path_builder.LineTo(
DlPoint(25.0, 118.0));
688 path_builder.LineTo(
DlPoint(150.0, 29.5));
689 path_builder.Close();
690 DlPath path = path_builder.TakePath();
692 DlColor fill_color(1.0, 1.0, 0.0, 0.0, DlColorSpace::kSRGB);
693 DlColor stroke_color(1.0, 0.0, 0.0, 0.0, DlColorSpace::kSRGB);
694 paint.setColor(fill_color);
695 paint.setDrawStyle(DlDrawStyle::kFill);
696 builder.DrawPath(path, paint);
698 paint.setColor(stroke_color);
699 paint.setStrokeWidth(2.0);
700 paint.setDrawStyle(DlDrawStyle::kStroke);
701 builder.DrawPath(path, paint);
707 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
712 std::make_shared<TypographerContextSkia>());
716 constexpr
const char* font_fixture =
"Roboto-Regular.ttf";
719 auto c_font_fixture = std::string(font_fixture);
720 auto mapping = flutter::testing::OpenFixtureAsSkData(c_font_fixture.c_str());
721 ASSERT_TRUE(mapping);
723 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
724 SkFont sk_font(font_mgr->makeFromData(mapping), 16);
726 auto blob = SkTextBlob::MakeFromString(
"Hello World", sk_font);
733 Matrix::MakeTranslateScale({1.5, 1.5, 1}, {100, 50, 0});
748 ->CreateOffscreenMSAA(*aiks_context.
GetContext(), {100, 100}, 1);
754 text_contents.
SetColor(Color::Aqua());
756 Matrix not_preroll_matrix =
757 preroll_matrix * Matrix::MakeScale({2.0f, 2.0f, 1.0f});
763 aiks_context.
GetContext()->CreateCommandBuffer();
772 DisplayListBuilder builder;
774 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
775 builder.DrawPaint(paint);
778 flutter::testing::OpenFixtureAsSkData(
"RobotoSlab-VariableFont_wght.ttf");
779 ASSERT_TRUE(mapping);
780 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
783 SkFontArguments::VariationPosition::Coordinate weight_coord{
784 SkSetFourByteTag(
'w',
'g',
'h',
't'), 100.0f};
785 SkFontArguments args;
786 args.setVariationDesignPosition({&weight_coord, 1});
788 SkFont thin_font(font_mgr->makeFromData(mapping)->makeClone(args), 25);
792 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
793 "RobotoSlab-VariableFont_wght.ttf",
795 .position =
DlPoint(100, 200)},
799 DlPaint dart_text_background_paint;
800 dart_text_background_paint.setColor(DlColor::ARGB(1, 0.9, 0.9, 0.9));
801 builder.DrawRect(DlRect::MakeXYWH(50, 250, 900, 100),
802 dart_text_background_paint);
804 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
805 "RobotoSlab-VariableFont_wght.ttf",
807 .position =
DlPoint(100, 300)},
810 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
814 DisplayListBuilder builder;
815 builder.Scale(GetContentScale().
x, GetContentScale().y);
817 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
818 builder.DrawPaint(paint);
821 std::make_shared<TypographerContextSkia>());
831 .
color = DlColor::kBlue(),
832 .filter = DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 4)}));
844 DisplayListBuilder builder;
845 builder.Scale(GetContentScale().
x, GetContentScale().y);
847 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
848 builder.DrawPaint(paint);
851 std::make_shared<TypographerContextSkia>());
858 for (
auto i = 0; i < 5; i++) {
862 .
color = DlColor::kBlue(),
863 .filter = DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 4)}));
877 DisplayListBuilder builder;
878 builder.Scale(GetContentScale().
x, GetContentScale().y);
880 paint.setColor(DlColor::kWhite());
881 builder.DrawPaint(paint);
884 std::make_shared<TypographerContextSkia>());
891 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
893 std::array<DlColor, 4> colors{DlColor::kRed(), DlColor::kGreen(),
894 DlColor::kBlue(), DlColor::kRed()};
895 for (
const auto& color : colors) {
900 .filter = DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 4)},
915 DisplayListBuilder builder;
916 builder.Scale(GetContentScale().
x, GetContentScale().y);
918 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
919 builder.DrawPaint(paint);
922 std::make_shared<TypographerContextSkia>());
931 auto mapping = flutter::testing::OpenFixtureAsSkData(c_font_fixture.c_str());
932 ASSERT_TRUE(mapping);
933 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
934 SkFont sk_font(font_mgr->makeFromData(mapping), 50);
936 for (
auto i = 0; i < 10; i++) {
940 .
color = DlColor::kBlue(),
941 .filter = DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 4)},
955 DisplayListBuilder builder;
957 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
958 builder.DrawPaint(paint);
959 builder.Scale(GetContentScale().
x, GetContentScale().y);
961 std::vector<Scalar> scales = {4, 8, 16, 24, 32};
962 std::vector<Scalar> spacing = {8, 8, 8, 8, 8};
965 for (
auto i = 0u; i < scales.size(); i++) {
967 builder.Scale(scales[i], scales[i]);
969 GetContext(), builder,
"lo",
"Roboto-Regular.ttf",
978 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
982 std::shared_ptr<TextFrame> MakeDefaultTextFrame(
const std::string& text,
985 auto mapping = flutter::testing::OpenFixtureAsSkData(
"Roboto-Regular.ttf");
986 if (mapping ==
nullptr) {
990 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
991 SkFont sk_font(font_mgr->makeFromData(mapping),
font_size);
992 sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromString(
"Hi", sk_font);
998 void DrawTextFramesMultipleScalesWithReuse(
AiksTest* test,
1001 DisplayListBuilder builder;
1002 builder.Scale(test->GetContentScale().x, test->GetContentScale().y);
1003 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1005 std::shared_ptr<TextFrame> reuse_frame = MakeDefaultTextFrame(
"Hi", 20.0f);
1006 ASSERT_NE(reuse_frame,
nullptr);
1009 builder.Translate(100, 100);
1010 builder.Scale(first_scale, first_scale);
1012 DlPaint(DlColor::kBlue()));
1016 builder.Translate(400, 100);
1017 builder.Scale(second_scale, second_scale);
1019 DlPaint(DlColor::kPurple()));
1023 builder.Translate(100, 400);
1024 builder.Scale(first_scale, first_scale);
1025 std::shared_ptr<TextFrame> single_use_frame1 =
1026 MakeDefaultTextFrame(
"Hi", 20.0f);
1028 DlPaint(DlColor::kBlue()));
1032 builder.Translate(400, 400);
1033 builder.Scale(second_scale, second_scale);
1034 std::shared_ptr<TextFrame> single_use_frame2 =
1035 MakeDefaultTextFrame(
"Hi", 20.0f);
1037 DlPaint(DlColor::kPurple()));
1040 ASSERT_TRUE(test->OpenPlaygroundHere(builder.Build()));
1045 DrawTextFramesMultipleScalesWithReuse(
this,
1051 DrawTextFramesMultipleScalesWithReuse(
this,
1060 DisplayListBuilder builder;
1063 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
1064 builder.DrawPaint(paint);
1068 builder.Scale(2, 2);
1070 GetContext(), builder,
"Uniform 2x2",
"Roboto-Regular.ttf",
1076 builder.Scale(1, 2);
1078 GetContext(), builder,
"ScaleY 1x2",
"Roboto-Regular.ttf",
1084 builder.Scale(3, 1);
1086 GetContext(), builder,
"ScaleX 3x1",
"Roboto-Regular.ttf",
1092 builder.Scale(2, 2.2);
1094 GetContext(), builder,
"Near-uniform 2x2.2",
"Roboto-Regular.ttf",
1098 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1102 constexpr
const char* font_fixture =
"Roboto-Regular.ttf";
1103 auto c_font_fixture = std::string(font_fixture);
1104 auto mapping = flutter::testing::OpenFixtureAsSkData(c_font_fixture.c_str());
1105 ASSERT_TRUE(mapping);
1107 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
1108 SkFont sk_font(font_mgr->makeFromData(mapping), 60);
1109 sk_font.setSubpixel(
true);
1111 auto blob_corrected =
1112 SkTextBlob::MakeFromString(
"Gamma Corrected (true)", sk_font);
1113 ASSERT_TRUE(blob_corrected);
1115 text_frame_corrected->SetEnableGammaCorrection(
true);
1117 auto blob_uncorrected =
1118 SkTextBlob::MakeFromString(
"Gamma Corrected (false)", sk_font);
1119 ASSERT_TRUE(blob_uncorrected);
1121 text_frame_uncorrected->SetEnableGammaCorrection(
false);
1123 auto callback = [&]() -> sk_sp<flutter::DisplayList> {
1124 DisplayListBuilder builder;
1127 bg_paint.setColor(DlColor::ARGB(1.0, 0.1, 0.1, 0.1));
1128 builder.DrawPaint(bg_paint);
1131 text_paint.setColor(DlColor::kWhite());
1134 50, 100, text_paint);
1136 50, 200, text_paint);
1139 50, 300, text_paint);
1140 DlPaint diff_paint = text_paint;
1141 diff_paint.setBlendMode(DlBlendMode::kDifference);
1143 50, 300, diff_paint);
1145 return builder.Build();
1148 ASSERT_TRUE(OpenPlaygroundHere(callback));
1152 DisplayListBuilder builder;
1153 builder.Scale(GetContentScale().
x, GetContentScale().y);
1154 builder.Clear(DlColor::kWhite());
1156 auto frame = MakeDefaultTextFrame(
"Hello", 25.0f);
1158 DlPaint paint = DlPaint().setColor(DlColor::kMagenta());
1159 DlPaint shadow_paint_ctm = DlPaint().setMaskFilter(
1160 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 5.0f,
true));
1161 DlPaint shadow_paint_no_ctm = DlPaint().setMaskFilter(
1162 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 5.0f,
false));
1164 builder.Translate(100, 100);
1165 builder.Scale(4, 4);
1166 for (
int x = 10;
x <= 100;
x += 30) {
1167 builder.DrawText(text,
x, 20, shadow_paint_ctm);
1168 builder.DrawText(text,
x, 20, paint);
1170 builder.DrawText(text,
x, 50, shadow_paint_no_ctm);
1171 builder.DrawText(text,
x, 50, paint);
1174 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
static std::shared_ptr< DlTextImpeller > Make(const std::shared_ptr< impeller::TextFrame > &frame)
ContentContext & GetContentContext() const
std::shared_ptr< Context > GetContext() const
const std::shared_ptr< LazyGlyphAtlas > & GetLazyGlyphAtlas() const
const std::shared_ptr< RenderTargetAllocator > & GetRenderTargetCache() const
TextShadowCache & GetTextShadowCache() const
void SetTransform(const Matrix &transform)
Set the global transform matrix for this Entity.
void SetPosition(Point position)
void SetScreenTransform(const Matrix &transform)
bool Render(const ContentContext &renderer, const Entity &entity, RenderPass &pass) const override
void SetTextFrame(const std::shared_ptr< TextFrame > &frame)
void SetColor(Color color)
size_t GetCacheSizeForTesting() const
bool RenderTextInCanvasSkia(const std::shared_ptr< Context > &context, DisplayListBuilder &canvas, const std::string &text, const std::string_view &font_fixture, const TextRenderOptions &options={}, const std::optional< SkFont > &font=std::nullopt)
TEST_P(AiksTest, TextWithShadowAndPosition)
static constexpr std::string_view kFontFixture
std::shared_ptr< Texture > DisplayListToTexture(const sk_sp< flutter::DisplayList > &display_list, ISize size, AiksContext &context, bool reset_host_buffer, bool generate_mips, std::optional< PixelFormat > target_pixel_format)
Render the provided display list to a texture with the given size.
flutter::DlRoundRect DlRoundRect
std::shared_ptr< TextFrame > MakeTextFrameFromTextBlobSkia(const sk_sp< SkTextBlob > &blob)
std::shared_ptr< ContextGLES > context
std::shared_ptr< RenderPass > render_pass
std::shared_ptr< CommandBuffer > command_buffer
A 4x4 matrix using column-major storage.
constexpr Quad Transform(const Quad &quad) const
std::shared_ptr< DlMaskFilter > filter