mirror of
https://github.com/ocornut/imgui.git
synced 2025-09-11 05:48:24 +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;
|
||||
}
|
||||
|
||||
// [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().
|
||||
void ImGui::DebugNodeFont(ImFont* font)
|
||||
{
|
||||
@@ -16730,6 +16745,12 @@ void ImGui::DebugNodeFont(ImFont* font)
|
||||
if (SmallButton("Remove"))
|
||||
atlas->RemoveFont(font);
|
||||
EndDisabled();
|
||||
SameLine();
|
||||
if (SmallButton("Clear bakes"))
|
||||
ImFontAtlasFontDiscardBakes(atlas, font, 0);
|
||||
SameLine();
|
||||
if (SmallButton("Clear unused"))
|
||||
ImFontAtlasFontDiscardBakes(atlas, font, 2);
|
||||
|
||||
// Display details
|
||||
SetNextItemWidth(GetFontSize() * 8);
|
||||
@@ -16769,6 +16790,37 @@ void ImGui::DebugNodeFont(ImFont* font)
|
||||
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
|
||||
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 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* 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 GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
for (int baked_n = 0; baked_n < builder->BakedPool.Size; 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);
|
||||
}
|
||||
}
|
||||
@@ -4364,7 +4368,8 @@ ImTextureRect* ImFontAtlasPackGetRectSafe(ImFontAtlas* atlas, ImFontAtlasRectId
|
||||
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)
|
||||
{
|
||||
if (const ImWchar* exclude_list = src->GlyphExcludeRanges)
|
||||
@@ -5024,7 +5029,7 @@ ImFont::~ImFont()
|
||||
void ImFont::ClearOutputData()
|
||||
{
|
||||
if (ImFontAtlas* atlas = ContainerAtlas)
|
||||
ImFontAtlasFontDiscardOutputBakes(atlas, this);
|
||||
ImFontAtlasFontDiscardBakes(atlas, this, 0);
|
||||
FallbackChar = EllipsisChar = 0;
|
||||
memset(Used8kPagesMap, 0, sizeof(Used8kPagesMap));
|
||||
LastBaked = NULL;
|
||||
|
@@ -3815,7 +3815,7 @@ IMGUI_API void ImFontAtlasFontSourceAddToFont(ImFontAtlas* atlas, I
|
||||
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 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 ImFontBaked* ImFontAtlasBakedGetOrAdd(ImFontAtlas* atlas, ImFont* font, float font_size, float font_rasterizer_density);
|
||||
|
Reference in New Issue
Block a user