Fonts: Baked system, v11.
This commit is contained in:
+21
-17
@@ -2497,8 +2497,9 @@ void ImTextureData::DestroyPixels()
|
|||||||
// - ImFontAtlasBuildSetupFontCreateEllipsisFromDot()
|
// - ImFontAtlasBuildSetupFontCreateEllipsisFromDot()
|
||||||
// - ImFontAtlasBuildSetupFontSpecialGlyphs()
|
// - ImFontAtlasBuildSetupFontSpecialGlyphs()
|
||||||
// - ImFontAtlasBuildDiscardUnusedBakes()
|
// - ImFontAtlasBuildDiscardUnusedBakes()
|
||||||
// - ImFontAtlasBuildDiscardFontBaked()
|
|
||||||
// - ImFontAtlasBuildDiscardFontBakedGlyph()
|
// - ImFontAtlasBuildDiscardFontBakedGlyph()
|
||||||
|
// - ImFontAtlasBuildDiscardFontBaked()
|
||||||
|
// - ImFontAtlasBuildDiscardFont()
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// - ImFontAtlasAddDrawListSharedData()
|
// - ImFontAtlasAddDrawListSharedData()
|
||||||
// - ImFontAtlasRemoveDrawListSharedData()
|
// - ImFontAtlasRemoveDrawListSharedData()
|
||||||
@@ -3623,10 +3624,9 @@ void ImFontAtlasBuildDiscardFontBakedGlyph(ImFontAtlas* atlas, ImFont* font, ImF
|
|||||||
baked->IndexAdvanceX[c] = baked->FallbackAdvanceX;
|
baked->IndexAdvanceX[c] = baked->FallbackAdvanceX;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImFontAtlasBuildDiscardFontBaked(ImFontAtlas* atlas, ImFontBaked* baked)
|
void ImFontAtlasBuildDiscardFontBaked(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked)
|
||||||
{
|
{
|
||||||
ImFontAtlasBuilder* builder = atlas->Builder;
|
ImFontAtlasBuilder* builder = atlas->Builder;
|
||||||
ImFont* font = baked->ContainerFont;
|
|
||||||
IMGUI_DEBUG_LOG_FONT("[font] Discard baked %.2f for \"%s\"\n", baked->Size, font->GetDebugName());
|
IMGUI_DEBUG_LOG_FONT("[font] Discard baked %.2f for \"%s\"\n", baked->Size, font->GetDebugName());
|
||||||
|
|
||||||
for (ImFontGlyph& glyph : baked->Glyphs)
|
for (ImFontGlyph& glyph : baked->Glyphs)
|
||||||
@@ -3643,16 +3643,25 @@ void ImFontAtlasBuildDiscardFontBaked(ImFontAtlas* atlas, ImFontBaked* baked)
|
|||||||
font->LastBaked = NULL;
|
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;
|
ImFontAtlasBuilder* builder = atlas->Builder;
|
||||||
const int GC_FRAMES = 2;
|
|
||||||
for (int baked_n = 0; baked_n < builder->BakedPool.Size; baked_n++)
|
for (int baked_n = 0; baked_n < builder->BakedPool.Size; baked_n++)
|
||||||
{
|
{
|
||||||
ImFontBaked* baked = &builder->BakedPool[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)
|
||||||
if (baked->LastUsedFrame + GC_FRAMES < atlas->Builder->FrameCount && !baked->WantDestroy)
|
ImFontAtlasBuildDiscardFontBaked(atlas, baked->ContainerFont, baked);
|
||||||
ImFontAtlasBuildDiscardFontBaked(atlas, baked);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3872,7 +3881,7 @@ void ImFontAtlasBuildMakeSpace(ImFontAtlas* atlas)
|
|||||||
// Can some baked contents be ditched?
|
// Can some baked contents be ditched?
|
||||||
//IMGUI_DEBUG_LOG_FONT("[font] ImFontAtlasBuildMakeSpace()\n");
|
//IMGUI_DEBUG_LOG_FONT("[font] ImFontAtlasBuildMakeSpace()\n");
|
||||||
ImFontAtlasBuilder* builder = atlas->Builder;
|
ImFontAtlasBuilder* builder = atlas->Builder;
|
||||||
ImFontAtlasBuildDiscardUnusedBakes(atlas, NULL);
|
ImFontAtlasBuildDiscardUnusedBakes(atlas, 2);
|
||||||
|
|
||||||
// Currently using a heuristic for repack without growing.
|
// Currently using a heuristic for repack without growing.
|
||||||
if (builder->RectsDiscardedSurface < builder->RectsPackedSurface * 0.20f)
|
if (builder->RectsDiscardedSurface < builder->RectsPackedSurface * 0.20f)
|
||||||
@@ -3920,7 +3929,7 @@ ImVec2i ImFontAtlasBuildGetTextureSizeEstimate(ImFontAtlas* atlas)
|
|||||||
void ImFontAtlasBuildCompactTexture(ImFontAtlas* atlas)
|
void ImFontAtlasBuildCompactTexture(ImFontAtlas* atlas)
|
||||||
{
|
{
|
||||||
ImFontAtlasBuilder* builder = atlas->Builder;
|
ImFontAtlasBuilder* builder = atlas->Builder;
|
||||||
ImFontAtlasBuildDiscardUnusedBakes(atlas, NULL);
|
ImFontAtlasBuildDiscardUnusedBakes(atlas, 1);
|
||||||
|
|
||||||
ImTextureData* old_tex = atlas->TexData;
|
ImTextureData* old_tex = atlas->TexData;
|
||||||
ImVec2i old_tex_size = ImVec2i(old_tex->Width, old_tex->Height);
|
ImVec2i old_tex_size = ImVec2i(old_tex->Width, old_tex->Height);
|
||||||
@@ -4747,13 +4756,7 @@ ImFont::~ImFont()
|
|||||||
void ImFont::ClearOutputData()
|
void ImFont::ClearOutputData()
|
||||||
{
|
{
|
||||||
if (ImFontAtlas* atlas = ContainerAtlas)
|
if (ImFontAtlas* atlas = ContainerAtlas)
|
||||||
if (ImFontAtlasBuilder* builder = atlas->Builder)
|
ImFontAtlasBuildDiscardFont(atlas, this);
|
||||||
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);
|
|
||||||
}
|
|
||||||
FallbackChar = EllipsisChar = 0;
|
FallbackChar = EllipsisChar = 0;
|
||||||
memset(Used8kPagesMap, 0, sizeof(Used8kPagesMap));
|
memset(Used8kPagesMap, 0, sizeof(Used8kPagesMap));
|
||||||
LastBaked = NULL;
|
LastBaked = NULL;
|
||||||
@@ -4936,6 +4939,7 @@ ImFontBaked* ImFont::GetFontBaked(float size)
|
|||||||
ImFontAtlasBuilder* builder = atlas->Builder;
|
ImFontAtlasBuilder* builder = atlas->Builder;
|
||||||
|
|
||||||
// FIXME-BAKED: Design for picking a nearest size?
|
// FIXME-BAKED: Design for picking a nearest size?
|
||||||
|
// FIXME-BAKED: Altering font density won't work right away.
|
||||||
ImGuiID baked_id = ImFontAtlasBakedGetId(FontId, size);
|
ImGuiID baked_id = ImFontAtlasBakedGetId(FontId, size);
|
||||||
ImFontBaked** p_baked_in_map = (ImFontBaked**)builder->BakedMap.GetVoidPtrRef(baked_id);
|
ImFontBaked** p_baked_in_map = (ImFontBaked**)builder->BakedMap.GetVoidPtrRef(baked_id);
|
||||||
baked = *p_baked_in_map;
|
baked = *p_baked_in_map;
|
||||||
|
|||||||
+2
-2
@@ -3767,10 +3767,10 @@ IMGUI_API ImVec2i ImFontAtlasBuildGetTextureSizeEstimate(ImFontAtlas*
|
|||||||
|
|
||||||
IMGUI_API bool ImFontAtlasBuildAddFont(ImFontAtlas* atlas, ImFontConfig* src);
|
IMGUI_API bool ImFontAtlasBuildAddFont(ImFontAtlas* atlas, ImFontConfig* src);
|
||||||
IMGUI_API void ImFontAtlasBuildSetupFontSpecialGlyphs(ImFontAtlas* atlas, ImFont* font, 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 ImFontAtlasBuildDiscardFontBaked(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked);
|
||||||
IMGUI_API void ImFontAtlasBuildDiscardFontBakedGlyph(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked, ImFontGlyph* glyph);
|
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 ImFontAtlasBuildPreloadAllGlyphRanges(ImFontAtlas* atlas); // Legacy
|
||||||
IMGUI_API void ImFontAtlasBuildGetOversampleFactors(ImFontConfig* src, float size, int* out_oversample_h, int* out_oversample_v);
|
IMGUI_API void ImFontAtlasBuildGetOversampleFactors(ImFontConfig* src, float size, int* out_oversample_h, int* out_oversample_v);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user