5 #include "flutter/display_list/testing/dl_test_snippets.h"
6 #include "flutter/testing/testing.h"
7 #include "gtest/gtest.h"
16 #include "third_party/skia/include/core/SkFont.h"
17 #include "third_party/skia/include/core/SkFontMgr.h"
18 #include "third_party/skia/include/core/SkRect.h"
19 #include "third_party/skia/include/core/SkTextBlob.h"
20 #include "third_party/skia/include/core/SkTypeface.h"
21 #include "txt/platform.h"
38 const std::shared_ptr<GlyphAtlasContext>& atlas_context,
43 atlas_context, font_glyph_map);
52 const std::shared_ptr<GlyphAtlasContext>& atlas_context,
53 const std::vector<std::shared_ptr<TextFrame>>& frames,
54 const std::vector<GlyphProperties>& properties) {
57 for (
auto& frame : frames) {
58 frame->CollectUniqueFontGlyphPairs(font_glyph_map,
scale, {0, 0},
62 atlas_context, font_glyph_map);
66 SkFont font = flutter::testing::CreateTestFontOfSize(12);
67 auto blob = SkTextBlob::MakeFromString(
68 "the quick brown fox jumped over the lazy dog.", font);
71 ASSERT_EQ(frame->GetRunCount(), 1u);
72 for (
const auto& run : frame->GetRuns()) {
73 ASSERT_TRUE(run.IsValid());
74 ASSERT_EQ(run.GetGlyphCount(), 45u);
80 ASSERT_TRUE(context && context->IsValid());
88 ASSERT_TRUE(context && context->IsValid());
89 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
90 auto blob = SkTextBlob::MakeFromString(
"hello", sk_font);
96 ASSERT_NE(atlas,
nullptr);
97 ASSERT_NE(atlas->GetTexture(),
nullptr);
99 ASSERT_EQ(atlas->GetGlyphCount(), 4llu);
101 std::optional<impeller::ScaledFont> first_scaled_font;
102 std::optional<impeller::SubpixelGlyph> first_glyph;
104 atlas->IterateGlyphs([&](
const ScaledFont& scaled_font,
106 const Rect& rect) ->
bool {
107 first_scaled_font = scaled_font;
113 ASSERT_TRUE(first_scaled_font.has_value());
115 ->FindFontGlyphBounds(
116 {first_scaled_font.value(), first_glyph.value()})
123 auto mapping = flutter::testing::OpenFixtureAsSkData(
"Apple Color Emoji.ttc");
125 auto mapping = flutter::testing::OpenFixtureAsSkData(
"NotoColorEmoji.ttf");
127 ASSERT_TRUE(mapping);
128 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
129 SkFont emoji_font(font_mgr->makeFromData(mapping), 50.0);
130 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
132 auto blob = SkTextBlob::MakeFromString(
"hello", sk_font);
143 SkTextBlob::MakeFromString(
"😀 ", emoji_font));
156 ASSERT_FALSE(color_atlas == bitmap_atlas);
164 ASSERT_TRUE(context && context->IsValid());
165 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
166 auto blob = SkTextBlob::MakeFromString(
"AGH", sk_font);
172 ASSERT_NE(atlas,
nullptr);
173 ASSERT_NE(atlas->GetTexture(),
nullptr);
175 EXPECT_EQ(atlas->GetTexture()->GetSize().width, 4096u);
176 EXPECT_EQ(atlas->GetTexture()->GetSize().height, 1024u);
184 ASSERT_TRUE(context && context->IsValid());
185 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
186 auto blob = SkTextBlob::MakeFromString(
"spooky skellingtons", sk_font);
192 ASSERT_NE(atlas,
nullptr);
193 ASSERT_NE(atlas->GetTexture(),
nullptr);
194 ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
202 ASSERT_EQ(atlas, next_atlas);
203 ASSERT_EQ(atlas_context->GetGlyphAtlas(), atlas);
211 ASSERT_TRUE(context && context->IsValid());
213 const char* test_string =
214 "QWERTYUIOPASDFGHJKLZXCVBNMqewrtyuiopasdfghjklzxcvbnm,.<>[]{};':"
215 "2134567890-=!@#$%^&*()_+"
216 "œ∑´®†¥¨ˆøπ““‘‘åß∂ƒ©˙∆˚¬…æ≈ç√∫˜µ≤≥≥≥≥÷¡™£¢∞§¶•ªº–≠⁄€‹›fifl‡°·‚—±Œ„´‰Á¨Ø∏”’/"
219 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
220 auto blob = SkTextBlob::MakeFromString(test_string, sk_font);
224 size_t size_count = 8;
225 for (
size_t index = 0; index < size_count; index += 1) {
227 font_glyph_map, 0.6 * index, {0, 0}, {});
231 *host_buffer, atlas_context, font_glyph_map);
232 ASSERT_NE(atlas,
nullptr);
233 ASSERT_NE(atlas->GetTexture(),
nullptr);
235 std::set<uint16_t> unique_glyphs;
236 std::vector<uint16_t> total_glyphs;
237 atlas->IterateGlyphs([&](
const ScaledFont& scaled_font,
245 EXPECT_LE(unique_glyphs.size() * size_count, atlas->GetGlyphCount());
246 EXPECT_EQ(total_glyphs.size(), atlas->GetGlyphCount());
248 EXPECT_TRUE(atlas->GetGlyphCount() > 0);
249 EXPECT_TRUE(atlas->GetTexture()->GetSize().width > 0);
250 EXPECT_TRUE(atlas->GetTexture()->GetSize().height > 0);
258 ASSERT_TRUE(context && context->IsValid());
259 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
260 auto blob = SkTextBlob::MakeFromString(
"spooky 1", sk_font);
266 auto old_packer = atlas_context->GetRectPacker();
268 ASSERT_NE(atlas,
nullptr);
269 ASSERT_NE(atlas->GetTexture(),
nullptr);
270 ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
272 auto* first_texture = atlas->GetTexture().get();
276 auto blob2 = SkTextBlob::MakeFromString(
"spooky 2", sk_font);
281 ASSERT_EQ(atlas, next_atlas);
282 auto* second_texture = next_atlas->GetTexture().get();
284 auto new_packer = atlas_context->GetRectPacker();
286 ASSERT_EQ(second_texture, first_texture);
287 ASSERT_EQ(old_packer, new_packer);
293 auto mapping = flutter::testing::OpenFixtureAsSkData(
"Apple Color Emoji.ttc");
295 auto mapping = flutter::testing::OpenFixtureAsSkData(
"NotoColorEmoji.ttf");
297 ASSERT_TRUE(mapping);
298 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
299 SkFont emoji_font(font_mgr->makeFromData(mapping), 50.0);
308 SkTextBlob::MakeFromString(
"😂", emoji_font));
310 SkTextBlob::MakeFromString(
"😂", emoji_font));
319 {frame, frame_2}, properties);
321 EXPECT_EQ(next_atlas->GetGlyphCount(), 2u);
326 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
327 sk_sp<SkTypeface> typeface =
328 font_mgr->matchFamilyStyle(
"Arial", SkFontStyle::Normal());
329 SkFont sk_font(typeface, 0.5f);
349 {frame, frame_2}, properties);
351 EXPECT_EQ(next_atlas->GetGlyphCount(), 1u);
356 ASSERT_NE(packer,
nullptr);
357 ASSERT_EQ(packer->PercentFull(), 0);
359 const SkIRect packer_area = SkIRect::MakeXYWH(0, 0, 200, 100);
362 ASSERT_TRUE(packer->AddRect(20, 20, &first_output));
365 const SkIRect first_rect =
366 SkIRect::MakeXYWH(first_output.
x(), first_output.
y(), 20, 20);
367 ASSERT_TRUE(SkIRect::Intersects(packer_area, first_rect));
374 ASSERT_TRUE(packer->AddRect(140, 90, &second_output));
375 const SkIRect second_rect =
376 SkIRect::MakeXYWH(second_output.
x(), second_output.
y(), 140, 90);
379 ASSERT_TRUE(SkIRect::Intersects(packer_area, second_rect));
380 ASSERT_FALSE(SkIRect::Intersects(first_rect, second_rect));
389 ASSERT_FALSE(packer->AddRect(50, 50, &output));
395 ASSERT_EQ(packer->PercentFull(), 0);
403 for (
auto i = 0u; i < 16; i++) {
404 skyline->AddRect(16, 16, &loc);
407 EXPECT_EQ(loc.
x(), 256 - 16);
408 EXPECT_EQ(loc.
y(), 0);
411 for (
auto i = 0u; i < 16; i++) {
412 skyline->AddRect(16, 16, &loc);
415 EXPECT_EQ(loc.
x(), 256 - 16);
416 EXPECT_EQ(loc.
y(), 16);
421 GTEST_SKIP() <<
"Atlas growth isn't supported for OpenGLES currently.";
428 ASSERT_TRUE(context && context->IsValid());
429 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
430 auto blob = SkTextBlob::MakeFromString(
"A", sk_font);
440 constexpr
ISize expected_sizes[13] = {
456 SkFont sk_font_small = flutter::testing::CreateTestFontOfSize(10);
458 for (
int i = 0; i < 13; i++) {
459 SkTextBlobBuilder builder;
461 auto add_char = [&](
const SkFont& sk_font,
char c) {
462 int count = sk_font.countText(&c, 1, SkTextEncoding::kUTF8);
463 auto buffer = builder.allocRunPos(sk_font, count);
464 sk_font.textToGlyphs(&c, 1, SkTextEncoding::kUTF8, buffer.glyphs, count);
465 sk_font.getPos(buffer.glyphs, count, buffer.points(), {0, 0});
468 SkFont sk_font = flutter::testing::CreateTestFontOfSize(50 + i);
469 add_char(sk_font,
'A');
470 add_char(sk_font_small,
'B');
471 auto blob = builder.make();
477 ASSERT_TRUE(!!atlas);
478 EXPECT_EQ(atlas->GetTexture()->GetTextureDescriptor().size,
485 ASSERT_EQ(atlas->GetGlyphCount(), 2u);