5 #include "flutter/display_list/testing/dl_test_snippets.h"
6 #include "flutter/testing/testing.h"
12 #include "third_party/skia/include/core/SkFont.h"
13 #include "third_party/skia/include/core/SkFontMgr.h"
14 #include "third_party/skia/include/core/SkRect.h"
15 #include "third_party/skia/include/core/SkTextBlob.h"
16 #include "third_party/skia/include/core/SkTypeface.h"
17 #include "txt/platform.h"
33 const std::shared_ptr<GlyphAtlasContext>& atlas_context,
42 SkFont font = flutter::testing::CreateTestFontOfSize(12);
43 auto blob = SkTextBlob::MakeFromString(
44 "the quick brown fox jumped over the lazy dog.", font);
47 ASSERT_EQ(frame->GetRunCount(), 1u);
48 for (
const auto& run : frame->GetRuns()) {
49 ASSERT_TRUE(run.IsValid());
50 ASSERT_EQ(run.GetGlyphCount(), 45u);
56 ASSERT_TRUE(context && context->IsValid());
61 auto atlas_context = context->CreateGlyphAtlasContext();
62 ASSERT_TRUE(context && context->IsValid());
63 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
64 auto blob = SkTextBlob::MakeFromString(
"hello", sk_font);
69 ASSERT_NE(atlas,
nullptr);
70 ASSERT_NE(atlas->GetTexture(),
nullptr);
72 ASSERT_EQ(atlas->GetGlyphCount(), 4llu);
74 std::optional<impeller::ScaledFont> first_scaled_font;
75 std::optional<impeller::Glyph> first_glyph;
77 atlas->IterateGlyphs([&](
const ScaledFont& scaled_font,
const Glyph& glyph,
78 const Rect& rect) ->
bool {
79 first_scaled_font = scaled_font;
85 ASSERT_TRUE(first_scaled_font.has_value());
87 ->FindFontGlyphBounds(
88 {first_scaled_font.value(), first_glyph.value()})
94 auto mapping = flutter::testing::OpenFixtureAsSkData(
"Apple Color Emoji.ttc");
96 auto mapping = flutter::testing::OpenFixtureAsSkData(
"NotoColorEmoji.ttf");
99 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
100 SkFont emoji_font(font_mgr->makeFromData(mapping), 50.0);
101 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
103 auto blob = SkTextBlob::MakeFromString(
"hello", sk_font);
114 SkTextBlob::MakeFromString(
"😀 ", emoji_font));
127 ASSERT_FALSE(color_atlas == bitmap_atlas);
132 auto atlas_context = context->CreateGlyphAtlasContext();
133 ASSERT_TRUE(context && context->IsValid());
134 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
135 auto blob = SkTextBlob::MakeFromString(
"AGH", sk_font);
140 ASSERT_NE(atlas,
nullptr);
141 ASSERT_NE(atlas->GetTexture(),
nullptr);
143 ASSERT_EQ(atlas->GetTexture()->GetSize().width,
144 atlas->GetTexture()->GetSize().height);
149 auto atlas_context = context->CreateGlyphAtlasContext();
150 ASSERT_TRUE(context && context->IsValid());
151 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
152 auto blob = SkTextBlob::MakeFromString(
"spooky skellingtons", sk_font);
157 ASSERT_NE(atlas,
nullptr);
158 ASSERT_NE(atlas->GetTexture(),
nullptr);
159 ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
166 ASSERT_EQ(atlas, next_atlas);
167 ASSERT_EQ(atlas_context->GetGlyphAtlas(), atlas);
172 auto atlas_context = context->CreateGlyphAtlasContext();
173 ASSERT_TRUE(context && context->IsValid());
175 const char* test_string =
176 "QWERTYUIOPASDFGHJKLZXCVBNMqewrtyuiopasdfghjklzxcvbnm,.<>[]{};':"
177 "2134567890-=!@#$%^&*()_+"
178 "œ∑´®†¥¨ˆøπ““‘‘åß∂ƒ©˙∆˚¬…æ≈ç√∫˜µ≤≥≥≥≥÷¡™£¢∞§¶•ªº–≠⁄€‹›fifl‡°·‚—±Œ„´‰Á¨Ø∏”’/"
181 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
182 auto blob = SkTextBlob::MakeFromString(test_string, sk_font);
186 size_t size_count = 8;
187 for (
size_t index = 0; index < size_count; index += 1) {
189 font_glyph_map, 0.6 * index);
193 atlas_context, font_glyph_map);
194 ASSERT_NE(atlas,
nullptr);
195 ASSERT_NE(atlas->GetTexture(),
nullptr);
197 std::set<uint16_t> unique_glyphs;
198 std::vector<uint16_t> total_glyphs;
199 atlas->IterateGlyphs(
201 unique_glyphs.insert(glyph.
index);
202 total_glyphs.push_back(glyph.
index);
206 EXPECT_EQ(unique_glyphs.size() * size_count, atlas->GetGlyphCount());
207 EXPECT_EQ(total_glyphs.size(), atlas->GetGlyphCount());
209 EXPECT_TRUE(atlas->GetGlyphCount() > 0);
210 EXPECT_TRUE(atlas->GetTexture()->GetSize().width > 0);
211 EXPECT_TRUE(atlas->GetTexture()->GetSize().height > 0);
216 auto atlas_context = context->CreateGlyphAtlasContext();
217 ASSERT_TRUE(context && context->IsValid());
218 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
219 auto blob = SkTextBlob::MakeFromString(
"spooky 1", sk_font);
224 auto old_packer = atlas_context->GetRectPacker();
226 ASSERT_NE(atlas,
nullptr);
227 ASSERT_NE(atlas->GetTexture(),
nullptr);
228 ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
230 auto* first_texture = atlas->GetTexture().get();
234 auto blob2 = SkTextBlob::MakeFromString(
"spooky 2", sk_font);
238 ASSERT_EQ(atlas, next_atlas);
239 auto* second_texture = next_atlas->GetTexture().get();
241 auto new_packer = atlas_context->GetRectPacker();
243 ASSERT_EQ(second_texture, first_texture);
244 ASSERT_EQ(old_packer, new_packer);
249 auto atlas_context = context->CreateGlyphAtlasContext();
250 ASSERT_TRUE(context && context->IsValid());
251 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
252 auto blob = SkTextBlob::MakeFromString(
"spooky 1", sk_font);
257 auto old_packer = atlas_context->GetRectPacker();
259 ASSERT_NE(atlas,
nullptr);
260 ASSERT_NE(atlas->GetTexture(),
nullptr);
261 ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
263 auto* first_texture = atlas->GetTexture().get();
268 auto blob2 = SkTextBlob::MakeFromString(
"spooky 1", sk_font);
272 ASSERT_NE(atlas, next_atlas);
273 auto* second_texture = next_atlas->GetTexture().get();
275 auto new_packer = atlas_context->GetRectPacker();
277 ASSERT_NE(second_texture, first_texture);
278 ASSERT_NE(old_packer, new_packer);
282 sk_sp<SkFontMgr> font_mgr = txt::GetDefaultFontManager();
283 sk_sp<SkTypeface> typeface =
284 font_mgr->matchFamilyStyle(
"Arial", SkFontStyle::Normal());
285 SkFont sk_font(typeface, 0.5f);
290 ASSERT_FALSE(frame->MaybeHasOverlapping());
293 SkTextBlob::MakeFromString(
"123456789", sk_font));
294 ASSERT_FALSE(frame_2->MaybeHasOverlapping());
299 ASSERT_NE(packer,
nullptr);
300 ASSERT_EQ(packer->percentFull(), 0);
302 const SkIRect packer_area = SkIRect::MakeXYWH(0, 0, 200, 100);
305 ASSERT_TRUE(packer->addRect(20, 20, &first_output));
308 const SkIRect first_rect =
309 SkIRect::MakeXYWH(first_output.
x(), first_output.
y(), 20, 20);
310 ASSERT_TRUE(SkIRect::Intersects(packer_area, first_rect));
317 ASSERT_TRUE(packer->addRect(140, 90, &second_output));
318 const SkIRect second_rect =
319 SkIRect::MakeXYWH(second_output.
x(), second_output.
y(), 140, 90);
322 ASSERT_TRUE(SkIRect::Intersects(packer_area, second_rect));
323 ASSERT_FALSE(SkIRect::Intersects(first_rect, second_rect));
332 ASSERT_FALSE(packer->addRect(50, 50, &output));
338 ASSERT_EQ(packer->percentFull(), 0);
342 GlyphAtlasTextureIsRecycledWhenContentsAreNotRecreated) {
344 auto atlas_context = context->CreateGlyphAtlasContext();
345 ASSERT_TRUE(context && context->IsValid());
346 SkFont sk_font = flutter::testing::CreateTestFontOfSize(12);
347 auto blob = SkTextBlob::MakeFromString(
"ABCDEFGHIJKLMNOPQRSTUVQXYZ123456789",
353 auto old_packer = atlas_context->GetRectPacker();
355 ASSERT_NE(atlas,
nullptr);
356 ASSERT_NE(atlas->GetTexture(),
nullptr);
357 ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
359 auto* first_texture = atlas->GetTexture().get();
364 auto blob2 = SkTextBlob::MakeFromString(
"abcdefghijklmnopqrstuvwxyz123456789",
369 ASSERT_NE(atlas, next_atlas);
370 auto* second_texture = next_atlas->GetTexture().get();
372 auto new_packer = atlas_context->GetRectPacker();
374 ASSERT_NE(second_texture, first_texture);
375 ASSERT_NE(old_packer, new_packer);