5 #include "display_list/display_list.h"
6 #include "display_list/dl_blend_mode.h"
7 #include "display_list/dl_tile_mode.h"
8 #include "display_list/effects/dl_color_source.h"
9 #include "display_list/effects/dl_mask_filter.h"
12 #include "flutter/display_list/dl_builder.h"
13 #include "flutter/display_list/dl_color.h"
14 #include "flutter/display_list/dl_paint.h"
15 #include "flutter/testing/testing.h"
21 #include "include/core/SkMatrix.h"
22 #include "include/core/SkRect.h"
24 #include "txt/platform.h"
36 DlColor
color = DlColor::kYellow();
37 SkPoint position = SkPoint::Make(100, 200);
38 std::shared_ptr<DlMaskFilter>
filter;
42 DisplayListBuilder& canvas,
43 const std::string& text,
44 const std::string_view& font_fixture,
48 paint.setColor(DlColor::kAqua().withAlpha(255 * 0.25));
49 canvas.DrawRect(SkRect::MakeXYWH(options.position.x() - 50,
50 options.position.y(), 900, 10),
54 paint.setColor(DlColor::kRed().withAlpha(255 * 0.25));
55 canvas.DrawCircle(options.position, 5.0, paint);
58 auto c_font_fixture = std::string(font_fixture);
59 auto mapping = flutter::testing::OpenFixtureAsSkData(c_font_fixture.c_str());
63 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
64 SkFont sk_font(font_mgr->makeFromData(mapping), options.font_size);
65 auto blob = SkTextBlob::MakeFromString(text.c_str(), sk_font);
74 text_paint.setColor(options.color);
75 text_paint.setMaskFilter(options.filter);
76 text_paint.setStrokeWidth(options.stroke_width);
77 text_paint.setDrawStyle(options.stroke ? DlDrawStyle::kStroke
78 : DlDrawStyle::kFill);
79 canvas.DrawTextFrame(frame, options.position.x(), options.position.y(),
85 DisplayListBuilder& canvas,
86 const std::string& text,
87 const std::string& font_fixture,
91 paint.setColor(DlColor::kAqua().withAlpha(255 * 0.25));
92 canvas.DrawRect(SkRect::MakeXYWH(options.position.x() - 50,
93 options.position.y(), 900, 10),
97 paint.setColor(DlColor::kRed().withAlpha(255 * 0.25));
98 canvas.DrawCircle(options.position, 5.0, paint);
101 auto mapping = flutter::testing::OpenFixtureAsMapping(font_fixture.c_str());
105 auto typeface_stb = std::make_shared<TypefaceSTB>(std::move(mapping));
108 typeface_stb, Font::Metrics{.point_size = options.font_size}, text);
111 text_paint.setColor(options.color);
113 canvas.DrawTextFrame(frame, options.position.x(), options.position.y(),
119 DisplayListBuilder builder;
122 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
123 builder.DrawPaint(paint);
125 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
126 "Roboto-Regular.ttf"));
128 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
132 DisplayListBuilder builder;
135 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
136 builder.DrawPaint(paint);
137 builder.Translate(1000, 0);
138 builder.Scale(-1, 1);
141 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
142 "Roboto-Regular.ttf"));
144 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
148 DisplayListBuilder builder;
151 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
152 builder.DrawPaint(paint);
155 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
156 "Roboto-Regular.ttf",
160 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
164 DisplayListBuilder builder;
167 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
168 builder.DrawPaint(paint);
176 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
180 DisplayListBuilder builder;
183 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
184 builder.DrawPaint(paint);
185 builder.Scale(0.5, 0.5);
188 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
189 "Roboto-Regular.ttf"));
190 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
194 DisplayListBuilder builder;
197 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
198 builder.DrawPaint(paint);
199 builder.Scale(2.625, 2.625);
202 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
203 "Roboto-Regular.ttf"));
204 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
208 DisplayListBuilder builder;
211 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
212 builder.DrawPaint(paint);
215 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
216 "Roboto-Regular.ttf"));
218 SetTypographerContext(TypographerContextSTB::Make());
219 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
224 std::array<Scalar, 20> phase_offsets = {
225 7.82637e-06, 0.131538, 0.755605, 0.45865, 0.532767,
226 0.218959, 0.0470446, 0.678865, 0.679296, 0.934693,
227 0.383502, 0.519416, 0.830965, 0.0345721, 0.0534616,
228 0.5297, 0.671149, 0.00769819, 0.383416, 0.0668422};
229 auto callback = [&]() -> sk_sp<DisplayList> {
231 static float phase_variation = 0.2;
232 static float speed = 0.5;
233 static float magnitude = 100;
234 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
235 ImGuiWindowFlags_AlwaysAutoResize)) {
236 ImGui::SliderFloat(
"Font size", &
font_size, 5, 50);
237 ImGui::SliderFloat(
"Phase variation", &phase_variation, 0, 1);
238 ImGui::SliderFloat(
"Oscillation speed", &speed, 0, 2);
239 ImGui::SliderFloat(
"Oscillation magnitude", &magnitude, 0, 300);
243 DisplayListBuilder builder;
244 builder.Scale(GetContentScale().x, GetContentScale().y);
246 for (
size_t i = 0; i < phase_offsets.size(); i++) {
247 SkPoint position = SkPoint::Make(
249 magnitude * std::sin((-phase_offsets[i] *
k2Pi * phase_variation +
250 GetSecondsElapsed() * speed)),
254 GetContext(), builder,
255 "the quick brown fox jumped over "
257 "Roboto-Regular.ttf",
258 {.font_size =
font_size, .position = position})) {
262 return builder.Build();
265 ASSERT_TRUE(OpenPlaygroundHere(callback));
269 DisplayListBuilder builder;
272 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
273 builder.DrawPaint(paint);
276 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
277 "HomemadeApple.ttf"));
278 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
283 "Apple Color Emoji.ttc";
285 "NotoColorEmoji.ttf";
289 DisplayListBuilder builder;
292 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
293 builder.DrawPaint(paint);
296 GetContext(), builder,
"😀 😃 😄 😁 😆 😅 😂 🤣 🥲 😊",
kFontFixture));
297 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
301 DisplayListBuilder builder;
303 builder.Scale(GetContentScale().x, GetContentScale().y);
305 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
306 builder.DrawPaint(paint);
309 GetContext(), builder,
"😀 😃 😄 😁 😆 😅 😂 🤣 🥲 😊",
kFontFixture,
311 .
color = DlColor::kBlue(),
312 .filter = DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 4)}));
313 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
317 DisplayListBuilder builder;
320 paint.setColor(DlColor::ARGB(1, 0.1, 0.1, 0.1));
321 builder.DrawPaint(paint);
324 GetContext(), builder,
"😀 😃 😄 😁 😆 😅 😂 🤣 🥲 😊",
kFontFixture,
325 {.color = DlColor::kBlack().modulateOpacity(0.5)}));
326 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
330 DisplayListBuilder builder;
333 paint.setColor(DlColor::ARGB(0.1, 0.1, 0.1, 0.1));
334 builder.DrawPaint(paint);
336 builder.Translate(100, 100);
337 builder.Scale(0.5, 0.5);
340 paint.setBlendMode(DlBlendMode::kClear);
341 builder.SaveLayer(
nullptr, &paint);
343 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
344 "Roboto-Regular.ttf"));
349 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
350 "Roboto-Regular.ttf"));
352 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
356 DisplayListBuilder builder;
357 builder.Translate(200, 150);
360 auto mapping = flutter::testing::OpenFixtureAsSkData(
"wtf.otf");
361 ASSERT_NE(mapping,
nullptr);
364 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
365 SkFont sk_font(font_mgr->makeFromData(mapping),
font_size);
368 text_paint.setColor(DlColor::kBlue().withAlpha(255 * 0.8));
373 } text[] = {{SkPoint::Make(0, 0),
"0F0F0F0"},
374 {SkPoint::Make(1, 2),
"789"},
375 {SkPoint::Make(1, 3),
"456"},
376 {SkPoint::Make(1, 4),
"123"},
377 {SkPoint::Make(0, 6),
"0F0F0F0"}};
378 for (
auto& t : text) {
380 builder.Translate(t.position.x() *
font_size * 2,
383 auto blob = SkTextBlob::MakeFromString(t.text, sk_font);
384 ASSERT_NE(blob,
nullptr);
386 builder.DrawTextFrame(frame, 0, 0, text_paint);
391 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
395 DisplayListBuilder builder;
397 builder.Scale(GetContentScale().x, GetContentScale().y);
399 paint.setColor(DlColor::ARGB(0.1, 0.1, 0.1, 1.0));
400 builder.DrawPaint(paint);
402 builder.Transform(SkM44::ColMajor(
Matrix(0.25, -0.3, 0, -0.002,
408 GetContext(), builder,
"the quick brown fox jumped over the lazy dog!.?",
409 "Roboto-Regular.ttf"));
411 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
415 DisplayListBuilder builder;
420 0.0, 0.0, 0.0, 1.0) *
421 Matrix::MakeRotationY({
Degrees{10}});
426 "Roboto-Regular.ttf"));
427 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
431 DisplayListBuilder builder;
436 0.0, 0.0, 0.0, 1.0) *
437 Matrix::MakeRotationY({
Degrees{10}});
440 SkRect window_bounds =
441 SkRect::MakeXYWH(0, 0, GetWindowSize().width, GetWindowSize().height);
443 builder.SaveLayer(&window_bounds, &save_paint);
444 builder.Transform(SkM44::ColMajor(matrix.
m));
447 "Roboto-Regular.ttf"));
450 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
457 DisplayListBuilder builder;
460 builder.SaveLayer(
nullptr, &save_paint);
461 builder.Transform(SkM44::ColMajor(
Matrix(2000, 0, 0, 0,
469 "Roboto-Regular.ttf"));
470 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
474 DisplayListBuilder text_builder;
476 "Roboto-Regular.ttf"));
477 auto text_display_list = text_builder.Build();
479 DisplayListBuilder builder;
481 Matrix matrix = Matrix::MakeRow(2.0, 0.0, 0.0, 0.0,
484 0.0, 0.002, 0.0, 1.0);
487 SkRect window_bounds =
488 SkRect::MakeXYWH(0, 0, GetWindowSize().width, GetWindowSize().height);
489 builder.SaveLayer(&window_bounds, &save_paint);
490 builder.Transform(SkM44::ColMajor(matrix.
m));
491 builder.DrawDisplayList(text_display_list, 1.0f);
494 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
501 auto mapping = flutter::testing::OpenFixtureAsSkData(
"Roboto-Regular.ttf");
502 ASSERT_NE(mapping,
nullptr);
505 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
506 SkFont sk_font(font_mgr->makeFromData(mapping),
font_size);
509 text_paint.setColor(DlColor::kBlue());
511 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
512 DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0)};
513 std::vector<Scalar> stops = {
517 text_paint.setColorSource(DlColorSource::MakeLinear(
526 DisplayListBuilder builder;
527 builder.Translate(100, 100);
530 auto blob = SkTextBlob::MakeFromString(
"Hello", sk_font);
531 ASSERT_NE(blob,
nullptr);
533 builder.DrawTextFrame(frame, 0, 0, text_paint);
535 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));