mirror of
https://github.com/ocornut/imgui.git
synced 2025-09-11 22:08:26 +00:00
Fonts: added "Input Glyphs Overlap Detection Tool". Added "Clear bakes", "Clear unused" buttons. Move code.
This commit is contained in:
52
imgui.cpp
52
imgui.cpp
@@ -16699,6 +16699,21 @@ void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, co
|
|||||||
out_draw_list->Flags = backup_flags;
|
out_draw_list->Flags = backup_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [DEBUG] Compute mask of inputs with the same codepoint.
|
||||||
|
static int CalcFontGlyphSrcOverlapMask(ImFontAtlas* atlas, ImFont* font, unsigned int codepoint)
|
||||||
|
{
|
||||||
|
int mask = 0, count = 0;
|
||||||
|
for (int src_n = 0; src_n < font->Sources.Size; src_n++)
|
||||||
|
{
|
||||||
|
ImFontConfig* src = font->Sources[src_n];
|
||||||
|
if (!(src->FontLoader ? src->FontLoader : atlas->FontLoader)->FontSrcContainsGlyph(atlas, src, (ImWchar)codepoint))
|
||||||
|
continue;
|
||||||
|
mask |= (1 << src_n);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count > 1 ? mask : 0;
|
||||||
|
}
|
||||||
|
|
||||||
// [DEBUG] Display details for a single font, called by ShowStyleEditor().
|
// [DEBUG] Display details for a single font, called by ShowStyleEditor().
|
||||||
void ImGui::DebugNodeFont(ImFont* font)
|
void ImGui::DebugNodeFont(ImFont* font)
|
||||||
{
|
{
|
||||||
@@ -16730,6 +16745,12 @@ void ImGui::DebugNodeFont(ImFont* font)
|
|||||||
if (SmallButton("Remove"))
|
if (SmallButton("Remove"))
|
||||||
atlas->RemoveFont(font);
|
atlas->RemoveFont(font);
|
||||||
EndDisabled();
|
EndDisabled();
|
||||||
|
SameLine();
|
||||||
|
if (SmallButton("Clear bakes"))
|
||||||
|
ImFontAtlasFontDiscardBakes(atlas, font, 0);
|
||||||
|
SameLine();
|
||||||
|
if (SmallButton("Clear unused"))
|
||||||
|
ImFontAtlasFontDiscardBakes(atlas, font, 2);
|
||||||
|
|
||||||
// Display details
|
// Display details
|
||||||
SetNextItemWidth(GetFontSize() * 8);
|
SetNextItemWidth(GetFontSize() * 8);
|
||||||
@@ -16769,6 +16790,37 @@ void ImGui::DebugNodeFont(ImFont* font)
|
|||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (font->Sources.Size > 1 && TreeNode("Input Glyphs Overlap Detection Tool"))
|
||||||
|
{
|
||||||
|
TextWrapped("- First Input that contains the glyph is used.\n- Use ImFontConfig::GlyphExcludeRanges[] to specify ranges to ignore glyph in given Input.\n- This tool doesn't cache results and is slow, don't keep it open!");
|
||||||
|
if (BeginTable("table", 2))
|
||||||
|
{
|
||||||
|
for (unsigned int c = 0; c < 0x10000; c++)
|
||||||
|
if (int overlap_mask = CalcFontGlyphSrcOverlapMask(atlas, font, c))
|
||||||
|
{
|
||||||
|
unsigned int c_end = c + 1;
|
||||||
|
while (c_end < 0x10000 && CalcFontGlyphSrcOverlapMask(atlas, font, c_end) == overlap_mask)
|
||||||
|
c_end++;
|
||||||
|
if (TableNextColumn() && TreeNode((void*)(intptr_t)c, "U+%04X-U+%04X: %d codepoints in %d inputs", c, c_end - 1, c_end - c, ImCountSetBits(overlap_mask)))
|
||||||
|
{
|
||||||
|
char utf8_buf[5];
|
||||||
|
for (unsigned int n = c; n < c_end; n++)
|
||||||
|
BulletText("Codepoint U+%04X (%s)", n, ImTextCharToUtf8(utf8_buf, n));
|
||||||
|
TreePop();
|
||||||
|
}
|
||||||
|
TableNextColumn();
|
||||||
|
for (int src_n = 0; src_n < font->Sources.Size; src_n++)
|
||||||
|
if (overlap_mask & (1 << src_n))
|
||||||
|
{
|
||||||
|
Text("%d ", src_n);
|
||||||
|
SameLine();
|
||||||
|
}
|
||||||
|
c = c_end - 1;
|
||||||
|
}
|
||||||
|
EndTable();
|
||||||
|
}
|
||||||
|
TreePop();
|
||||||
|
}
|
||||||
|
|
||||||
// Display all glyphs of the fonts in separate pages of 256 characters
|
// Display all glyphs of the fonts in separate pages of 256 characters
|
||||||
for (int baked_n = 0; baked_n < atlas->Builder->BakedPool.Size; baked_n++)
|
for (int baked_n = 0; baked_n < atlas->Builder->BakedPool.Size; baked_n++)
|
||||||
|
2
imgui.h
2
imgui.h
@@ -3456,7 +3456,7 @@ struct ImFontConfig
|
|||||||
//ImVec2 GlyphExtraSpacing; // 0, 0 // (REMOVED AT IT SEEMS LARGELY OBSOLETE. PLEASE REPORT IF YOU WERE USING THIS). Extra spacing (in pixels) between glyphs when rendered: essentially add to glyph->AdvanceX. Only X axis is supported for now.
|
//ImVec2 GlyphExtraSpacing; // 0, 0 // (REMOVED AT IT SEEMS LARGELY OBSOLETE. PLEASE REPORT IF YOU WERE USING THIS). Extra spacing (in pixels) between glyphs when rendered: essentially add to glyph->AdvanceX. Only X axis is supported for now.
|
||||||
ImVec2 GlyphOffset; // 0, 0 // Offset (in pixels) all glyphs from this font input. Absolute value for default size, other sizes will scale this value.
|
ImVec2 GlyphOffset; // 0, 0 // Offset (in pixels) all glyphs from this font input. Absolute value for default size, other sizes will scale this value.
|
||||||
const ImWchar* GlyphRanges; // NULL // THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE. Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list).
|
const ImWchar* GlyphRanges; // NULL // THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE. Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list).
|
||||||
const ImWchar* GlyphExcludeRanges; // NULL // Pointer to a VERY SHORT user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). This is very close to GlyphRanges[] but designed to exclude ranges from a font source, when merging fonts with overlapping glyphs.
|
const ImWchar* GlyphExcludeRanges; // NULL // Pointer to a VERY SHORT user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). This is very close to GlyphRanges[] but designed to exclude ranges from a font source, when merging fonts with overlapping glyphs. Use "Input Glyphs Overlap Detection Tool" to find about your overlapping ranges.
|
||||||
float GlyphMinAdvanceX; // 0 // Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font. Absolute value for default size, other sizes will scale this value.
|
float GlyphMinAdvanceX; // 0 // Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font. Absolute value for default size, other sizes will scale this value.
|
||||||
float GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs
|
float GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs
|
||||||
float GlyphExtraAdvanceX; // 0 // Extra spacing (in pixels) between glyphs. Please contact us if you are using this.
|
float GlyphExtraAdvanceX; // 0 // Extra spacing (in pixels) between glyphs. Please contact us if you are using this.
|
||||||
|
@@ -3843,13 +3843,17 @@ void ImFontAtlasBakedDiscard(ImFontAtlas* atlas, ImFont* font, ImFontBaked* bake
|
|||||||
font->LastBaked = NULL;
|
font->LastBaked = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImFontAtlasFontDiscardOutputBakes(ImFontAtlas* atlas, ImFont* font)
|
// use unused_frames==0 to discard everything.
|
||||||
|
void ImFontAtlasFontDiscardBakes(ImFontAtlas* atlas, ImFont* font, int unused_frames)
|
||||||
{
|
{
|
||||||
if (ImFontAtlasBuilder* builder = atlas->Builder) // This can be called from font destructor
|
if (ImFontAtlasBuilder* builder = atlas->Builder) // This can be called from font destructor
|
||||||
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 (baked->ContainerFont == font && !baked->WantDestroy)
|
if (baked->LastUsedFrame + unused_frames > atlas->Builder->FrameCount)
|
||||||
|
continue;
|
||||||
|
if (baked->ContainerFont != font || baked->WantDestroy)
|
||||||
|
continue;
|
||||||
ImFontAtlasBakedDiscard(atlas, font, baked);
|
ImFontAtlasBakedDiscard(atlas, font, baked);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4364,7 +4368,8 @@ ImTextureRect* ImFontAtlasPackGetRectSafe(ImFontAtlas* atlas, ImFontAtlasRectId
|
|||||||
return &builder->Rects[index_entry->TargetIndex];
|
return &builder->Rects[index_entry->TargetIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Important! This assume by ImFontConfig::GlyphFilter is a SMALL ARRAY (e.g. <10 entries)
|
// Important! This assume by ImFontConfig::GlyphExcludeRanges[] is a SMALL ARRAY (e.g. <10 entries)
|
||||||
|
// Use "Input Glyphs Overlap Detection Tool" to display a list of glyphs provided by multiple sources in order to set this array up.
|
||||||
static bool ImFontAtlasBuildAcceptCodepointForSource(ImFontConfig* src, ImWchar codepoint)
|
static bool ImFontAtlasBuildAcceptCodepointForSource(ImFontConfig* src, ImWchar codepoint)
|
||||||
{
|
{
|
||||||
if (const ImWchar* exclude_list = src->GlyphExcludeRanges)
|
if (const ImWchar* exclude_list = src->GlyphExcludeRanges)
|
||||||
@@ -5024,7 +5029,7 @@ ImFont::~ImFont()
|
|||||||
void ImFont::ClearOutputData()
|
void ImFont::ClearOutputData()
|
||||||
{
|
{
|
||||||
if (ImFontAtlas* atlas = ContainerAtlas)
|
if (ImFontAtlas* atlas = ContainerAtlas)
|
||||||
ImFontAtlasFontDiscardOutputBakes(atlas, this);
|
ImFontAtlasFontDiscardBakes(atlas, this, 0);
|
||||||
FallbackChar = EllipsisChar = 0;
|
FallbackChar = EllipsisChar = 0;
|
||||||
memset(Used8kPagesMap, 0, sizeof(Used8kPagesMap));
|
memset(Used8kPagesMap, 0, sizeof(Used8kPagesMap));
|
||||||
LastBaked = NULL;
|
LastBaked = NULL;
|
||||||
|
@@ -3815,7 +3815,7 @@ IMGUI_API void ImFontAtlasFontSourceAddToFont(ImFontAtlas* atlas, I
|
|||||||
IMGUI_API void ImFontAtlasFontDestroySourceData(ImFontAtlas* atlas, ImFontConfig* src);
|
IMGUI_API void ImFontAtlasFontDestroySourceData(ImFontAtlas* atlas, ImFontConfig* src);
|
||||||
IMGUI_API bool ImFontAtlasFontInitOutput(ImFontAtlas* atlas, ImFont* font); // Using FontDestroyOutput/FontInitOutput sequence useful notably if font loader params have changed
|
IMGUI_API bool ImFontAtlasFontInitOutput(ImFontAtlas* atlas, ImFont* font); // Using FontDestroyOutput/FontInitOutput sequence useful notably if font loader params have changed
|
||||||
IMGUI_API void ImFontAtlasFontDestroyOutput(ImFontAtlas* atlas, ImFont* font);
|
IMGUI_API void ImFontAtlasFontDestroyOutput(ImFontAtlas* atlas, ImFont* font);
|
||||||
IMGUI_API void ImFontAtlasFontDiscardOutputBakes(ImFontAtlas* atlas, ImFont* font);
|
IMGUI_API void ImFontAtlasFontDiscardBakes(ImFontAtlas* atlas, ImFont* font, int unused_frames);
|
||||||
|
|
||||||
IMGUI_API ImGuiID ImFontAtlasBakedGetId(ImGuiID font_id, float baked_size, float rasterizer_density);
|
IMGUI_API ImGuiID ImFontAtlasBakedGetId(ImGuiID font_id, float baked_size, float rasterizer_density);
|
||||||
IMGUI_API ImFontBaked* ImFontAtlasBakedGetOrAdd(ImFontAtlas* atlas, ImFont* font, float font_size, float font_rasterizer_density);
|
IMGUI_API ImFontBaked* ImFontAtlasBakedGetOrAdd(ImFontAtlas* atlas, ImFont* font, float font_size, float font_rasterizer_density);
|
||||||
|
Reference in New Issue
Block a user