5 #include "flutter/testing/testing.h"
11 #include "third_party/skia/include/core/SkData.h"
12 #include "third_party/skia/include/core/SkFontMgr.h"
13 #include "third_party/skia/include/core/SkRect.h"
14 #include "third_party/skia/include/core/SkTextBlob.h"
30 const std::shared_ptr<GlyphAtlasContext>& atlas_context,
40 auto blob = SkTextBlob::MakeFromString(
41 "the quick brown fox jumped over the lazy dog.", font);
44 ASSERT_EQ(frame->GetRunCount(), 1u);
45 for (
const auto& run : frame->GetRuns()) {
46 ASSERT_TRUE(run.IsValid());
47 ASSERT_EQ(run.GetGlyphCount(), 45u);
53 ASSERT_TRUE(context && context->IsValid());
58 auto atlas_context = context->CreateGlyphAtlasContext();
59 ASSERT_TRUE(context && context->IsValid());
61 auto blob = SkTextBlob::MakeFromString(
"hello", sk_font);
66 ASSERT_NE(atlas,
nullptr);
67 ASSERT_NE(atlas->GetTexture(),
nullptr);
69 ASSERT_EQ(atlas->GetGlyphCount(), 4llu);
71 std::optional<impeller::ScaledFont> first_scaled_font;
72 std::optional<impeller::Glyph> first_glyph;
74 atlas->IterateGlyphs([&](
const ScaledFont& scaled_font,
const Glyph& glyph,
75 const Rect& rect) ->
bool {
76 first_scaled_font = scaled_font;
82 ASSERT_TRUE(first_scaled_font.has_value());
84 ->FindFontGlyphBounds(
85 {first_scaled_font.value(), first_glyph.value()})
90 auto mapping = flutter::testing::OpenFixtureAsMapping(fixture_name);
94 auto data = SkData::MakeWithProc(
95 mapping->GetMapping(), mapping->GetSize(),
96 [](
const void* ptr,
void* context) {
97 delete reinterpret_cast<fml::Mapping*>(context);
110 ASSERT_TRUE(mapping);
111 SkFont emoji_font(SkTypeface::MakeFromData(mapping), 50.0);
114 auto blob = SkTextBlob::MakeFromString(
"hello", sk_font);
125 SkTextBlob::MakeFromString(
"😀 ", emoji_font));
138 ASSERT_FALSE(color_atlas == bitmap_atlas);
143 auto atlas_context = context->CreateGlyphAtlasContext();
144 ASSERT_TRUE(context && context->IsValid());
146 auto blob = SkTextBlob::MakeFromString(
"AGH", sk_font);
151 ASSERT_NE(atlas,
nullptr);
152 ASSERT_NE(atlas->GetTexture(),
nullptr);
154 ASSERT_EQ(atlas->GetTexture()->GetSize().width,
155 atlas->GetTexture()->GetSize().height);
160 auto atlas_context = context->CreateGlyphAtlasContext();
161 ASSERT_TRUE(context && context->IsValid());
163 auto blob = SkTextBlob::MakeFromString(
"spooky skellingtons", sk_font);
168 ASSERT_NE(atlas,
nullptr);
169 ASSERT_NE(atlas->GetTexture(),
nullptr);
170 ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
177 ASSERT_EQ(atlas, next_atlas);
178 ASSERT_EQ(atlas_context->GetGlyphAtlas(), atlas);
183 auto atlas_context = context->CreateGlyphAtlasContext();
184 ASSERT_TRUE(context && context->IsValid());
186 const char* test_string =
187 "QWERTYUIOPASDFGHJKLZXCVBNMqewrtyuiopasdfghjklzxcvbnm,.<>[]{};':"
188 "2134567890-=!@#$%^&*()_+"
189 "œ∑´®†¥¨ˆøπ““‘‘åß∂ƒ©˙∆˚¬…æ≈ç√∫˜µ≤≥≥≥≥÷¡™£¢∞§¶•ªº–≠⁄€‹›fifl‡°·‚—±Œ„´‰Á¨Ø∏”’/"
193 auto blob = SkTextBlob::MakeFromString(test_string, sk_font);
197 size_t size_count = 8;
198 for (
size_t index = 0; index < size_count; index += 1) {
200 font_glyph_map, 0.6 * index);
204 std::move(atlas_context), font_glyph_map);
205 ASSERT_NE(atlas,
nullptr);
206 ASSERT_NE(atlas->GetTexture(),
nullptr);
208 std::set<uint16_t> unique_glyphs;
209 std::vector<uint16_t> total_glyphs;
210 atlas->IterateGlyphs(
212 unique_glyphs.insert(glyph.
index);
213 total_glyphs.push_back(glyph.
index);
217 EXPECT_EQ(unique_glyphs.size() * size_count, atlas->GetGlyphCount());
218 EXPECT_EQ(total_glyphs.size(), atlas->GetGlyphCount());
220 EXPECT_TRUE(atlas->GetGlyphCount() > 0);
221 EXPECT_TRUE(atlas->GetTexture()->GetSize().width > 0);
222 EXPECT_TRUE(atlas->GetTexture()->GetSize().height > 0);
227 auto atlas_context = context->CreateGlyphAtlasContext();
228 ASSERT_TRUE(context && context->IsValid());
230 auto blob = SkTextBlob::MakeFromString(
"spooky 1", sk_font);
235 auto old_packer = atlas_context->GetRectPacker();
237 ASSERT_NE(atlas,
nullptr);
238 ASSERT_NE(atlas->GetTexture(),
nullptr);
239 ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
241 auto* first_texture = atlas->GetTexture().get();
245 auto blob2 = SkTextBlob::MakeFromString(
"spooky 2", sk_font);
249 ASSERT_EQ(atlas, next_atlas);
250 auto* second_texture = next_atlas->GetTexture().get();
252 auto new_packer = atlas_context->GetRectPacker();
254 ASSERT_EQ(second_texture, first_texture);
255 ASSERT_EQ(old_packer, new_packer);
260 auto atlas_context = context->CreateGlyphAtlasContext();
261 ASSERT_TRUE(context && context->IsValid());
263 auto blob = SkTextBlob::MakeFromString(
"spooky 1", sk_font);
268 auto old_packer = atlas_context->GetRectPacker();
270 ASSERT_NE(atlas,
nullptr);
271 ASSERT_NE(atlas->GetTexture(),
nullptr);
272 ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
274 auto* first_texture = atlas->GetTexture().get();
279 auto blob2 = SkTextBlob::MakeFromString(
"spooky 1", sk_font);
283 ASSERT_NE(atlas, next_atlas);
284 auto* second_texture = next_atlas->GetTexture().get();
286 auto new_packer = atlas_context->GetRectPacker();
288 ASSERT_NE(second_texture, first_texture);
289 ASSERT_NE(old_packer, new_packer);
293 sk_sp<SkFontMgr> font_mgr = SkFontMgr::RefDefault();
294 sk_sp<SkTypeface> typeface =
295 font_mgr->matchFamilyStyle(
"Arial", SkFontStyle::Normal());
296 SkFont sk_font(typeface, 0.5f);
301 ASSERT_FALSE(frame->MaybeHasOverlapping());
304 SkTextBlob::MakeFromString(
"123456789", sk_font));
305 ASSERT_FALSE(frame_2->MaybeHasOverlapping());
310 ASSERT_NE(packer,
nullptr);
311 ASSERT_EQ(packer->percentFull(), 0);
313 const SkIRect packer_area = SkIRect::MakeXYWH(0, 0, 200, 100);
316 ASSERT_TRUE(packer->addRect(20, 20, &first_output));
319 const SkIRect first_rect =
320 SkIRect::MakeXYWH(first_output.
x(), first_output.
y(), 20, 20);
321 ASSERT_TRUE(SkIRect::Intersects(packer_area, first_rect));
328 ASSERT_TRUE(packer->addRect(140, 90, &second_output));
329 const SkIRect second_rect =
330 SkIRect::MakeXYWH(second_output.
x(), second_output.
y(), 140, 90);
333 ASSERT_TRUE(SkIRect::Intersects(packer_area, second_rect));
334 ASSERT_FALSE(SkIRect::Intersects(first_rect, second_rect));
343 ASSERT_FALSE(packer->addRect(50, 50, &output));
349 ASSERT_EQ(packer->percentFull(), 0);