diff --git a/imgui_draw.cpp b/imgui_draw.cpp index ef7ff1549..b537132fb 100644 --- a/imgui_draw.cpp +++ b/imgui_draw.cpp @@ -2497,8 +2497,9 @@ void ImTextureData::DestroyPixels() // - ImFontAtlasBuildSetupFontCreateEllipsisFromDot() // - ImFontAtlasBuildSetupFontSpecialGlyphs() // - ImFontAtlasBuildDiscardUnusedBakes() -// - ImFontAtlasBuildDiscardFontBaked() // - ImFontAtlasBuildDiscardFontBakedGlyph() +// - ImFontAtlasBuildDiscardFontBaked() +// - ImFontAtlasBuildDiscardFont() //----------------------------------------------------------------------------- // - ImFontAtlasAddDrawListSharedData() // - ImFontAtlasRemoveDrawListSharedData() @@ -3623,10 +3624,9 @@ void ImFontAtlasBuildDiscardFontBakedGlyph(ImFontAtlas* atlas, ImFont* font, ImF baked->IndexAdvanceX[c] = baked->FallbackAdvanceX; } -void ImFontAtlasBuildDiscardFontBaked(ImFontAtlas* atlas, ImFontBaked* baked) +void ImFontAtlasBuildDiscardFontBaked(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked) { ImFontAtlasBuilder* builder = atlas->Builder; - ImFont* font = baked->ContainerFont; IMGUI_DEBUG_LOG_FONT("[font] Discard baked %.2f for \"%s\"\n", baked->Size, font->GetDebugName()); for (ImFontGlyph& glyph : baked->Glyphs) @@ -3643,16 +3643,25 @@ void ImFontAtlasBuildDiscardFontBaked(ImFontAtlas* atlas, ImFontBaked* baked) font->LastBaked = NULL; } -void ImFontAtlasBuildDiscardUnusedBakes(ImFontAtlas* atlas, ImFont* font_filter) +void ImFontAtlasBuildDiscardFont(ImFontAtlas* atlas, ImFont* font) +{ + if (ImFontAtlasBuilder* builder = atlas->Builder) // This can be called from font destructor + for (int baked_n = 0; baked_n < builder->BakedPool.Size; baked_n++) + { + ImFontBaked* baked = &builder->BakedPool[baked_n]; + if (baked->ContainerFont == font && !baked->WantDestroy) + ImFontAtlasBuildDiscardFontBaked(atlas, font, baked); + } +} + +void ImFontAtlasBuildDiscardUnusedBakes(ImFontAtlas* atlas, int gc_frames) { ImFontAtlasBuilder* builder = atlas->Builder; - const int GC_FRAMES = 2; for (int baked_n = 0; baked_n < builder->BakedPool.Size; baked_n++) { ImFontBaked* baked = &builder->BakedPool[baked_n]; - if (font_filter == NULL || baked->ContainerFont == font_filter) - if (baked->LastUsedFrame + GC_FRAMES < atlas->Builder->FrameCount && !baked->WantDestroy) - ImFontAtlasBuildDiscardFontBaked(atlas, baked); + if (baked->LastUsedFrame + gc_frames < atlas->Builder->FrameCount && !baked->WantDestroy) + ImFontAtlasBuildDiscardFontBaked(atlas, baked->ContainerFont, baked); } } @@ -3872,7 +3881,7 @@ void ImFontAtlasBuildMakeSpace(ImFontAtlas* atlas) // Can some baked contents be ditched? //IMGUI_DEBUG_LOG_FONT("[font] ImFontAtlasBuildMakeSpace()\n"); ImFontAtlasBuilder* builder = atlas->Builder; - ImFontAtlasBuildDiscardUnusedBakes(atlas, NULL); + ImFontAtlasBuildDiscardUnusedBakes(atlas, 2); // Currently using a heuristic for repack without growing. if (builder->RectsDiscardedSurface < builder->RectsPackedSurface * 0.20f) @@ -3920,7 +3929,7 @@ ImVec2i ImFontAtlasBuildGetTextureSizeEstimate(ImFontAtlas* atlas) void ImFontAtlasBuildCompactTexture(ImFontAtlas* atlas) { ImFontAtlasBuilder* builder = atlas->Builder; - ImFontAtlasBuildDiscardUnusedBakes(atlas, NULL); + ImFontAtlasBuildDiscardUnusedBakes(atlas, 1); ImTextureData* old_tex = atlas->TexData; ImVec2i old_tex_size = ImVec2i(old_tex->Width, old_tex->Height); @@ -4747,13 +4756,7 @@ ImFont::~ImFont() void ImFont::ClearOutputData() { if (ImFontAtlas* atlas = ContainerAtlas) - if (ImFontAtlasBuilder* builder = atlas->Builder) - for (int baked_n = 0; baked_n < builder->BakedPool.Size; baked_n++) - { - ImFontBaked* baked = &builder->BakedPool[baked_n]; - if (baked->ContainerFont == this) - ImFontAtlasBuildDiscardFontBaked(atlas, baked); - } + ImFontAtlasBuildDiscardFont(atlas, this); FallbackChar = EllipsisChar = 0; memset(Used8kPagesMap, 0, sizeof(Used8kPagesMap)); LastBaked = NULL; @@ -4936,6 +4939,7 @@ ImFontBaked* ImFont::GetFontBaked(float size) ImFontAtlasBuilder* builder = atlas->Builder; // FIXME-BAKED: Design for picking a nearest size? + // FIXME-BAKED: Altering font density won't work right away. ImGuiID baked_id = ImFontAtlasBakedGetId(FontId, size); ImFontBaked** p_baked_in_map = (ImFontBaked**)builder->BakedMap.GetVoidPtrRef(baked_id); baked = *p_baked_in_map; diff --git a/imgui_internal.h b/imgui_internal.h index 3216f2181..a54e3a350 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -3767,10 +3767,10 @@ IMGUI_API ImVec2i ImFontAtlasBuildGetTextureSizeEstimate(ImFontAtlas* IMGUI_API bool ImFontAtlasBuildAddFont(ImFontAtlas* atlas, ImFontConfig* src); IMGUI_API void ImFontAtlasBuildSetupFontSpecialGlyphs(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src); -IMGUI_API void ImFontAtlasBuildDiscardUnusedBakes(ImFontAtlas* atlas, ImFont* font_filter); +IMGUI_API void ImFontAtlasBuildDiscardUnusedBakes(ImFontAtlas* atlas, int gc_frames); +IMGUI_API void ImFontAtlasBuildDiscardFont(ImFontAtlas* atlas, ImFont* font); IMGUI_API void ImFontAtlasBuildDiscardFontBaked(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked); IMGUI_API void ImFontAtlasBuildDiscardFontBakedGlyph(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked, ImFontGlyph* glyph); -IMGUI_API void ImFontAtlasBuildReloadFont(ImFontAtlas* atlas, ImFont* font); // <--- Your future new best friend! IMGUI_API void ImFontAtlasBuildPreloadAllGlyphRanges(ImFontAtlas* atlas); // Legacy IMGUI_API void ImFontAtlasBuildGetOversampleFactors(ImFontConfig* src, float size, int* out_oversample_h, int* out_oversample_v);