mirror of
https://github.com/ocornut/imgui.git
synced 2026-01-11 00:04:24 +00:00
Fonts: add ImFontGlyph::SourceIdx. Extract code out of DebugNodeFont() into DebugNodeFontGlyphesForSrcMask().
(src_mask unused in this commit)
This commit is contained in:
parent
bcd1a94b89
commit
c4fa9bb61f
4 changed files with 62 additions and 48 deletions
100
imgui.cpp
100
imgui.cpp
|
|
@ -16700,52 +16700,7 @@ void ImGui::DebugNodeFont(ImFont* font)
|
||||||
src_n, src->Name, src->OversampleH, oversample_h, src->OversampleV, oversample_v, src->PixelSnapH, src->GlyphOffset.x, src->GlyphOffset.y);
|
src_n, src->Name, src->OversampleH, oversample_h, src->OversampleV, oversample_v, src->PixelSnapH, src->GlyphOffset.x, src->GlyphOffset.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImDrawList* draw_list = GetWindowDrawList();
|
DebugNodeFontGlyphesForSrcMask(font, baked, ~0);
|
||||||
const ImU32 glyph_col = GetColorU32(ImGuiCol_Text);
|
|
||||||
const float cell_size = baked->Size * 1;
|
|
||||||
const float cell_spacing = GetStyle().ItemSpacing.y;
|
|
||||||
for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base += 256)
|
|
||||||
{
|
|
||||||
// Skip ahead if a large bunch of glyphs are not present in the font (test in chunks of 4k)
|
|
||||||
// This is only a small optimization to reduce the number of iterations when IM_UNICODE_MAX_CODEPOINT
|
|
||||||
// is large // (if ImWchar==ImWchar32 we will do at least about 272 queries here)
|
|
||||||
if (!(base & 8191) && font->IsGlyphRangeUnused(base, base + 8191))
|
|
||||||
{
|
|
||||||
base += 8192 - 256;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int count = 0;
|
|
||||||
for (unsigned int n = 0; n < 256; n++)
|
|
||||||
if (baked->IsGlyphLoaded((ImWchar)(base + n)))
|
|
||||||
count++;
|
|
||||||
if (count <= 0)
|
|
||||||
continue;
|
|
||||||
if (!TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph"))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Draw a 16x16 grid of glyphs
|
|
||||||
ImVec2 base_pos = GetCursorScreenPos();
|
|
||||||
for (unsigned int n = 0; n < 256; n++)
|
|
||||||
{
|
|
||||||
// We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions
|
|
||||||
// available here and thus cannot easily generate a zero-terminated UTF-8 encoded string.
|
|
||||||
ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing));
|
|
||||||
ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size);
|
|
||||||
const ImFontGlyph* glyph = baked->IsGlyphLoaded((ImWchar)(base + n)) ? baked->FindGlyph((ImWchar)(base + n)) : NULL;
|
|
||||||
draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50));
|
|
||||||
if (!glyph)
|
|
||||||
continue;
|
|
||||||
font->RenderChar(draw_list, cell_size, cell_p1, glyph_col, (ImWchar)(base + n));
|
|
||||||
if (IsMouseHoveringRect(cell_p1, cell_p2) && BeginTooltip())
|
|
||||||
{
|
|
||||||
DebugNodeFontGlyph(font, glyph);
|
|
||||||
EndTooltip();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16));
|
|
||||||
TreePop();
|
|
||||||
}
|
|
||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
PopID();
|
PopID();
|
||||||
|
|
@ -16754,6 +16709,57 @@ void ImGui::DebugNodeFont(ImFont* font)
|
||||||
Unindent();
|
Unindent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImGui::DebugNodeFontGlyphesForSrcMask(ImFont* font, ImFontBaked* baked, int src_mask)
|
||||||
|
{
|
||||||
|
ImDrawList* draw_list = GetWindowDrawList();
|
||||||
|
const ImU32 glyph_col = GetColorU32(ImGuiCol_Text);
|
||||||
|
const float cell_size = baked->Size * 1;
|
||||||
|
const float cell_spacing = GetStyle().ItemSpacing.y;
|
||||||
|
for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base += 256)
|
||||||
|
{
|
||||||
|
// Skip ahead if a large bunch of glyphs are not present in the font (test in chunks of 4k)
|
||||||
|
// This is only a small optimization to reduce the number of iterations when IM_UNICODE_MAX_CODEPOINT
|
||||||
|
// is large // (if ImWchar==ImWchar32 we will do at least about 272 queries here)
|
||||||
|
if (!(base & 8191) && font->IsGlyphRangeUnused(base, base + 8191))
|
||||||
|
{
|
||||||
|
base += 8192 - 256;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (unsigned int n = 0; n < 256; n++)
|
||||||
|
if (const ImFontGlyph* glyph = baked->IsGlyphLoaded((ImWchar)(base + n)) ? baked->FindGlyph((ImWchar)(base + n)) : NULL)
|
||||||
|
if (src_mask & (1 << glyph->SourceIdx))
|
||||||
|
count++;
|
||||||
|
if (count <= 0)
|
||||||
|
continue;
|
||||||
|
if (!TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Draw a 16x16 grid of glyphs
|
||||||
|
ImVec2 base_pos = GetCursorScreenPos();
|
||||||
|
for (unsigned int n = 0; n < 256; n++)
|
||||||
|
{
|
||||||
|
// We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions
|
||||||
|
// available here and thus cannot easily generate a zero-terminated UTF-8 encoded string.
|
||||||
|
ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing));
|
||||||
|
ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size);
|
||||||
|
const ImFontGlyph* glyph = baked->IsGlyphLoaded((ImWchar)(base + n)) ? baked->FindGlyph((ImWchar)(base + n)) : NULL;
|
||||||
|
draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50));
|
||||||
|
if (!glyph || (src_mask & (1 << glyph->SourceIdx)) == 0)
|
||||||
|
continue;
|
||||||
|
font->RenderChar(draw_list, cell_size, cell_p1, glyph_col, (ImWchar)(base + n));
|
||||||
|
if (IsMouseHoveringRect(cell_p1, cell_p2) && BeginTooltip())
|
||||||
|
{
|
||||||
|
DebugNodeFontGlyph(font, glyph);
|
||||||
|
EndTooltip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16));
|
||||||
|
TreePop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ImGui::DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph)
|
void ImGui::DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph)
|
||||||
{
|
{
|
||||||
Text("Codepoint: U+%04X", glyph->Codepoint);
|
Text("Codepoint: U+%04X", glyph->Codepoint);
|
||||||
|
|
@ -16767,6 +16773,7 @@ void ImGui::DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph)
|
||||||
ImTextureRect* r = ImFontAtlasPackGetRect(font->ContainerAtlas, glyph->PackId);
|
ImTextureRect* r = ImFontAtlasPackGetRect(font->ContainerAtlas, glyph->PackId);
|
||||||
Text("PackId: %d (%dx%d rect at %d,%d)", glyph->PackId, r->w, r->h, r->x, r->y);
|
Text("PackId: %d (%dx%d rect at %d,%d)", glyph->PackId, r->w, r->h, r->x, r->y);
|
||||||
}
|
}
|
||||||
|
Text("SourceIdx: %d", glyph->SourceIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// [DEBUG] Display contents of ImGuiStorage
|
// [DEBUG] Display contents of ImGuiStorage
|
||||||
|
|
@ -17429,6 +17436,7 @@ void ImGui::DebugNodeColumns(ImGuiOldColumns*) {}
|
||||||
void ImGui::DebugNodeDrawList(ImGuiWindow*, ImGuiViewportP*, const ImDrawList*, const char*) {}
|
void ImGui::DebugNodeDrawList(ImGuiWindow*, ImGuiViewportP*, const ImDrawList*, const char*) {}
|
||||||
void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList*, const ImDrawList*, const ImDrawCmd*, bool, bool) {}
|
void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList*, const ImDrawList*, const ImDrawCmd*, bool, bool) {}
|
||||||
void ImGui::DebugNodeFont(ImFont*) {}
|
void ImGui::DebugNodeFont(ImFont*) {}
|
||||||
|
void ImGui::DebugNodeFontGlyphesForSrcMask(ImFont*, ImFontBaked*, int) {}
|
||||||
void ImGui::DebugNodeStorage(ImGuiStorage*, const char*) {}
|
void ImGui::DebugNodeStorage(ImGuiStorage*, const char*) {}
|
||||||
void ImGui::DebugNodeTabBar(ImGuiTabBar*, const char*) {}
|
void ImGui::DebugNodeTabBar(ImGuiTabBar*, const char*) {}
|
||||||
void ImGui::DebugNodeWindow(ImGuiWindow*, const char*) {}
|
void ImGui::DebugNodeWindow(ImGuiWindow*, const char*) {}
|
||||||
|
|
|
||||||
3
imgui.h
3
imgui.h
|
|
@ -3484,7 +3484,8 @@ struct ImFontGlyph
|
||||||
{
|
{
|
||||||
unsigned int Colored : 1; // Flag to indicate glyph is colored and should generally ignore tinting (make it usable with no shift on little-endian as this is used in loops)
|
unsigned int Colored : 1; // Flag to indicate glyph is colored and should generally ignore tinting (make it usable with no shift on little-endian as this is used in loops)
|
||||||
unsigned int Visible : 1; // Flag to indicate glyph has no visible pixels (e.g. space). Allow early out when rendering.
|
unsigned int Visible : 1; // Flag to indicate glyph has no visible pixels (e.g. space). Allow early out when rendering.
|
||||||
unsigned int Codepoint : 30; // 0x0000..0x10FFFF
|
unsigned int SourceIdx : 4; // Index of source in parent font
|
||||||
|
unsigned int Codepoint : 26; // 0x0000..0x10FFFF
|
||||||
float AdvanceX; // Horizontal distance to advance cursor/layout position.
|
float AdvanceX; // Horizontal distance to advance cursor/layout position.
|
||||||
float X0, Y0, X1, Y1; // Glyph corners. Offsets from current cursor/layout position.
|
float X0, Y0, X1, Y1; // Glyph corners. Offsets from current cursor/layout position.
|
||||||
float U0, V0, U1, V1; // Texture coordinates for the current value of ImFontAtlas->TexRef. Cached equivalent of calling GetCustomRect() with PackId.
|
float U0, V0, U1, V1; // Texture coordinates for the current value of ImFontAtlas->TexRef. Cached equivalent of calling GetCustomRect() with PackId.
|
||||||
|
|
|
||||||
|
|
@ -4390,7 +4390,11 @@ static ImFontGlyph* ImFontBaked_BuildLoadGlyph(ImFontBaked* baked, ImWchar codep
|
||||||
const ImFontLoader* loader = src->FontLoader ? src->FontLoader : atlas->FontLoader;
|
const ImFontLoader* loader = src->FontLoader ? src->FontLoader : atlas->FontLoader;
|
||||||
if (!src->GlyphExcludeRanges || ImFontAtlasBuildAcceptCodepointForSource(src, codepoint))
|
if (!src->GlyphExcludeRanges || ImFontAtlasBuildAcceptCodepointForSource(src, codepoint))
|
||||||
if (ImFontGlyph* glyph = loader->FontBakedLoadGlyph(atlas, src, baked, loader_user_data_p, codepoint))
|
if (ImFontGlyph* glyph = loader->FontBakedLoadGlyph(atlas, src, baked, loader_user_data_p, codepoint))
|
||||||
return glyph; // FIXME: Add hooks for e.g. #7962
|
{
|
||||||
|
// FIXME: Add hooks for e.g. #7962
|
||||||
|
glyph->SourceIdx = src_n;
|
||||||
|
return glyph;
|
||||||
|
}
|
||||||
loader_user_data_p += loader->FontBakedSrcLoaderDataSize;
|
loader_user_data_p += loader->FontBakedSrcLoaderDataSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3625,6 +3625,7 @@ namespace ImGui
|
||||||
IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label);
|
IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label);
|
||||||
IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);
|
IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);
|
||||||
IMGUI_API void DebugNodeFont(ImFont* font);
|
IMGUI_API void DebugNodeFont(ImFont* font);
|
||||||
|
IMGUI_API void DebugNodeFontGlyphesForSrcMask(ImFont* font, ImFontBaked* baked, int src_mask);
|
||||||
IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);
|
IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);
|
||||||
IMGUI_API void DebugNodeTexture(ImTextureData* tex, int int_id, const ImFontAtlasRect* highlight_rect = NULL); // ID used to facilitate persisting the "current" texture.
|
IMGUI_API void DebugNodeTexture(ImTextureData* tex, int int_id, const ImFontAtlasRect* highlight_rect = NULL); // ID used to facilitate persisting the "current" texture.
|
||||||
IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label);
|
IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue