Sfoglia il codice sorgente

Fonts: Baked system, v11.

ocornut 7 mesi fa
parent
commit
df694c89b0
2 ha cambiato i file con 23 aggiunte e 19 eliminazioni
  1. 21 17
      imgui_draw.cpp
  2. 2 2
      imgui_internal.h

+ 21 - 17
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;

+ 2 - 2
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);