488 TRACE_EVENT0(
"impeller", __FUNCTION__);
492 std::shared_ptr<GlyphAtlas> last_atlas = atlas_context->GetGlyphAtlas();
493 FML_DCHECK(last_atlas->GetType() == type);
495 if (renderable_texts.empty()) {
504 auto [new_glyphs, glyph_sizes] =
505 CollectNewGlyphs(last_atlas, renderable_texts);
506 if (new_glyphs.size() == 0) {
514 std::vector<Rect> glyph_positions;
515 glyph_positions.reserve(new_glyphs.size());
516 size_t first_missing_index = 0;
518 if (last_atlas->GetTexture()) {
521 last_atlas, new_glyphs, glyph_positions, glyph_sizes,
522 atlas_context->GetAtlasSize(), atlas_context->GetHeightAdjustment(),
523 atlas_context->GetRectPacker());
529 for (
size_t i = 0; i < first_missing_index; i++) {
530 last_atlas->AddTypefaceGlyphPositionAndBounds(
531 new_glyphs[i], glyph_positions[i], glyph_sizes[i]);
534 std::shared_ptr<CommandBuffer> cmd_buffer = context.CreateCommandBuffer();
535 std::shared_ptr<BlitPass> blit_pass = cmd_buffer->CreateBlitPass();
537 fml::ScopedCleanupClosure closure([&]() {
538 blit_pass->EncodeCommands();
539 if (!context.EnqueueCommandBuffer(std::move(cmd_buffer))) {
540 VALIDATION_LOG <<
"Failed to submit glyph atlas command buffer";
549 last_atlas->GetTexture(), new_glyphs, 0,
550 first_missing_index)) {
555 if (first_missing_index == new_glyphs.size()) {
560 int64_t height_adjustment = atlas_context->GetAtlasSize().height;
561 const int64_t max_texture_height =
562 context.GetResourceAllocator()->GetMaxTextureSizeSupported().height;
569 bool blit_old_atlas =
true;
570 std::shared_ptr<GlyphAtlas> new_atlas = last_atlas;
571 if (atlas_context->GetAtlasSize().height >= max_texture_height ||
573 blit_old_atlas =
false;
574 new_atlas = std::make_shared<GlyphAtlas>(
575 type, last_atlas->GetAtlasGeneration() + 1);
577 auto [update_glyphs, update_sizes] =
578 CollectNewGlyphs(new_atlas, renderable_texts);
579 new_glyphs = std::move(update_glyphs);
580 glyph_sizes = std::move(update_sizes);
582 glyph_positions.clear();
583 glyph_positions.reserve(new_glyphs.size());
584 first_missing_index = 0;
586 height_adjustment = 0;
587 atlas_context->UpdateRectPacker(
nullptr);
588 atlas_context->UpdateGlyphAtlas(new_atlas, {0, 0}, 0);
600 atlas_context->UpdateGlyphAtlas(new_atlas, atlas_size, height_adjustment);
601 if (atlas_size.IsEmpty()) {
604 FML_DCHECK(new_glyphs.size() == glyph_positions.size());
606 TextureDescriptor descriptor;
610 context.GetCapabilities()->GetDefaultGlyphAtlasFormat();
616 descriptor.size = atlas_size;
619 std::shared_ptr<Texture> new_texture =
620 context.GetResourceAllocator()->CreateTexture(descriptor);
625 new_texture->SetLabel(
"GlyphAtlas");
627 std::shared_ptr<CommandBuffer> cmd_buffer = context.CreateCommandBuffer();
628 std::shared_ptr<BlitPass> blit_pass = cmd_buffer->CreateBlitPass();
630 fml::ScopedCleanupClosure closure([&]() {
631 blit_pass->EncodeCommands();
632 if (!context.EnqueueCommandBuffer(std::move(cmd_buffer))) {
633 VALIDATION_LOG <<
"Failed to submit glyph atlas command buffer";
638 auto old_texture = new_atlas->GetTexture();
639 new_atlas->SetTexture(std::move(new_texture));
645 for (
size_t i = first_missing_index; i < glyph_positions.size(); i++) {
646 new_atlas->AddTypefaceGlyphPositionAndBounds(
647 new_glyphs[i], glyph_positions[i], glyph_sizes[i]);
655 new_atlas->GetTexture(), new_glyphs,
656 first_missing_index, new_glyphs.size())) {
661 if (blit_old_atlas && old_texture) {
662 blit_pass->AddCopy(old_texture, new_atlas->GetTexture(),
virtual bool IsValid() const
static bool UpdateAtlasBitmap(const GlyphAtlas &atlas, std::shared_ptr< BlitPass > &blit_pass, HostBuffer &data_host_buffer, const std::shared_ptr< Texture > &texture, const std::vector< FontGlyphPair > &new_pairs, size_t start_index, size_t end_index)
static size_t AppendToExistingAtlas(const std::shared_ptr< GlyphAtlas > &atlas, const std::vector< FontGlyphPair > &extra_pairs, std::vector< Rect > &glyph_positions, const std::vector< Rect > &glyph_sizes, ISize atlas_size, int64_t height_adjustment, const std::shared_ptr< RectanglePacker > &rect_packer)
static ISize ComputeNextAtlasSize(const std::shared_ptr< GlyphAtlasContext > &atlas_context, const std::vector< FontGlyphPair > &extra_pairs, std::vector< Rect > &glyph_positions, const std::vector< Rect > &glyph_sizes, size_t glyph_index_start, int64_t max_texture_height)
static bool BulkUpdateAtlasBitmap(const GlyphAtlas &atlas, std::shared_ptr< BlitPass > &blit_pass, HostBuffer &data_host_buffer, const std::shared_ptr< Texture > &texture, const std::vector< FontGlyphPair > &new_pairs, size_t start_index, size_t end_index)
Batch render to a single surface.
constexpr static TRect MakeSize(const TSize< U > &size)