mirror of
https://github.com/ocornut/imgui.git
synced 2026-01-11 00:04:24 +00:00
Fonts, Textures: main code for ImGuiBackendFlags_RendererHasTextures feature.
# Conflicts: # imgui.h # imgui_demo.cpp
This commit is contained in:
parent
191a728ecc
commit
0f0473bf1c
8 changed files with 1750 additions and 802 deletions
|
|
@ -11,9 +11,10 @@ int main(int, char**)
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
|
||||||
// Build atlas
|
// Build atlas
|
||||||
unsigned char* tex_pixels = nullptr;
|
//unsigned char* tex_pixels = nullptr;
|
||||||
int tex_w, tex_h;
|
//int tex_w, tex_h;
|
||||||
io.Fonts->GetTexDataAsRGBA32(&tex_pixels, &tex_w, &tex_h);
|
//io.Fonts->GetTexDataAsRGBA32(&tex_pixels, &tex_w, &tex_h);
|
||||||
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures;
|
||||||
|
|
||||||
for (int n = 0; n < 20; n++)
|
for (int n = 0; n < 20; n++)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
180
imgui.cpp
180
imgui.cpp
|
|
@ -1270,6 +1270,7 @@ static void UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt);
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
static void UpdateFontsNewFrame();
|
static void UpdateFontsNewFrame();
|
||||||
|
static void UpdateTexturesNewFrame();
|
||||||
static void UpdateSettings();
|
static void UpdateSettings();
|
||||||
static int UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_hovered, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect);
|
static int UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_hovered, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect);
|
||||||
static void RenderWindowOuterBorders(ImGuiWindow* window);
|
static void RenderWindowOuterBorders(ImGuiWindow* window);
|
||||||
|
|
@ -3841,7 +3842,7 @@ void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCurso
|
||||||
if (!viewport->GetMainRect().Overlaps(ImRect(pos, pos + ImVec2(size.x + 2, size.y + 2) * scale)))
|
if (!viewport->GetMainRect().Overlaps(ImRect(pos, pos + ImVec2(size.x + 2, size.y + 2) * scale)))
|
||||||
continue;
|
continue;
|
||||||
ImDrawList* draw_list = GetForegroundDrawList(viewport);
|
ImDrawList* draw_list = GetForegroundDrawList(viewport);
|
||||||
ImTextureRef tex_ref = font_atlas->TexID;
|
ImTextureRef tex_ref = font_atlas->TexRef;
|
||||||
draw_list->PushTexture(tex_ref);
|
draw_list->PushTexture(tex_ref);
|
||||||
draw_list->AddImage(tex_ref, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow);
|
draw_list->AddImage(tex_ref, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow);
|
||||||
draw_list->AddImage(tex_ref, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow);
|
draw_list->AddImage(tex_ref, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow);
|
||||||
|
|
@ -4194,6 +4195,11 @@ void ImGui::Initialize()
|
||||||
#ifdef IMGUI_HAS_DOCK
|
#ifdef IMGUI_HAS_DOCK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// ImDrawList/ImFontAtlas are designed to function without ImGui, and 99% of it works without an ImGui context.
|
||||||
|
// But this link allows us to facilitate/handle a few edge cases better.
|
||||||
|
g.DrawListSharedData.Context = &g;
|
||||||
|
ImFontAtlasAddDrawListSharedData(g.IO.Fonts, &g.DrawListSharedData);
|
||||||
|
|
||||||
g.Initialized = true;
|
g.Initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4205,6 +4211,8 @@ void ImGui::Shutdown()
|
||||||
IM_ASSERT_USER_ERROR(g.IO.BackendRendererUserData == NULL, "Forgot to shutdown Renderer backend?");
|
IM_ASSERT_USER_ERROR(g.IO.BackendRendererUserData == NULL, "Forgot to shutdown Renderer backend?");
|
||||||
|
|
||||||
// The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame)
|
// The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame)
|
||||||
|
if (g.IO.Fonts)
|
||||||
|
ImFontAtlasRemoveDrawListSharedData(g.IO.Fonts, &g.DrawListSharedData);
|
||||||
if (g.IO.Fonts && g.FontAtlasOwnedByContext)
|
if (g.IO.Fonts && g.FontAtlasOwnedByContext)
|
||||||
{
|
{
|
||||||
g.IO.Fonts->Locked = false;
|
g.IO.Fonts->Locked = false;
|
||||||
|
|
@ -4339,7 +4347,7 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* ctx, const char* name) : DrawListInst(NUL
|
||||||
SettingsOffset = -1;
|
SettingsOffset = -1;
|
||||||
DrawList = &DrawListInst;
|
DrawList = &DrawListInst;
|
||||||
DrawList->_OwnerName = Name;
|
DrawList->_OwnerName = Name;
|
||||||
DrawList->_Data = &Ctx->DrawListSharedData;
|
DrawList->_SetDrawListSharedData(&Ctx->DrawListSharedData);
|
||||||
NavPreferredScoringPosRel[0] = NavPreferredScoringPosRel[1] = ImVec2(FLT_MAX, FLT_MAX);
|
NavPreferredScoringPosRel[0] = NavPreferredScoringPosRel[1] = ImVec2(FLT_MAX, FLT_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4925,7 +4933,7 @@ static ImDrawList* GetViewportBgFgDrawList(ImGuiViewportP* viewport, size_t draw
|
||||||
if (viewport->BgFgDrawListsLastFrame[drawlist_no] != g.FrameCount)
|
if (viewport->BgFgDrawListsLastFrame[drawlist_no] != g.FrameCount)
|
||||||
{
|
{
|
||||||
draw_list->_ResetForNewFrame();
|
draw_list->_ResetForNewFrame();
|
||||||
draw_list->PushTexture(g.IO.Fonts->TexID);
|
draw_list->PushTexture(g.IO.Fonts->TexRef);
|
||||||
draw_list->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size, false);
|
draw_list->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size, false);
|
||||||
viewport->BgFgDrawListsLastFrame[drawlist_no] = g.FrameCount;
|
viewport->BgFgDrawListsLastFrame[drawlist_no] = g.FrameCount;
|
||||||
}
|
}
|
||||||
|
|
@ -5166,6 +5174,14 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags(const ImVec2& mouse_pos)
|
||||||
io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false;
|
io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ImGui::UpdateTexturesNewFrame()
|
||||||
|
{
|
||||||
|
// FIXME-NEWATLAS: How to reach/target all atlas?
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
ImFontAtlas* atlas = g.IO.Fonts;
|
||||||
|
ImFontAtlasUpdateNewFrame(atlas);
|
||||||
|
}
|
||||||
|
|
||||||
// Called once a frame. Followed by SetCurrentFont() which sets up the remaining data.
|
// Called once a frame. Followed by SetCurrentFont() which sets up the remaining data.
|
||||||
// FIXME-VIEWPORT: the concept of a single ClipRectFullscreen is not ideal!
|
// FIXME-VIEWPORT: the concept of a single ClipRectFullscreen is not ideal!
|
||||||
static void SetupDrawListSharedData()
|
static void SetupDrawListSharedData()
|
||||||
|
|
@ -5202,6 +5218,13 @@ void ImGui::NewFrame()
|
||||||
|
|
||||||
CallContextHooks(&g, ImGuiContextHookType_NewFramePre);
|
CallContextHooks(&g, ImGuiContextHookType_NewFramePre);
|
||||||
|
|
||||||
|
// Check that font atlas was built or backend support texture reload in which case we can build now
|
||||||
|
ImFontAtlas* atlas = g.IO.Fonts;
|
||||||
|
if (!atlas->TexIsBuilt && (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasTextures))
|
||||||
|
atlas->Build();
|
||||||
|
else // Legacy backend
|
||||||
|
IM_ASSERT(atlas->TexIsBuilt && "Font Atlas not built! Make sure you called ImGui_ImplXXXX_NewFrame() function for renderer backend, which should call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8()");
|
||||||
|
|
||||||
// Check and assert for various common IO and Configuration mistakes
|
// Check and assert for various common IO and Configuration mistakes
|
||||||
ErrorCheckNewFrameSanityChecks();
|
ErrorCheckNewFrameSanityChecks();
|
||||||
|
|
||||||
|
|
@ -5209,7 +5232,6 @@ void ImGui::NewFrame()
|
||||||
UpdateSettings();
|
UpdateSettings();
|
||||||
|
|
||||||
g.Time += g.IO.DeltaTime;
|
g.Time += g.IO.DeltaTime;
|
||||||
g.WithinFrameScope = true;
|
|
||||||
g.FrameCount += 1;
|
g.FrameCount += 1;
|
||||||
g.TooltipOverrideCount = 0;
|
g.TooltipOverrideCount = 0;
|
||||||
g.WindowsActiveCount = 0;
|
g.WindowsActiveCount = 0;
|
||||||
|
|
@ -5229,10 +5251,15 @@ void ImGui::NewFrame()
|
||||||
// Update viewports (after processing input queue, so io.MouseHoveredViewport is set)
|
// Update viewports (after processing input queue, so io.MouseHoveredViewport is set)
|
||||||
UpdateViewportsNewFrame();
|
UpdateViewportsNewFrame();
|
||||||
|
|
||||||
|
// Update texture list (collect destroyed textures, etc.)
|
||||||
|
UpdateTexturesNewFrame();
|
||||||
|
|
||||||
// Setup current font and draw list shared data
|
// Setup current font and draw list shared data
|
||||||
SetupDrawListSharedData();
|
SetupDrawListSharedData();
|
||||||
UpdateFontsNewFrame();
|
UpdateFontsNewFrame();
|
||||||
|
|
||||||
|
g.WithinFrameScope = true;
|
||||||
|
|
||||||
// Mark rendering data as invalid to prevent user who may have a handle on it to use it.
|
// Mark rendering data as invalid to prevent user who may have a handle on it to use it.
|
||||||
for (ImGuiViewportP* viewport : g.Viewports)
|
for (ImGuiViewportP* viewport : g.Viewports)
|
||||||
viewport->DrawDataP.Valid = false;
|
viewport->DrawDataP.Valid = false;
|
||||||
|
|
@ -5810,6 +5837,11 @@ void ImGui::Render()
|
||||||
g.IO.MetricsRenderIndices += draw_data->TotalIdxCount;
|
g.IO.MetricsRenderIndices += draw_data->TotalIdxCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||||||
|
if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasTextures)
|
||||||
|
ImFontAtlasDebugLogTextureRequests(g.IO.Fonts);
|
||||||
|
#endif
|
||||||
|
|
||||||
CallContextHooks(&g, ImGuiContextHookType_RenderPost);
|
CallContextHooks(&g, ImGuiContextHookType_RenderPost);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7580,7 +7612,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
||||||
|
|
||||||
// Setup draw list and outer clipping rectangle
|
// Setup draw list and outer clipping rectangle
|
||||||
IM_ASSERT(window->DrawList->CmdBuffer.Size == 1 && window->DrawList->CmdBuffer[0].ElemCount == 0);
|
IM_ASSERT(window->DrawList->CmdBuffer.Size == 1 && window->DrawList->CmdBuffer[0].ElemCount == 0);
|
||||||
window->DrawList->PushTexture(g.Font->ContainerAtlas->TexID);
|
window->DrawList->PushTexture(g.Font->ContainerAtlas->TexRef);
|
||||||
PushClipRect(host_rect.Min, host_rect.Max, false);
|
PushClipRect(host_rect.Min, host_rect.Max, false);
|
||||||
|
|
||||||
// Child windows can render their decoration (bg color, border, scrollbars, etc.) within their parent to save a draw call (since 1.71)
|
// Child windows can render their decoration (bg color, border, scrollbars, etc.) within their parent to save a draw call (since 1.71)
|
||||||
|
|
@ -8515,7 +8547,12 @@ bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max)
|
||||||
void ImGui::UpdateFontsNewFrame()
|
void ImGui::UpdateFontsNewFrame()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
g.IO.Fonts->Locked = true;
|
if ((g.IO.BackendFlags & ImGuiBackendFlags_RendererHasTextures) == 0)
|
||||||
|
{
|
||||||
|
g.IO.Fonts->Locked = true;
|
||||||
|
for (ImFont* font : g.IO.Fonts->Fonts)
|
||||||
|
font->LockDisableLoading = true;
|
||||||
|
}
|
||||||
SetCurrentFont(GetDefaultFont());
|
SetCurrentFont(GetDefaultFont());
|
||||||
IM_ASSERT(g.Font->IsLoaded());
|
IM_ASSERT(g.Font->IsLoaded());
|
||||||
}
|
}
|
||||||
|
|
@ -8530,13 +8567,12 @@ void ImGui::SetCurrentFont(ImFont* font)
|
||||||
g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale);
|
g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale);
|
||||||
g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f;
|
g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f;
|
||||||
g.FontScale = g.FontSize / g.Font->FontSize;
|
g.FontScale = g.FontSize / g.Font->FontSize;
|
||||||
|
|
||||||
ImFontAtlas* atlas = g.Font->ContainerAtlas;
|
|
||||||
g.DrawListSharedData.TexUvWhitePixel = atlas->TexUvWhitePixel;
|
|
||||||
g.DrawListSharedData.TexUvLines = atlas->TexUvLines;
|
|
||||||
g.DrawListSharedData.Font = g.Font;
|
g.DrawListSharedData.Font = g.Font;
|
||||||
g.DrawListSharedData.FontSize = g.FontSize;
|
g.DrawListSharedData.FontSize = g.FontSize;
|
||||||
g.DrawListSharedData.FontScale = g.FontScale;
|
g.DrawListSharedData.FontScale = g.FontScale;
|
||||||
|
ImFontAtlasUpdateDrawListsSharedData(g.Font->ContainerAtlas);
|
||||||
|
if (g.CurrentWindow)
|
||||||
|
g.CurrentWindow->DrawList->_SetTexture(font->ContainerAtlas->TexRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use ImDrawList::_SetTextureID(), making our shared g.FontStack[] authoritative against window-local ImDrawList.
|
// Use ImDrawList::_SetTextureID(), making our shared g.FontStack[] authoritative against window-local ImDrawList.
|
||||||
|
|
@ -8546,6 +8582,7 @@ void ImGui::SetCurrentFont(ImFont* font)
|
||||||
// - The right-ish solution may be to remove _SetTextureID() and make AddText/RenderText lazily call PushTextureID()/PopTextureID()
|
// - The right-ish solution may be to remove _SetTextureID() and make AddText/RenderText lazily call PushTextureID()/PopTextureID()
|
||||||
// the same way AddImage() does, but then all other primitives would also need to? I don't think we should tackle this problem
|
// the same way AddImage() does, but then all other primitives would also need to? I don't think we should tackle this problem
|
||||||
// because we have a concrete need and a test bed for multiple atlas textures.
|
// because we have a concrete need and a test bed for multiple atlas textures.
|
||||||
|
// FIXME-NEWATLAS: perhaps we can now leverage ImFontAtlasUpdateDrawListsTextures() ?
|
||||||
void ImGui::PushFont(ImFont* font)
|
void ImGui::PushFont(ImFont* font)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
|
@ -8553,7 +8590,6 @@ void ImGui::PushFont(ImFont* font)
|
||||||
font = GetDefaultFont();
|
font = GetDefaultFont();
|
||||||
g.FontStack.push_back(font);
|
g.FontStack.push_back(font);
|
||||||
SetCurrentFont(font);
|
SetCurrentFont(font);
|
||||||
g.CurrentWindow->DrawList->_SetTexture(font->ContainerAtlas->TexID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::PopFont()
|
void ImGui::PopFont()
|
||||||
|
|
@ -8567,7 +8603,6 @@ void ImGui::PopFont()
|
||||||
g.FontStack.pop_back();
|
g.FontStack.pop_back();
|
||||||
ImFont* font = g.FontStack.Size == 0 ? GetDefaultFont() : g.FontStack.back();
|
ImFont* font = g.FontStack.Size == 0 ? GetDefaultFont() : g.FontStack.back();
|
||||||
SetCurrentFont(font);
|
SetCurrentFont(font);
|
||||||
g.CurrentWindow->DrawList->_SetTexture(font->ContainerAtlas->TexID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
@ -10278,7 +10313,6 @@ static void ImGui::ErrorCheckNewFrameSanityChecks()
|
||||||
IM_ASSERT((g.IO.DeltaTime > 0.0f || g.FrameCount == 0) && "Need a positive DeltaTime!");
|
IM_ASSERT((g.IO.DeltaTime > 0.0f || g.FrameCount == 0) && "Need a positive DeltaTime!");
|
||||||
IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?");
|
IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?");
|
||||||
IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value!");
|
IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value!");
|
||||||
IM_ASSERT(g.IO.Fonts->IsBuilt() && "Font Atlas not built! Make sure you called ImGui_ImplXXXX_NewFrame() function for renderer backend, which should call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8()");
|
|
||||||
IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting!");
|
IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting!");
|
||||||
IM_ASSERT(g.Style.CircleTessellationMaxError > 0.0f && "Invalid style setting!");
|
IM_ASSERT(g.Style.CircleTessellationMaxError > 0.0f && "Invalid style setting!");
|
||||||
IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting!"); // Allows us to avoid a few clamps in color computations
|
IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting!"); // Allows us to avoid a few clamps in color computations
|
||||||
|
|
@ -15460,10 +15494,12 @@ void ImGui::DebugTextEncoding(const char* str)
|
||||||
Text("0x%02X", (int)(unsigned char)p[byte_index]);
|
Text("0x%02X", (int)(unsigned char)p[byte_index]);
|
||||||
}
|
}
|
||||||
TableNextColumn();
|
TableNextColumn();
|
||||||
if (GetFont()->FindGlyphNoFallback((ImWchar)c))
|
TextUnformatted(p, p + c_utf8_len);
|
||||||
TextUnformatted(p, p + c_utf8_len);
|
if (GetFont()->FindGlyphNoFallback((ImWchar)c) == NULL)
|
||||||
else
|
{
|
||||||
TextUnformatted((c == IM_UNICODE_CODEPOINT_INVALID) ? "[invalid]" : "[missing]");
|
SameLine();
|
||||||
|
TextUnformatted("[missing]");
|
||||||
|
}
|
||||||
TableNextColumn();
|
TableNextColumn();
|
||||||
Text("U+%04X", (int)c);
|
Text("U+%04X", (int)c);
|
||||||
p += c_utf8_len;
|
p += c_utf8_len;
|
||||||
|
|
@ -15500,17 +15536,25 @@ void ImGui::UpdateDebugToolFlashStyleColor()
|
||||||
DebugFlashStyleColorStop();
|
DebugFlashStyleColorStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* FormatTextureIDForDebugDisplay(char* buf, int buf_size, ImTextureRef tex_ref)
|
static const char* FormatTextureIDForDebugDisplay(char* buf, int buf_size, ImTextureID tex_id)
|
||||||
{
|
{
|
||||||
union { void* ptr; int integer; } tex_id_opaque;
|
union { void* ptr; int integer; } tex_id_opaque;
|
||||||
memcpy(&tex_id_opaque, &tex_ref._TexID, ImMin(sizeof(void*), sizeof(tex_ref._TexID)));
|
memcpy(&tex_id_opaque, &tex_id, ImMin(sizeof(void*), sizeof(tex_id)));
|
||||||
if (sizeof(tex_ref._TexID) >= sizeof(void*))
|
if (sizeof(tex_id) >= sizeof(void*))
|
||||||
ImFormatString(buf, buf_size, "0x%p", tex_id_opaque.ptr);
|
ImFormatString(buf, buf_size, "0x%p", tex_id_opaque.ptr);
|
||||||
else
|
else
|
||||||
ImFormatString(buf, buf_size, "0x%04X", tex_id_opaque.integer);
|
ImFormatString(buf, buf_size, "0x%04X", tex_id_opaque.integer);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* FormatTextureIDForDebugDisplay(char* buf, int buf_size, const ImDrawCmd* cmd)
|
||||||
|
{
|
||||||
|
char* buf_end = buf + buf_size;
|
||||||
|
if (cmd->TexRef._TexData != NULL)
|
||||||
|
buf += ImFormatString(buf, buf_end - buf, "#%03d: ", cmd->TexRef._TexData->UniqueID);
|
||||||
|
return FormatTextureIDForDebugDisplay(buf, (int)(buf_end - buf), cmd->GetTexID());
|
||||||
|
}
|
||||||
|
|
||||||
// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
|
// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
|
||||||
static void MetricsHelpMarker(const char* desc)
|
static void MetricsHelpMarker(const char* desc)
|
||||||
{
|
{
|
||||||
|
|
@ -15524,6 +15568,10 @@ static void MetricsHelpMarker(const char* desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef IMGUI_ENABLE_FREETYPE
|
||||||
|
namespace ImGuiFreeType { IMGUI_API const ImFontLoader* GetBackendIOForFreeType(); }
|
||||||
|
#endif
|
||||||
|
|
||||||
// [DEBUG] List fonts in a font atlas and display its texture
|
// [DEBUG] List fonts in a font atlas and display its texture
|
||||||
void ImGui::ShowFontAtlas(ImFontAtlas* atlas)
|
void ImGui::ShowFontAtlas(ImFontAtlas* atlas)
|
||||||
{
|
{
|
||||||
|
|
@ -15538,6 +15586,36 @@ void ImGui::ShowFontAtlas(ImFontAtlas* atlas)
|
||||||
ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig;
|
ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig;
|
||||||
Checkbox("Show font preview", &cfg->ShowFontPreview);
|
Checkbox("Show font preview", &cfg->ShowFontPreview);
|
||||||
|
|
||||||
|
// Font loaders
|
||||||
|
if (TreeNode("Loader", "Loader: \'%s\'", atlas->FontLoaderName ? atlas->FontLoaderName : "NULL"))
|
||||||
|
{
|
||||||
|
const ImFontLoader* loader_current = atlas->FontLoader;
|
||||||
|
BeginDisabled(!atlas->DrawListSharedData || !atlas->DrawListSharedData->RendererHasTextures);
|
||||||
|
#ifdef IMGUI_ENABLE_STB_TRUETYPE
|
||||||
|
const ImFontLoader* loader_stbtruetype = ImFontAtlasGetFontLoaderForStbTruetype();
|
||||||
|
if (RadioButton("stb_truetype", loader_current == loader_stbtruetype))
|
||||||
|
ImFontAtlasBuildSetupFontLoader(atlas, loader_stbtruetype);
|
||||||
|
#else
|
||||||
|
BeginDisabled();
|
||||||
|
RadioButton("stb_truetype", false);
|
||||||
|
SetItemTooltip("Requires IMGUI_ENABLE_STB_TRUETYPE");
|
||||||
|
EndDisabled();
|
||||||
|
#endif
|
||||||
|
SameLine();
|
||||||
|
#ifdef IMGUI_ENABLE_FREETYPE
|
||||||
|
const ImFontLoader* loader_freetype = ImGuiFreeType::GetBackendIOForFreeType();
|
||||||
|
if (RadioButton("FreeType", loader_current == loader_freetype))
|
||||||
|
ImFontAtlasBuildSetupFontLoader(atlas, loader_freetype);
|
||||||
|
#else
|
||||||
|
BeginDisabled();
|
||||||
|
RadioButton("FreeType", false);
|
||||||
|
SetItemTooltip("Requires IMGUI_ENABLE_FREETYPE + imgui_freetype.cpp.");
|
||||||
|
EndDisabled();
|
||||||
|
#endif
|
||||||
|
EndDisabled();
|
||||||
|
TreePop();
|
||||||
|
}
|
||||||
|
|
||||||
// Font list
|
// Font list
|
||||||
for (ImFont* font : atlas->Fonts)
|
for (ImFont* font : atlas->Fonts)
|
||||||
{
|
{
|
||||||
|
|
@ -15545,11 +15623,32 @@ void ImGui::ShowFontAtlas(ImFontAtlas* atlas)
|
||||||
DebugNodeFont(font);
|
DebugNodeFont(font);
|
||||||
PopID();
|
PopID();
|
||||||
}
|
}
|
||||||
if (TreeNode("Font Atlas", "Font Atlas (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight))
|
|
||||||
|
// Texture list
|
||||||
|
for (ImTextureData* tex : atlas->TexList)
|
||||||
|
{
|
||||||
|
PushID(tex);
|
||||||
|
DebugNodeTexture(tex);
|
||||||
|
PopID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui::DebugNodeTexture(ImTextureData* tex)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
if (TreeNode(tex, "Texture #%03d (%dx%d pixels)", tex->UniqueID, tex->Width, tex->Height))
|
||||||
{
|
{
|
||||||
PushStyleVar(ImGuiStyleVar_ImageBorderSize, ImMax(1.0f, g.Style.ImageBorderSize));
|
PushStyleVar(ImGuiStyleVar_ImageBorderSize, ImMax(1.0f, g.Style.ImageBorderSize));
|
||||||
ImageWithBg(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
|
ImTextureRef tex_id;
|
||||||
|
tex_id._TexData = tex; // Don't use tex->TexID directly so first frame works.
|
||||||
|
ImageWithBg(tex_id, ImVec2((float)tex->Width, (float)tex->Height), ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
|
||||||
PopStyleVar();
|
PopStyleVar();
|
||||||
|
|
||||||
|
char texid_desc[20];
|
||||||
|
Text("Format = %d", tex->Format);
|
||||||
|
Text("TexID = %s", FormatTextureIDForDebugDisplay(texid_desc, IM_ARRAYSIZE(texid_desc), tex->TexID));
|
||||||
|
Text("BackendUserData = %p", tex->BackendUserData);
|
||||||
|
Text("UseColors = %d", tex->UseColors);
|
||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -15793,6 +15892,14 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Details for Fonts
|
||||||
|
ImFontAtlas* atlas = g.IO.Fonts;
|
||||||
|
if (TreeNode("Fonts", "Fonts (%d), Textures (%d)", atlas->Fonts.Size, atlas->TexList.Size))
|
||||||
|
{
|
||||||
|
ShowFontAtlas(atlas);
|
||||||
|
TreePop();
|
||||||
|
}
|
||||||
|
|
||||||
// Details for Popups
|
// Details for Popups
|
||||||
if (TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size))
|
if (TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size))
|
||||||
{
|
{
|
||||||
|
|
@ -15829,14 +15936,6 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Details for Fonts
|
|
||||||
ImFontAtlas* atlas = g.IO.Fonts;
|
|
||||||
if (TreeNode("Fonts", "Fonts (%d)", atlas->Fonts.Size))
|
|
||||||
{
|
|
||||||
ShowFontAtlas(atlas);
|
|
||||||
TreePop();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Details for InputText
|
// Details for InputText
|
||||||
if (TreeNode("InputText"))
|
if (TreeNode("InputText"))
|
||||||
{
|
{
|
||||||
|
|
@ -16245,7 +16344,7 @@ void ImGui::DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, con
|
||||||
}
|
}
|
||||||
|
|
||||||
char texid_desc[20];
|
char texid_desc[20];
|
||||||
FormatTextureIDForDebugDisplay(texid_desc, IM_ARRAYSIZE(texid_desc), pcmd->TexRef);
|
FormatTextureIDForDebugDisplay(texid_desc, IM_ARRAYSIZE(texid_desc), pcmd);
|
||||||
char buf[300];
|
char buf[300];
|
||||||
ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex %s, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)",
|
ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex %s, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)",
|
||||||
pcmd->ElemCount / 3, texid_desc, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
|
pcmd->ElemCount / 3, texid_desc, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
|
||||||
|
|
@ -16379,7 +16478,7 @@ void ImGui::DebugNodeFont(ImFont* font)
|
||||||
for (int config_i = 0; config_i < font->SourcesCount; config_i++)
|
for (int config_i = 0; config_i < font->SourcesCount; config_i++)
|
||||||
if (font->Sources)
|
if (font->Sources)
|
||||||
{
|
{
|
||||||
const ImFontConfig* src = &font->Sources[config_i];
|
ImFontConfig* src = &font->Sources[config_i];
|
||||||
int oversample_h, oversample_v;
|
int oversample_h, oversample_v;
|
||||||
ImFontAtlasBuildGetOversampleFactors(src, &oversample_h, &oversample_v);
|
ImFontAtlasBuildGetOversampleFactors(src, &oversample_h, &oversample_v);
|
||||||
BulletText("Input %d: \'%s\', Oversample: (%d=>%d,%d=>%d), PixelSnapH: %d, Offset: (%.1f,%.1f)",
|
BulletText("Input %d: \'%s\', Oversample: (%d=>%d,%d=>%d), PixelSnapH: %d, Offset: (%.1f,%.1f)",
|
||||||
|
|
@ -16390,6 +16489,10 @@ void ImGui::DebugNodeFont(ImFont* font)
|
||||||
{
|
{
|
||||||
if (TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size))
|
if (TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size))
|
||||||
{
|
{
|
||||||
|
if (SmallButton("Load all"))
|
||||||
|
for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base++)
|
||||||
|
font->FindGlyph((ImWchar)base);
|
||||||
|
|
||||||
ImDrawList* draw_list = GetWindowDrawList();
|
ImDrawList* draw_list = GetWindowDrawList();
|
||||||
const ImU32 glyph_col = GetColorU32(ImGuiCol_Text);
|
const ImU32 glyph_col = GetColorU32(ImGuiCol_Text);
|
||||||
const float cell_size = font->FontSize * 1;
|
const float cell_size = font->FontSize * 1;
|
||||||
|
|
@ -16407,7 +16510,7 @@ void ImGui::DebugNodeFont(ImFont* font)
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (unsigned int n = 0; n < 256; n++)
|
for (unsigned int n = 0; n < 256; n++)
|
||||||
if (font->FindGlyphNoFallback((ImWchar)(base + n)))
|
if (font->IsGlyphLoaded((ImWchar)(base + n)))
|
||||||
count++;
|
count++;
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -16422,7 +16525,7 @@ void ImGui::DebugNodeFont(ImFont* font)
|
||||||
// available here and thus cannot easily generate a zero-terminated UTF-8 encoded string.
|
// 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_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);
|
ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size);
|
||||||
const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base + n));
|
const ImFontGlyph* glyph = font->IsGlyphLoaded((ImWchar)(base + n)) ? font->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));
|
draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50));
|
||||||
if (!glyph)
|
if (!glyph)
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -16443,7 +16546,7 @@ void ImGui::DebugNodeFont(ImFont* font)
|
||||||
Unindent();
|
Unindent();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::DebugNodeFontGlyph(ImFont*, const ImFontGlyph* glyph)
|
void ImGui::DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph)
|
||||||
{
|
{
|
||||||
Text("Codepoint: U+%04X", glyph->Codepoint);
|
Text("Codepoint: U+%04X", glyph->Codepoint);
|
||||||
Separator();
|
Separator();
|
||||||
|
|
@ -16451,6 +16554,11 @@ void ImGui::DebugNodeFontGlyph(ImFont*, const ImFontGlyph* glyph)
|
||||||
Text("AdvanceX: %.1f", glyph->AdvanceX);
|
Text("AdvanceX: %.1f", glyph->AdvanceX);
|
||||||
Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1);
|
Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1);
|
||||||
Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1);
|
Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1);
|
||||||
|
if (glyph->PackId >= 0)
|
||||||
|
{
|
||||||
|
ImFontAtlasRect* 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);;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// [DEBUG] Display contents of ImGuiStorage
|
// [DEBUG] Display contents of ImGuiStorage
|
||||||
|
|
@ -16727,7 +16835,7 @@ void ImGui::ShowDebugLogWindow(bool* p_open)
|
||||||
ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper);
|
ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper);
|
||||||
ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus);
|
ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus);
|
||||||
ShowDebugLogFlag("IO", ImGuiDebugLogFlags_EventIO);
|
ShowDebugLogFlag("IO", ImGuiDebugLogFlags_EventIO);
|
||||||
//ShowDebugLogFlag("Font", ImGuiDebugLogFlags_EventFont);
|
ShowDebugLogFlag("Font", ImGuiDebugLogFlags_EventFont);
|
||||||
ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav);
|
ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav);
|
||||||
ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup);
|
ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup);
|
||||||
ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection);
|
ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection);
|
||||||
|
|
|
||||||
212
imgui.h
212
imgui.h
|
|
@ -31,6 +31,7 @@
|
||||||
#define IMGUI_VERSION "1.92.0 WIP"
|
#define IMGUI_VERSION "1.92.0 WIP"
|
||||||
#define IMGUI_VERSION_NUM 19197
|
#define IMGUI_VERSION_NUM 19197
|
||||||
#define IMGUI_HAS_TABLE
|
#define IMGUI_HAS_TABLE
|
||||||
|
#define IMGUI_HAS_TEXTURES // 1.92+ WIP branch with ImGuiBackendFlags_RendererHasTextures
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
|
@ -48,6 +49,7 @@ Index of this file:
|
||||||
// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor)
|
// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor)
|
||||||
// [SECTION] Multi-Select API flags and structures (ImGuiMultiSelectFlags, ImGuiMultiSelectIO, ImGuiSelectionRequest, ImGuiSelectionBasicStorage, ImGuiSelectionExternalStorage)
|
// [SECTION] Multi-Select API flags and structures (ImGuiMultiSelectFlags, ImGuiMultiSelectIO, ImGuiSelectionRequest, ImGuiSelectionBasicStorage, ImGuiSelectionExternalStorage)
|
||||||
// [SECTION] Drawing API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawFlags, ImDrawListFlags, ImDrawList, ImDrawData)
|
// [SECTION] Drawing API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawFlags, ImDrawListFlags, ImDrawList, ImDrawData)
|
||||||
|
// [SECTION] Texture API (ImTextureFormat, ImTextureStatus, ImTextureRect, ImTextureData)
|
||||||
// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont)
|
// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont)
|
||||||
// [SECTION] Viewports (ImGuiViewportFlags, ImGuiViewport)
|
// [SECTION] Viewports (ImGuiViewportFlags, ImGuiViewport)
|
||||||
// [SECTION] ImGuiPlatformIO + other Platform Dependent Interfaces (ImGuiPlatformImeData)
|
// [SECTION] ImGuiPlatformIO + other Platform Dependent Interfaces (ImGuiPlatformImeData)
|
||||||
|
|
@ -169,10 +171,13 @@ struct ImDrawListSplitter; // Helper to split a draw list into differen
|
||||||
struct ImDrawVert; // A single vertex (pos + uv + col = 20 bytes by default. Override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT)
|
struct ImDrawVert; // A single vertex (pos + uv + col = 20 bytes by default. Override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT)
|
||||||
struct ImFont; // Runtime data for a single font within a parent ImFontAtlas
|
struct ImFont; // Runtime data for a single font within a parent ImFontAtlas
|
||||||
struct ImFontAtlas; // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader
|
struct ImFontAtlas; // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader
|
||||||
struct ImFontBuilderIO; // Opaque interface to a font builder (stb_truetype or FreeType).
|
struct ImFontAtlasBuilder; // Opaque storage for building a ImFontAtlas
|
||||||
struct ImFontConfig; // Configuration data when adding a font or merging fonts
|
struct ImFontConfig; // Configuration data when adding a font or merging fonts
|
||||||
struct ImFontGlyph; // A single font glyph (code point + coordinates within in ImFontAtlas + offset)
|
struct ImFontGlyph; // A single font glyph (code point + coordinates within in ImFontAtlas + offset)
|
||||||
struct ImFontGlyphRangesBuilder; // Helper to build glyph ranges from text/string data
|
struct ImFontGlyphRangesBuilder; // Helper to build glyph ranges from text/string data
|
||||||
|
struct ImFontLoader; // Opaque interface to a font loading backend (stb_truetype, FreeType etc.).
|
||||||
|
struct ImTextureData; // Specs and pixel storage for a texture used by Dear ImGui.
|
||||||
|
struct ImTextureRect; // Coordinates of a rectangle within a texture.
|
||||||
struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4 (*OBSOLETE* please avoid using)
|
struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4 (*OBSOLETE* please avoid using)
|
||||||
|
|
||||||
// Forward declarations: ImGui layer
|
// Forward declarations: ImGui layer
|
||||||
|
|
@ -328,8 +333,8 @@ struct ImTextureRef
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Members
|
// Members
|
||||||
ImFontAtlas* _Atlas; // Texture/Atlas pointer
|
ImTextureData* _TexData; // Texture, generally owned by a ImFontAtlas
|
||||||
ImTextureID _TexID; // _OR_ Underlying user/backend texture identifier, or zero if not yet uploaded.
|
ImTextureID _TexID; // _OR_ Underlying texture identifier for backend, if already uploaded (otherwise pulled from _TexData)
|
||||||
};
|
};
|
||||||
IM_MSVC_RUNTIME_CHECKS_RESTORE
|
IM_MSVC_RUNTIME_CHECKS_RESTORE
|
||||||
|
|
||||||
|
|
@ -1638,6 +1643,7 @@ enum ImGuiBackendFlags_
|
||||||
ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Backend Platform supports honoring GetMouseCursor() value to change the OS cursor shape.
|
ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Backend Platform supports honoring GetMouseCursor() value to change the OS cursor shape.
|
||||||
ImGuiBackendFlags_HasSetMousePos = 1 << 2, // Backend Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if io.ConfigNavMoveSetMousePos is set).
|
ImGuiBackendFlags_HasSetMousePos = 1 << 2, // Backend Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if io.ConfigNavMoveSetMousePos is set).
|
||||||
ImGuiBackendFlags_RendererHasVtxOffset = 1 << 3, // Backend Renderer supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bit indices.
|
ImGuiBackendFlags_RendererHasVtxOffset = 1 << 3, // Backend Renderer supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bit indices.
|
||||||
|
ImGuiBackendFlags_RendererHasTextures = 1 << 4, // Backend Renderer supports ImTextureData requests to create/update/destroy textures. This enables incremental texture updates and texture reloads.
|
||||||
};
|
};
|
||||||
|
|
||||||
// Enumeration for PushStyleColor() / PopStyleColor()
|
// Enumeration for PushStyleColor() / PopStyleColor()
|
||||||
|
|
@ -2794,6 +2800,14 @@ static inline bool operator!=(const ImVec4& lhs, const ImVec4& rhs) { return
|
||||||
IM_MSVC_RUNTIME_CHECKS_RESTORE
|
IM_MSVC_RUNTIME_CHECKS_RESTORE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Helpers: ImTexture ==/!= operators provided as convenience (not strictly necessary)
|
||||||
|
static inline bool operator==(const ImTextureRef& lhs, const ImTextureRef& rhs) { return lhs._TexID == rhs._TexID && lhs._TexData == rhs._TexData; }
|
||||||
|
static inline bool operator!=(const ImTextureRef& lhs, const ImTextureRef& rhs) { return lhs._TexID != rhs._TexID || lhs._TexData != rhs._TexData; }
|
||||||
|
//#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS // For legacy backends
|
||||||
|
//static inline bool operator==(ImTextureID lhs, const ImTextureRef& rhs) { return lhs == rhs._TexID && rhs._TexData == NULL; }
|
||||||
|
//static inline bool operator==(const ImTextureRef& lhs, ImTextureID rhs) { return lhs._TexID == rhs && lhs._TexData == NULL; }
|
||||||
|
//#endif
|
||||||
|
|
||||||
// Helpers macros to generate 32-bit encoded colors
|
// Helpers macros to generate 32-bit encoded colors
|
||||||
// - User can declare their own format by #defining the 5 _SHIFT/_MASK macros in their imconfig file.
|
// - User can declare their own format by #defining the 5 _SHIFT/_MASK macros in their imconfig file.
|
||||||
// - Any setting other than the default will need custom backend support. The only standard backend that supports anything else than the default is DirectX9.
|
// - Any setting other than the default will need custom backend support. The only standard backend that supports anything else than the default is DirectX9.
|
||||||
|
|
@ -3041,7 +3055,8 @@ struct ImDrawCmd
|
||||||
|
|
||||||
// Since 1.83: returns ImTextureID associated with this draw call. Warning: DO NOT assume this is always same as 'TextureId' (we will change this function for an upcoming feature)
|
// Since 1.83: returns ImTextureID associated with this draw call. Warning: DO NOT assume this is always same as 'TextureId' (we will change this function for an upcoming feature)
|
||||||
// Since 1.92: removed ImDrawCmd::TextureId field, the getter function must be used!
|
// Since 1.92: removed ImDrawCmd::TextureId field, the getter function must be used!
|
||||||
inline ImTextureID GetTexID() const { return TexRef._TexID; }
|
// If for some reason you non C++ tech stack makes it difficult to call it, we may decide to separate the fields in ImDrawCmd.
|
||||||
|
inline ImTextureID GetTexID() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Vertex layout
|
// Vertex layout
|
||||||
|
|
@ -3273,6 +3288,7 @@ struct ImDrawList
|
||||||
//inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
|
//inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
|
||||||
|
|
||||||
// [Internal helpers]
|
// [Internal helpers]
|
||||||
|
IMGUI_API void _SetDrawListSharedData(ImDrawListSharedData* data);
|
||||||
IMGUI_API void _ResetForNewFrame();
|
IMGUI_API void _ResetForNewFrame();
|
||||||
IMGUI_API void _ClearFreeMemory();
|
IMGUI_API void _ClearFreeMemory();
|
||||||
IMGUI_API void _PopUnusedDrawCmd();
|
IMGUI_API void _PopUnusedDrawCmd();
|
||||||
|
|
@ -3309,6 +3325,73 @@ struct ImDrawData
|
||||||
IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
|
IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// [SECTION] Texture API (ImTextureFormat, ImTextureStatus, ImTextureDataUpdate, ImTextureData
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// We intentionally support a limited amount of texture formats to limit burden on CPU-side code and extension.
|
||||||
|
enum ImTextureFormat
|
||||||
|
{
|
||||||
|
ImTextureFormat_RGBA32, // 4 components per pixel, each is unsigned 8-bit. Total size = TexWidth * TexHeight * 4
|
||||||
|
ImTextureFormat_Alpha8, // 1 component per pixel, each is unsigned 8-bit. Total size = TexWidth * TexHeight
|
||||||
|
};
|
||||||
|
|
||||||
|
// Status of a texture
|
||||||
|
enum ImTextureStatus
|
||||||
|
{
|
||||||
|
ImTextureStatus_OK,
|
||||||
|
ImTextureStatus_Destroyed, // Backend destroyed the texture.
|
||||||
|
ImTextureStatus_WantCreate, // Requesting backend to create the texture. Set status OK when done.
|
||||||
|
ImTextureStatus_WantUpdates, // Requesting backend to update specific blocks of pixels (write to texture portions which have never been used before). Set status OK when done.
|
||||||
|
ImTextureStatus_WantDestroy, // Requesting backend to destroy the texture. Set status to Destroyed when done.
|
||||||
|
};
|
||||||
|
|
||||||
|
// Coordinates of a rectangle within a texture.
|
||||||
|
// When a texture is in ImTextureStatus_WantUpdates state, we provide a list of individual rectangles to copy to GPU texture.
|
||||||
|
// You may use ImTextureData::Updates[] for the list, or ImTextureData::UpdateBox for a single bounding box.
|
||||||
|
struct ImTextureRect
|
||||||
|
{
|
||||||
|
unsigned short x, y; // Upper-left coordinates of rectangle to update
|
||||||
|
unsigned short w, h; // Size of rectangle to update (in pixels)
|
||||||
|
};
|
||||||
|
|
||||||
|
// Specs and pixel storage for a texture used by Dear ImGui.
|
||||||
|
// The renderer backend will generally create a GPU-side version of this.
|
||||||
|
// Why does we store two identifiers: TexID and BackendUserData?
|
||||||
|
// - ImTextureID TexID = lower-level identifier stored in ImDrawCmd. ImDrawCmd can refer to textures not created by the backend, and for which there's no ImTextureData.
|
||||||
|
// - void* BackendUserData = higher-level opaque storage for backend own book-keeping. Some backends may have enough with TexID and not need both.
|
||||||
|
struct IMGUI_API ImTextureData
|
||||||
|
{
|
||||||
|
ImTextureStatus Status; // ImTextureStatus_OK/_WantCreate/_WantUpdates/_WantDestroy
|
||||||
|
ImTextureFormat Format; // ImTextureFormat_RGBA32 (default) or ImTextureFormat_Alpha8
|
||||||
|
int Width; // Texture width
|
||||||
|
int Height; // Texture height
|
||||||
|
int BytesPerPixel; // 4 or 1
|
||||||
|
int UniqueID; // Sequential index to facilitate identifying a texture when debugging/printing. Only unique per atlas.
|
||||||
|
unsigned char* Pixels; // Pointer to buffer holding 'Width*Height' pixels and 'Width*Height*BytesPerPixels' bytes.
|
||||||
|
ImTextureID TexID; // Identifier stored in ImDrawCmd::GetTexID() and passed to backend RenderDrawData loop.
|
||||||
|
void* BackendUserData; // Convenience storage for backend. Some backends may have enough with TexID.
|
||||||
|
ImTextureRect UpdateRect; // Bounding box encompassing all individual updates.
|
||||||
|
ImVector<ImTextureRect> Updates; // Array of individual updates.
|
||||||
|
int UnusedFrames; // In order to facilitate handling Status==WantDestroy in some backend: this is a count successive frames where the texture was not used. Always >0 when Status==WantDestroy.
|
||||||
|
|
||||||
|
// [Internal]
|
||||||
|
bool UseColors; // [Internal] Tell whether our texture data is known to use colors (rather than just white + alpha).
|
||||||
|
bool WantDestroyNextFrame; // [Internal] Queued to set ImTextureStatus_WantDestroy next frame. May still be used in the current frame.
|
||||||
|
|
||||||
|
// Functions
|
||||||
|
ImTextureData() { memset(this, 0, sizeof(*this)); }
|
||||||
|
~ImTextureData() { DestroyPixels(); }
|
||||||
|
void Create(ImTextureFormat format, int w, int h);
|
||||||
|
void DestroyPixels();
|
||||||
|
unsigned char* GetPixels() { IM_ASSERT(Pixels != NULL); return Pixels; }
|
||||||
|
unsigned char* GetPixelsAt(int x, int y) { IM_ASSERT(Pixels != NULL); return Pixels + (x + y * Width) * BytesPerPixel; }
|
||||||
|
int GetSizeInBytes() const { return Width * Height * BytesPerPixel; }
|
||||||
|
int GetPitch() const { return Width * BytesPerPixel; }
|
||||||
|
ImTextureRef GetTexRef() const { ImTextureRef tex_ref; tex_ref._TexData = (ImTextureData*)(void*)this; tex_ref._TexID = TexID; return tex_ref; }
|
||||||
|
ImTextureID GetTexID() const { return TexID; }
|
||||||
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont)
|
// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
@ -3338,7 +3421,8 @@ struct ImFontConfig
|
||||||
|
|
||||||
// [Internal]
|
// [Internal]
|
||||||
char Name[40]; // Name (strictly to ease debugging)
|
char Name[40]; // Name (strictly to ease debugging)
|
||||||
ImFont* DstFont;
|
ImFont* DstFont; // Target font (as we merging fonts, multiple ImFontConfig may target the same font)
|
||||||
|
void* FontLoaderData; // Font loader opaque storage (per font config)
|
||||||
|
|
||||||
IMGUI_API ImFontConfig();
|
IMGUI_API ImFontConfig();
|
||||||
};
|
};
|
||||||
|
|
@ -3353,6 +3437,9 @@ struct ImFontGlyph
|
||||||
float AdvanceX; // Horizontal distance to advance layout with
|
float AdvanceX; // Horizontal distance to advance layout with
|
||||||
float X0, Y0, X1, Y1; // Glyph corners
|
float X0, Y0, X1, Y1; // Glyph corners
|
||||||
float U0, V0, U1, V1; // Texture coordinates
|
float U0, V0, U1, V1; // Texture coordinates
|
||||||
|
int PackId; // [Internal] ImFontAtlasRectId value (FIXME: Cold data, could be moved elsewhere?)
|
||||||
|
|
||||||
|
ImFontGlyph() { memset(this, 0, sizeof(*this)); PackId = -1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper to build glyph ranges from text/string data. Feed your application strings/characters to it then call BuildRanges().
|
// Helper to build glyph ranges from text/string data. Feed your application strings/characters to it then call BuildRanges().
|
||||||
|
|
@ -3400,12 +3487,14 @@ enum ImFontAtlasFlags_
|
||||||
// - One or more fonts.
|
// - One or more fonts.
|
||||||
// - Custom graphics data needed to render the shapes needed by Dear ImGui.
|
// - Custom graphics data needed to render the shapes needed by Dear ImGui.
|
||||||
// - Mouse cursor shapes for software cursor rendering (unless setting 'Flags |= ImFontAtlasFlags_NoMouseCursors' in the font atlas).
|
// - Mouse cursor shapes for software cursor rendering (unless setting 'Flags |= ImFontAtlasFlags_NoMouseCursors' in the font atlas).
|
||||||
// It is the user-code responsibility to setup/build the atlas, then upload the pixel data into a texture accessible by your graphics api.
|
// - If you don't call any AddFont*** functions, the default font embedded in the code will be loaded for you.
|
||||||
// - Optionally, call any of the AddFont*** functions. If you don't call any, the default font embedded in the code will be loaded for you.
|
// It is the rendering backend responsibility to upload texture into your graphics API:
|
||||||
// - Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data.
|
// - ImGui_ImplXXXX_RenderDrawData() functions generally iterate atlas->TexList[] to create/update/destroy each ImTextureData instance.
|
||||||
// - Upload the pixels data into a texture within your graphics system (see imgui_impl_xxxx.cpp examples)
|
// - Backend then set ImTextureData's TexID and BackendUserData.
|
||||||
|
// - Texture id are passed back to you during rendering to identify the texture. Read FAQ entry about ImTextureID for more details.
|
||||||
|
// Legacy path:
|
||||||
|
// - Call Build() + GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data.
|
||||||
// - Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture in a format natural to your graphics API.
|
// - Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture in a format natural to your graphics API.
|
||||||
// This value will be passed back to you during rendering to identify the texture. Read FAQ entry about ImTextureID for more details.
|
|
||||||
// Common pitfalls:
|
// Common pitfalls:
|
||||||
// - If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the
|
// - If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the
|
||||||
// atlas is build (when calling GetTexData*** or Build()). We only copy the pointer, not the data.
|
// atlas is build (when calling GetTexData*** or Build()). We only copy the pointer, not the data.
|
||||||
|
|
@ -3423,25 +3512,30 @@ struct ImFontAtlas
|
||||||
IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed.
|
IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed.
|
||||||
IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
|
IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
|
||||||
IMGUI_API ImFont* AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter.
|
IMGUI_API ImFont* AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter.
|
||||||
|
|
||||||
|
// FIXME-NEWATLAS: Clarify meaning/purpose
|
||||||
IMGUI_API void ClearInputData(); // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts.
|
IMGUI_API void ClearInputData(); // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts.
|
||||||
IMGUI_API void ClearFonts(); // Clear input+output font data (same as ClearInputData() + glyphs storage, UV coordinates).
|
IMGUI_API void ClearFonts(); // Clear input+output font data (same as ClearInputData() + glyphs storage, UV coordinates).
|
||||||
IMGUI_API void ClearTexData(); // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory.
|
IMGUI_API void ClearTexData(); // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory.
|
||||||
IMGUI_API void Clear(); // Clear all input and output.
|
IMGUI_API void Clear(); // Clear all input and output.
|
||||||
|
|
||||||
|
IMGUI_API void ClearCache(); // Clear cached glyphs
|
||||||
|
|
||||||
// Build atlas, retrieve pixel data.
|
// Build atlas, retrieve pixel data.
|
||||||
// User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID().
|
// User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID().
|
||||||
// The pitch is always = Width * BytesPerPixels (1 or 4)
|
// The pitch is always = Width * BytesPerPixels (1 or 4)
|
||||||
// Building in RGBA32 format is provided for convenience and compatibility, but note that unless you manually manipulate or copy color data into
|
// Building in RGBA32 format is provided for convenience and compatibility, but note that unless you manually manipulate or copy color data into
|
||||||
// the texture (e.g. when using the AddCustomRect*** api), then the RGB pixels emitted will always be white (~75% of memory/bandwidth waste.
|
// the texture (e.g. when using the AddCustomRect*** api), then the RGB pixels emitted will always be white (~75% of memory/bandwidth waste.
|
||||||
IMGUI_API bool Build(); // Build pixels data. This is called automatically for you by the GetTexData*** functions.
|
IMGUI_API bool Build(); // Build pixels data. This is called automatically for you by the GetTexData*** functions.
|
||||||
IMGUI_API void GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 1 byte per-pixel
|
IMGUI_API void BuildGrowTexture();
|
||||||
IMGUI_API void GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 4 bytes-per-pixel
|
IMGUI_API void BuildCompactTexture();
|
||||||
bool IsBuilt() const { return Fonts.Size > 0 && TexReady; } // Bit ambiguous: used to detect when user didn't build texture but effectively we should check TexID != 0 except that would be backend dependent...
|
|
||||||
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||||||
void SetTexID(ImTextureID id){ TexID._Atlas = this; TexID._TexID = id; } // FIXME-NEWATLAS: Called by legacy backends.
|
IMGUI_API void GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 1 byte per-pixel
|
||||||
void SetTexID(ImTextureRef id) { TexID = id; } // FIXME-NEWATLAS: Called by legacy backends.
|
IMGUI_API void GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 4 bytes-per-pixel
|
||||||
|
void SetTexID(ImTextureID id) { TexRef._TexData = NULL; TexRef._TexID = id; } // Called by legacy backends.
|
||||||
|
void SetTexID(ImTextureRef id) { TexRef = id; } // Called by legacy backends.
|
||||||
#endif
|
#endif
|
||||||
|
bool IsBuilt() const { return Fonts.Size > 0 && TexIsBuilt; } // Bit ambiguous: used to detect when user didn't build texture but effectively we should check TexID != 0 except that would be backend dependent...
|
||||||
|
|
||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
// Glyph Ranges
|
// Glyph Ranges
|
||||||
|
|
@ -3466,10 +3560,15 @@ struct ImFontAtlas
|
||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
|
|
||||||
// You can request arbitrary rectangles to be packed into the atlas, for your own purposes.
|
// You can request arbitrary rectangles to be packed into the atlas, for your own purposes.
|
||||||
// - After calling Build(), you can query the rectangle position and render your pixels.
|
// You can request your rectangles to be mapped as font glyph (given a font + Unicode point),
|
||||||
// - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of preferred texture format.
|
// so you can render e.g. custom colorful icons and use them as regular glyphs.
|
||||||
// - You can also request your rectangles to be mapped as font glyph (given a font + Unicode point),
|
// - If your backend supports ImGuiBackendFlags_RendererHasTextures (since 1.92.X):
|
||||||
// so you can render e.g. custom colorful icons and use them as regular glyphs.
|
// - Packing is done immediately. Returns >= on success. Return <0 on error.
|
||||||
|
// - You can render your pixels into the texture right after calling the AddCustomRectXXX functions.
|
||||||
|
// - Texture may be resized, so you cannot cache UV coordinates. // FIXME-NEWATLAS-V1: How to handle that smoothly?
|
||||||
|
// - If your backend does NOT supports ImGuiBackendFlags_RendererHasTextures (older than 1.92.X):
|
||||||
|
// - After calling Build(), you can query the rectangle position and render your pixels.
|
||||||
|
// - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of preferred texture format.
|
||||||
// - Read docs/FONTS.md for more details about using colorful icons.
|
// - Read docs/FONTS.md for more details about using colorful icons.
|
||||||
// - Note: this API may be redesigned later in order to support multi-monitor varying DPI settings.
|
// - Note: this API may be redesigned later in order to support multi-monitor varying DPI settings.
|
||||||
IMGUI_API int AddCustomRectRegular(int width, int height);
|
IMGUI_API int AddCustomRectRegular(int width, int height);
|
||||||
|
|
@ -3485,34 +3584,38 @@ struct ImFontAtlas
|
||||||
|
|
||||||
// Input
|
// Input
|
||||||
ImFontAtlasFlags Flags; // Build flags (see ImFontAtlasFlags_)
|
ImFontAtlasFlags Flags; // Build flags (see ImFontAtlasFlags_)
|
||||||
ImTextureRef TexID; // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure.
|
ImTextureRef TexRef; // User data to refer to the latest texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure.
|
||||||
int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
|
int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
|
||||||
|
ImTextureFormat TexDesiredFormat; // Desired texture format (default to ImTextureFormat_RGBA32 but may be changed to ImTextureFormat_Alpha8).
|
||||||
int TexGlyphPadding; // FIXME: Should be called "TexPackPadding". Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0 (will also need to set AntiAliasedLinesUseTex = false).
|
int TexGlyphPadding; // FIXME: Should be called "TexPackPadding". Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0 (will also need to set AntiAliasedLinesUseTex = false).
|
||||||
void* UserData; // Store your own atlas related user-data (if e.g. you have multiple font atlas).
|
void* UserData; // Store your own atlas related user-data (if e.g. you have multiple font atlas).
|
||||||
|
|
||||||
|
// Output
|
||||||
|
ImTextureData* TexData; // Current texture
|
||||||
|
ImVector<ImTextureData*> TexList; // Texture list (most often TexList.Size == 1). TexData is always == TexList.back().
|
||||||
|
|
||||||
// [Internal]
|
// [Internal]
|
||||||
// NB: Access texture data via GetTexData*() calls! Which will setup a default font for you.
|
|
||||||
bool Locked; // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert.
|
bool Locked; // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert.
|
||||||
bool TexReady; // Set when texture was built matching current font input
|
bool TexIsBuilt; // Set when texture was built matching current font input
|
||||||
bool TexPixelsUseColors; // Tell whether our texture data is known to use colors (rather than just alpha channel), in order to help backend select a format.
|
bool TexPixelsUseColors; // Tell whether our texture data is known to use colors (rather than just alpha channel), in order to help backend select a format or conversion process.
|
||||||
unsigned char* TexPixelsAlpha8; // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight
|
ImVec2 TexUvScale; // = (1.0f/TexData->TexWidth, 1.0f/TexData->TexHeight)
|
||||||
unsigned int* TexPixelsRGBA32; // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4
|
|
||||||
int TexWidth; // Texture width calculated during Build().
|
|
||||||
int TexHeight; // Texture height calculated during Build().
|
|
||||||
ImVec2 TexUvScale; // = (1.0f/TexWidth, 1.0f/TexHeight)
|
|
||||||
ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel
|
ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel
|
||||||
ImVector<ImFont*> Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font.
|
ImVector<ImFont*> Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font.
|
||||||
ImVector<ImFontAtlasCustomRect> CustomRects; // Rectangles for packing custom texture data into the atlas.
|
ImVector<ImFontAtlasCustomRect> CustomRects; // Rectangles for packing custom texture data into the atlas.
|
||||||
ImVector<ImFontConfig> Sources; // Source/configuration data
|
ImVector<ImFontConfig> Sources; // Source/configuration data
|
||||||
ImVec4 TexUvLines[IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1]; // UVs for baked anti-aliased lines
|
ImVec4 TexUvLines[IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1]; // UVs for baked anti-aliased lines
|
||||||
|
int TexNextUniqueID; // Next value to be stored in TexData->UniqueID
|
||||||
|
ImDrawListSharedData* DrawListSharedData; // In principle this could become an array (e.g. multiple contexts using same atlas)
|
||||||
|
|
||||||
// [Internal] Font builder
|
// [Internal] Font builder
|
||||||
const ImFontBuilderIO* FontBuilderIO; // Opaque interface to a font builder (default to stb_truetype, can be changed to use FreeType by defining IMGUI_ENABLE_FREETYPE).
|
ImFontAtlasBuilder* Builder; // Opaque interface to our data that doesn't need to be public
|
||||||
unsigned int FontBuilderFlags; // Shared flags (for all fonts) for custom font builder. THIS IS BUILD IMPLEMENTATION DEPENDENT. Per-font override is also available in ImFontConfig.
|
const ImFontLoader* FontLoader; // Font loader opaque interface (default to stb_truetype, can be changed to use FreeType by defining IMGUI_ENABLE_FREETYPE). Don't set directly!
|
||||||
|
const char* FontLoaderName; // Font loader name (for display e.g. in About box) == FontLoader->Name
|
||||||
// [Internal] Packing data
|
void* FontLoaderData; // Font backend opaque storage
|
||||||
int PackIdMouseCursors; // Custom texture rectangle ID for white pixel and mouse cursors
|
unsigned int FontBuilderFlags; // [FIXME: Should be called FontLoaderFlags] Shared flags (for all fonts) for font loader. THIS IS BUILD IMPLEMENTATION DEPENDENT (e.g. . Per-font override is also available in ImFontConfig.
|
||||||
int PackIdLines; // Custom texture rectangle ID for baked anti-aliased lines
|
int _PackedSurface; // Number of packed pixels. Used when compacting to heuristically find the ideal texture size.
|
||||||
|
int _PackedRects; // Number of packed rectangles.
|
||||||
|
float _PackNodesFactor = 1.0f;
|
||||||
|
|
||||||
// [Obsolete]
|
// [Obsolete]
|
||||||
//typedef ImFontAtlasCustomRect CustomRect; // OBSOLETED in 1.72+
|
//typedef ImFontAtlasCustomRect CustomRect; // OBSOLETED in 1.72+
|
||||||
|
|
@ -3525,13 +3628,13 @@ struct ImFont
|
||||||
{
|
{
|
||||||
// [Internal] Members: Hot ~20/24 bytes (for CalcTextSize)
|
// [Internal] Members: Hot ~20/24 bytes (for CalcTextSize)
|
||||||
ImVector<float> IndexAdvanceX; // 12-16 // out // Sparse. Glyphs->AdvanceX in a directly indexable way (cache-friendly for CalcTextSize functions which only this info, and are often bottleneck in large UI).
|
ImVector<float> IndexAdvanceX; // 12-16 // out // Sparse. Glyphs->AdvanceX in a directly indexable way (cache-friendly for CalcTextSize functions which only this info, and are often bottleneck in large UI).
|
||||||
float FallbackAdvanceX; // 4 // out // = FallbackGlyph->AdvanceX
|
float FallbackAdvanceX; // 4 // out // FindGlyph(FallbackChar)->AdvanceX
|
||||||
float FontSize; // 4 // in // Height of characters/line, set during loading (don't change after loading)
|
float FontSize; // 4 // in // Height of characters/line, set during loading (don't change after loading)
|
||||||
|
|
||||||
// [Internal] Members: Hot ~28/40 bytes (for RenderText loop)
|
// [Internal] Members: Hot ~28/40 bytes (for RenderText loop)
|
||||||
ImVector<ImU16> IndexLookup; // 12-16 // out // Sparse. Index glyphs by Unicode code-point.
|
ImVector<ImU16> IndexLookup; // 12-16 // out // Sparse. Index glyphs by Unicode code-point.
|
||||||
ImVector<ImFontGlyph> Glyphs; // 12-16 // out // All glyphs.
|
ImVector<ImFontGlyph> Glyphs; // 12-16 // out // All glyphs.
|
||||||
ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar)
|
int FallbackGlyphIndex; // 4 // out // Index of FontFallbackChar
|
||||||
|
|
||||||
// [Internal] Members: Cold ~32/40 bytes
|
// [Internal] Members: Cold ~32/40 bytes
|
||||||
// Conceptually Sources[] is the list of font sources merged to create this font.
|
// Conceptually Sources[] is the list of font sources merged to create this font.
|
||||||
|
|
@ -3543,18 +3646,21 @@ struct ImFont
|
||||||
ImWchar FallbackChar; // 2-4 // out // Character used if a glyph isn't found (U+FFFD, '?')
|
ImWchar FallbackChar; // 2-4 // out // Character used if a glyph isn't found (U+FFFD, '?')
|
||||||
float EllipsisWidth; // 4 // out // Total ellipsis Width
|
float EllipsisWidth; // 4 // out // Total ellipsis Width
|
||||||
float EllipsisCharStep; // 4 // out // Step between characters when EllipsisCount > 0
|
float EllipsisCharStep; // 4 // out // Step between characters when EllipsisCount > 0
|
||||||
float Scale; // 4 // in // Base font scale (1.0f), multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
|
float Scale; // 4 // in // Base font scale (~1.0f), multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
|
||||||
float Ascent, Descent; // 4+4 // out // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] (unscaled)
|
float Ascent, Descent; // 4+4 // out // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] (unscaled)
|
||||||
int MetricsTotalSurface;// 4 // out // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
|
int MetricsTotalSurface;// 4 // out // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
|
||||||
bool DirtyLookupTables; // 1 // out //
|
|
||||||
ImU8 Used8kPagesMap[(IM_UNICODE_CODEPOINT_MAX+1)/8192/8]; // 1 bytes if ImWchar=ImWchar16, 16 bytes if ImWchar==ImWchar32. Store 1-bit for each block of 4K codepoints that has one active glyph. This is mainly used to facilitate iterations across all used codepoints.
|
ImU8 Used8kPagesMap[(IM_UNICODE_CODEPOINT_MAX+1)/8192/8]; // 1 bytes if ImWchar=ImWchar16, 16 bytes if ImWchar==ImWchar32. Store 1-bit for each block of 4K codepoints that has one active glyph. This is mainly used to facilitate iterations across all used codepoints.
|
||||||
|
bool LockDisableLoading;
|
||||||
|
ImFontConfig* LockSingleSrcConfig;
|
||||||
|
|
||||||
// Methods
|
// Methods
|
||||||
IMGUI_API ImFont();
|
IMGUI_API ImFont();
|
||||||
IMGUI_API ~ImFont();
|
IMGUI_API ~ImFont();
|
||||||
IMGUI_API ImFontGlyph* FindGlyph(ImWchar c);
|
IMGUI_API ImFontGlyph* FindGlyph(ImWchar c); // Return fallback glyph if requested glyph doesn't exists.
|
||||||
IMGUI_API ImFontGlyph* FindGlyphNoFallback(ImWchar c);
|
IMGUI_API ImFontGlyph* FindGlyphNoFallback(ImWchar c); // Return NULL if glyph doesn't exist
|
||||||
float GetCharAdvance(ImWchar c) { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; }
|
IMGUI_API float GetCharAdvance(ImWchar c);
|
||||||
|
IMGUI_API bool IsGlyphLoaded(ImWchar c);
|
||||||
|
IMGUI_API bool IsGlyphInFont(ImWchar c);
|
||||||
bool IsLoaded() const { return ContainerAtlas != NULL; }
|
bool IsLoaded() const { return ContainerAtlas != NULL; }
|
||||||
const char* GetDebugName() const { return Sources ? Sources->Name : "<unknown>"; }
|
const char* GetDebugName() const { return Sources ? Sources->Name : "<unknown>"; }
|
||||||
|
|
||||||
|
|
@ -3571,14 +3677,24 @@ struct ImFont
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// [Internal] Don't use!
|
// [Internal] Don't use!
|
||||||
IMGUI_API void BuildLookupTable();
|
|
||||||
IMGUI_API void ClearOutputData();
|
IMGUI_API void ClearOutputData();
|
||||||
IMGUI_API void GrowIndex(int new_size);
|
IMGUI_API void AddRemapChar(ImWchar from_codepoint, ImWchar to_codepoint, bool overwrite_dst);// , bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.
|
||||||
IMGUI_API void AddGlyph(const ImFontConfig* src_cfg, ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x);
|
|
||||||
IMGUI_API void AddRemapChar(ImWchar from_codepoint, ImWchar to_codepoint, bool overwrite_dst);// , bool overwrite_dst = true); // Makes 'from_codepoint' character points to 'to_codepoint' character. Currently needs to be called AFTER fonts have been built.
|
|
||||||
IMGUI_API bool IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last);
|
IMGUI_API bool IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last);
|
||||||
|
IMGUI_API ImFontGlyph* BuildLoadGlyph(ImWchar c);
|
||||||
|
IMGUI_API void BuildRegisterGlyph(ImFontConfig* src, const ImFontGlyph* glyph);
|
||||||
|
IMGUI_API void BuildGrowIndex(int new_size);
|
||||||
|
IMGUI_API void BuildClearGlyphs();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// FIXME-NEWATLAS: Added indirection to avoid patching ImDrawCmd after texture updates.
|
||||||
|
inline ImTextureID ImDrawCmd::GetTexID() const
|
||||||
|
{
|
||||||
|
ImTextureID tex_id = TexRef._TexData ? TexRef._TexData->TexID : TexRef._TexID;
|
||||||
|
if (TexRef._TexData != NULL)
|
||||||
|
IM_ASSERT(tex_id && "ImDrawCmd is referring to Atlas texture that wasn't uploaded to graphics system.");
|
||||||
|
return tex_id;
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] Viewports
|
// [SECTION] Viewports
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
@ -3657,6 +3773,10 @@ struct ImGuiPlatformIO
|
||||||
// Input - Interface with Renderer Backend
|
// Input - Interface with Renderer Backend
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Optional: Maximum texture size supported by renderer (used to adjust how we size textures). 0 if not known.
|
||||||
|
int Renderer_TextureMaxWidth;
|
||||||
|
int Renderer_TextureMaxHeight;
|
||||||
|
|
||||||
// Written by some backends during ImGui_ImplXXXX_RenderDrawData() call to point backend_specific ImGui_ImplXXXX_RenderState* structure.
|
// Written by some backends during ImGui_ImplXXXX_RenderDrawData() call to point backend_specific ImGui_ImplXXXX_RenderState* structure.
|
||||||
void* Renderer_RenderState;
|
void* Renderer_RenderState;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -576,6 +576,7 @@ void ImGui::ShowDemoWindow(bool* p_open)
|
||||||
ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &io.BackendFlags, ImGuiBackendFlags_HasMouseCursors);
|
ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &io.BackendFlags, ImGuiBackendFlags_HasMouseCursors);
|
||||||
ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", &io.BackendFlags, ImGuiBackendFlags_HasSetMousePos);
|
ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", &io.BackendFlags, ImGuiBackendFlags_HasSetMousePos);
|
||||||
ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", &io.BackendFlags, ImGuiBackendFlags_RendererHasVtxOffset);
|
ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", &io.BackendFlags, ImGuiBackendFlags_RendererHasVtxOffset);
|
||||||
|
ImGui::CheckboxFlags("io.BackendFlags: RendererHasTextures", &io.BackendFlags, ImGuiBackendFlags_RendererHasTextures);
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
|
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
|
|
@ -1778,9 +1779,9 @@ static void DemoWindowWidgetsImages()
|
||||||
// - Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage().
|
// - Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage().
|
||||||
// - Read https://github.com/ocornut/imgui/blob/master/docs/FAQ.md
|
// - Read https://github.com/ocornut/imgui/blob/master/docs/FAQ.md
|
||||||
// - Read https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples
|
// - Read https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples
|
||||||
ImTextureRef my_tex_id = io.Fonts->TexID;
|
ImTextureRef my_tex_id = io.Fonts->TexRef;
|
||||||
float my_tex_w = (float)io.Fonts->TexWidth;
|
float my_tex_w = (float)io.Fonts->TexData->Width;
|
||||||
float my_tex_h = (float)io.Fonts->TexHeight;
|
float my_tex_h = (float)io.Fonts->TexData->Height;
|
||||||
{
|
{
|
||||||
ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h);
|
ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h);
|
||||||
ImVec2 pos = ImGui::GetCursorScreenPos();
|
ImVec2 pos = ImGui::GetCursorScreenPos();
|
||||||
|
|
@ -8041,7 +8042,7 @@ void ImGui::ShowAboutWindow(bool* p_open)
|
||||||
if (copy_to_clipboard)
|
if (copy_to_clipboard)
|
||||||
{
|
{
|
||||||
ImGui::LogToClipboard();
|
ImGui::LogToClipboard();
|
||||||
ImGui::LogText("```\n"); // Back quotes will make text appears without formatting when pasting on GitHub
|
ImGui::LogText("```cpp\n"); // Back quotes will make text appears without formatting when pasting on GitHub
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
|
ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
|
||||||
|
|
@ -8137,8 +8138,10 @@ void ImGui::ShowAboutWindow(bool* p_open)
|
||||||
if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(" HasMouseCursors");
|
if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(" HasMouseCursors");
|
||||||
if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(" HasSetMousePos");
|
if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(" HasSetMousePos");
|
||||||
if (io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) ImGui::Text(" RendererHasVtxOffset");
|
if (io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) ImGui::Text(" RendererHasVtxOffset");
|
||||||
|
if (io.BackendFlags & ImGuiBackendFlags_RendererHasTextures) ImGui::Text(" RendererHasTextures");
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight);
|
ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexData->Width, io.Fonts->TexData->Height);
|
||||||
|
ImGui::Text("io.Fonts->FontLoaderName: \"%s\"", io.Fonts->FontLoaderName ? io.Fonts->FontLoaderName : "NULL");
|
||||||
ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y);
|
ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y);
|
||||||
ImGui::Text("io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
|
ImGui::Text("io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
|
||||||
2004
imgui_draw.cpp
2004
imgui_draw.cpp
File diff suppressed because it is too large
Load diff
127
imgui_internal.h
127
imgui_internal.h
|
|
@ -37,6 +37,7 @@ Index of this file:
|
||||||
// [SECTION] Tab bar, Tab item support
|
// [SECTION] Tab bar, Tab item support
|
||||||
// [SECTION] Table support
|
// [SECTION] Table support
|
||||||
// [SECTION] ImGui internal API
|
// [SECTION] ImGui internal API
|
||||||
|
// [SECTION] ImFontLoader
|
||||||
// [SECTION] ImFontAtlas internal API
|
// [SECTION] ImFontAtlas internal API
|
||||||
// [SECTION] Test Engine specific hooks (imgui_test_engine)
|
// [SECTION] Test Engine specific hooks (imgui_test_engine)
|
||||||
|
|
||||||
|
|
@ -140,6 +141,8 @@ struct ImGuiTextIndex; // Maintain a line index for a text buffer.
|
||||||
// ImDrawList/ImFontAtlas
|
// ImDrawList/ImFontAtlas
|
||||||
struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
|
struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
|
||||||
struct ImDrawListSharedData; // Data shared between all ImDrawList instances
|
struct ImDrawListSharedData; // Data shared between all ImDrawList instances
|
||||||
|
struct ImFontAtlasRect; // Packed rectangle (same as ImTextureRect)
|
||||||
|
struct ImFontAtlasBuilder; // Internal storage for incrementally packing and building a ImFontAtlas
|
||||||
|
|
||||||
// ImGui
|
// ImGui
|
||||||
struct ImGuiBoxSelectState; // Box-selection state (currently used by multi-selection, could potentially be used by others)
|
struct ImGuiBoxSelectState; // Box-selection state (currently used by multi-selection, could potentially be used by others)
|
||||||
|
|
@ -530,6 +533,14 @@ struct ImVec1
|
||||||
constexpr ImVec1(float _x) : x(_x) { }
|
constexpr ImVec1(float _x) : x(_x) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Helper: ImVec2i (2D vector, integer)
|
||||||
|
struct ImVec2i
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
constexpr ImVec2i() : x(0), y(0) {}
|
||||||
|
constexpr ImVec2i(int _x, int _y) : x(_x), y(_y) {}
|
||||||
|
};
|
||||||
|
|
||||||
// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)
|
// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)
|
||||||
struct ImVec2ih
|
struct ImVec2ih
|
||||||
{
|
{
|
||||||
|
|
@ -789,8 +800,9 @@ IMGUI_API ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStorag
|
||||||
// You may want to create your own instance of you try to ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
|
// You may want to create your own instance of you try to ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
|
||||||
struct IMGUI_API ImDrawListSharedData
|
struct IMGUI_API ImDrawListSharedData
|
||||||
{
|
{
|
||||||
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
|
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas (== FontAtlas->TexUvWhitePixel)
|
||||||
const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas
|
const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas (== FontAtlas->TexUvLines)
|
||||||
|
ImFontAtlas* FontAtlas; // Current font atlas
|
||||||
ImFont* Font; // Current/default font (optional, for simplified AddText overload)
|
ImFont* Font; // Current/default font (optional, for simplified AddText overload)
|
||||||
float FontSize; // Current/default font size (optional, for simplified AddText overload)
|
float FontSize; // Current/default font size (optional, for simplified AddText overload)
|
||||||
float FontScale; // Current/default font scale (== FontSize / Font->FontSize)
|
float FontScale; // Current/default font scale (== FontSize / Font->FontSize)
|
||||||
|
|
@ -800,13 +812,17 @@ struct IMGUI_API ImDrawListSharedData
|
||||||
ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
|
ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
|
||||||
ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
|
ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
|
||||||
ImVector<ImVec2> TempBuffer; // Temporary write buffer
|
ImVector<ImVec2> TempBuffer; // Temporary write buffer
|
||||||
|
ImVector<ImDrawList*> DrawLists; // All draw lists associated to this ImDrawListSharedData
|
||||||
|
ImGuiContext* Context; // [OPTIONAL] Link to Dear ImGui context. 99% of ImDrawList/ImFontAtlas can function without an ImGui context, but this facilitate handling one legacy edge case.
|
||||||
|
|
||||||
// Lookup tables
|
// Lookup tables
|
||||||
ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
|
ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
|
||||||
float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
|
float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
|
||||||
ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
|
ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
|
||||||
|
bool RendererHasTextures; // Copy of (GetIO().BackendFlags & ImGuiBackendFlags_RendererHasTextures).
|
||||||
|
|
||||||
ImDrawListSharedData();
|
ImDrawListSharedData();
|
||||||
|
~ImDrawListSharedData();
|
||||||
void SetCircleTessellationMaxError(float max_error);
|
void SetCircleTessellationMaxError(float max_error);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -2085,6 +2101,7 @@ struct ImGuiContext
|
||||||
float FontScale; // == FontSize / Font->FontSize
|
float FontScale; // == FontSize / Font->FontSize
|
||||||
float CurrentDpiScale; // Current window/viewport DpiScale
|
float CurrentDpiScale; // Current window/viewport DpiScale
|
||||||
ImDrawListSharedData DrawListSharedData;
|
ImDrawListSharedData DrawListSharedData;
|
||||||
|
ImVector<ImTextureData*>Textures;
|
||||||
double Time;
|
double Time;
|
||||||
int FrameCount;
|
int FrameCount;
|
||||||
int FrameCountEnded;
|
int FrameCountEnded;
|
||||||
|
|
@ -3561,6 +3578,7 @@ namespace ImGui
|
||||||
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 DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);
|
IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);
|
||||||
|
IMGUI_API void DebugNodeTexture(ImTextureData* tex);
|
||||||
IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label);
|
IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label);
|
||||||
IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label);
|
IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label);
|
||||||
IMGUI_API void DebugNodeTable(ImGuiTable* table);
|
IMGUI_API void DebugNodeTable(ImGuiTable* table);
|
||||||
|
|
@ -3593,31 +3611,102 @@ namespace ImGui
|
||||||
} // namespace ImGui
|
} // namespace ImGui
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// [SECTION] ImFontLoader
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Hooks and storage for a given font backend.
|
||||||
|
// This structure is likely to evolve as we add support for incremental atlas updates.
|
||||||
|
// Conceptually this could be in ImGuiPlatformIO, but we are far from ready to make this public.
|
||||||
|
struct ImFontLoader
|
||||||
|
{
|
||||||
|
const char* Name;
|
||||||
|
bool (*LoaderInit)(ImFontAtlas* atlas);
|
||||||
|
void (*LoaderShutdown)(ImFontAtlas* atlas);
|
||||||
|
bool (*FontSrcInit)(ImFontAtlas* atlas, ImFontConfig* src);
|
||||||
|
void (*FontSrcDestroy)(ImFontAtlas* atlas, ImFontConfig* src);
|
||||||
|
bool (*FontSrcContainsGlyph)(ImFontAtlas* atlas, ImFontConfig* src, ImWchar codepoint);
|
||||||
|
bool (*FontAddGlyph)(ImFontAtlas* atlas, ImFont* font, ImWchar codepoint);
|
||||||
|
|
||||||
|
ImFontLoader() { memset(this, 0, sizeof(*this)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef IMGUI_ENABLE_STB_TRUETYPE
|
||||||
|
IMGUI_API const ImFontLoader* ImFontAtlasGetFontLoaderForStbTruetype();
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] ImFontAtlas internal API
|
// [SECTION] ImFontAtlas internal API
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
// This structure is likely to evolve as we add support for incremental atlas updates.
|
// Packed rectangle (same as ImTextureRect)
|
||||||
// Conceptually this could be in ImGuiPlatformIO, but we are far from ready to make this public.
|
struct ImFontAtlasRect
|
||||||
struct ImFontBuilderIO
|
|
||||||
{
|
{
|
||||||
bool (*FontBuilder_Build)(ImFontAtlas* atlas);
|
unsigned short x, y;
|
||||||
|
unsigned short w, h;
|
||||||
|
};
|
||||||
|
typedef int ImFontAtlasRectId; // <0 when invalid
|
||||||
|
|
||||||
|
// Internal storage for incrementally packing and building a ImFontAtlas
|
||||||
|
struct stbrp_context_opaque { char data[80]; };
|
||||||
|
struct stbrp_node;
|
||||||
|
struct ImFontAtlasBuilder
|
||||||
|
{
|
||||||
|
stbrp_context_opaque PackContext; // Actually 'stbrp_context' but we don't want to define this in the header file.
|
||||||
|
ImVector<stbrp_node> PackNodes;
|
||||||
|
int PackPadding; // Generally 1 to avoid bilinear filtering issues.
|
||||||
|
ImVector<ImFontAtlasRect> Rects;
|
||||||
|
ImVector<unsigned char> TempBuffer; // Misc scratch buffer
|
||||||
|
ImVec2i MaxRectSize; // Largest rectangle to pack (defacto used as a "minimum texture size")
|
||||||
|
ImVec2i MaxRectBounds; // Bottom-right most used pixels
|
||||||
|
bool LockDisableResize; // Disable resizing texture
|
||||||
|
bool PreloadedAllGlyphsRanges; // Set when missing ImGuiBackendFlags_RendererHasTextures features forces atlas to preload everything.
|
||||||
|
|
||||||
|
// Custom rectangle identifiers
|
||||||
|
ImFontAtlasRectId PackIdMouseCursors; // White pixel + mouse cursors. Also happen to be fallback in case of packing failure.
|
||||||
|
ImFontAtlasRectId PackIdLinesTexData;
|
||||||
|
|
||||||
|
ImFontAtlasBuilder() { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper for font builder
|
// FIXME-NEWATLAS: Cleanup
|
||||||
#ifdef IMGUI_ENABLE_STB_TRUETYPE
|
IMGUI_API void ImFontAtlasBuildSetupFontLoader(ImFontAtlas* atlas, const ImFontLoader* font_loader);
|
||||||
IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype();
|
IMGUI_API void ImFontAtlasBuildUpdatePointers(ImFontAtlas* atlas);
|
||||||
|
IMGUI_API void ImFontAtlasBuildRenderBitmapFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char);
|
||||||
|
|
||||||
|
IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas);
|
||||||
|
IMGUI_API void ImFontAtlasBuildDestroy(ImFontAtlas* atlas);
|
||||||
|
|
||||||
|
IMGUI_API ImTextureData* ImFontAtlasBuildAddTexture(ImFontAtlas* atlas, int w, int h);
|
||||||
|
IMGUI_API void ImFontAtlasBuildRepackTexture(ImFontAtlas* atlas, int w, int h);
|
||||||
|
IMGUI_API void ImFontAtlasBuildGrowTexture(ImFontAtlas* atlas, int old_w = -1, int old_h = -1);
|
||||||
|
IMGUI_API void ImFontAtlasBuildCompactTexture(ImFontAtlas* atlas);
|
||||||
|
|
||||||
|
IMGUI_API bool ImFontAtlasBuildAddFont(ImFontAtlas* atlas, ImFontConfig* src);
|
||||||
|
IMGUI_API void ImFontAtlasBuildSetupFontSpecialGlyphs(ImFontAtlas* atlas, ImFontConfig* src);
|
||||||
|
IMGUI_API void ImFontAtlasBuildPreloadAllGlyphRanges(ImFontAtlas* atlas); // Legacy
|
||||||
|
IMGUI_API void ImFontAtlasBuildGetOversampleFactors(ImFontConfig* src, int* out_oversample_h, int* out_oversample_v);
|
||||||
|
|
||||||
|
IMGUI_API void ImFontAtlasPackInit(ImFontAtlas* atlas);
|
||||||
|
IMGUI_API ImFontAtlasRectId ImFontAtlasPackAddRect(ImFontAtlas* atlas, int w, int h);
|
||||||
|
IMGUI_API ImFontAtlasRect* ImFontAtlasPackGetRect(ImFontAtlas* atlas, ImFontAtlasRectId id);
|
||||||
|
|
||||||
|
IMGUI_API void ImFontAtlasAddDrawListSharedData(ImFontAtlas* atlas, ImDrawListSharedData* data);
|
||||||
|
IMGUI_API void ImFontAtlasRemoveDrawListSharedData(ImFontAtlas* atlas, ImDrawListSharedData* data);
|
||||||
|
IMGUI_API void ImFontAtlasUpdateDrawListsTextures(ImFontAtlas* atlas, ImTextureRef old_tex, ImTextureRef new_tex);
|
||||||
|
IMGUI_API void ImFontAtlasUpdateDrawListsSharedData(ImFontAtlas* atlas);
|
||||||
|
|
||||||
|
IMGUI_API void ImFontAtlasUpdateNewFrame(ImFontAtlas* atlas);
|
||||||
|
|
||||||
|
IMGUI_API void ImFontAtlasTextureBlockConvertAndPostProcess(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src, ImFontGlyph* glyph, unsigned char* src_pixels, ImTextureFormat src_fmt, int src_pitch, unsigned char* dst, ImTextureFormat dst_fmt, int dst_pitch, int w, int h);
|
||||||
|
IMGUI_API void ImFontAtlasTextureBlockConvert(const unsigned char* src_pixels, ImTextureFormat src_fmt, int src_pitch, unsigned char* dst_pixels, ImTextureFormat dst_fmt, int dst_pitch, int w, int h);
|
||||||
|
IMGUI_API void ImFontAtlasTextureBlockPostProcessMultiply(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src, ImFontGlyph* glyph, unsigned char* pixels, ImTextureFormat format, int w, int h, int pitch, float in_multiply_factor);
|
||||||
|
IMGUI_API void ImFontAtlasTextureBlockCopy(ImTextureData* src_tex, int src_x, int src_y, ImTextureData* dst_tex, int dst_x, int dst_y, int w, int h);
|
||||||
|
IMGUI_API void ImFontAtlasTextureBlockQueueUpload(ImFontAtlas* atlas, ImTextureData* tex, int x, int y, int w, int h);
|
||||||
|
|
||||||
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||||||
|
IMGUI_API void ImFontAtlasDebugLogTextureRequests(ImFontAtlas* atlas);
|
||||||
#endif
|
#endif
|
||||||
IMGUI_API void ImFontAtlasUpdateSourcesPointers(ImFontAtlas* atlas);
|
|
||||||
IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas);
|
|
||||||
IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src, float ascent, float descent);
|
|
||||||
IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque);
|
|
||||||
IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);
|
|
||||||
IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value);
|
|
||||||
IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value);
|
|
||||||
IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
|
|
||||||
IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
|
|
||||||
IMGUI_API void ImFontAtlasBuildGetOversampleFactors(const ImFontConfig* src, int* out_oversample_h, int* out_oversample_v);
|
|
||||||
|
|
||||||
IMGUI_API bool ImFontAtlasGetMouseCursorTexData(ImFontAtlas* atlas, ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
|
IMGUI_API bool ImFontAtlasGetMouseCursorTexData(ImFontAtlas* atlas, ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3984,7 +3984,8 @@ static ImVec2 InputTextCalcTextSize(ImGuiContext* ctx, const char* text_begin, c
|
||||||
if (c == '\r')
|
if (c == '\r')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const float char_width = ((int)c < font->IndexAdvanceX.Size ? font->IndexAdvanceX.Data[c] : font->FallbackAdvanceX) * scale;
|
// FIXME-NEWATLAS-V1: Measure perf, inline etc.
|
||||||
|
const float char_width = font->GetCharAdvance((ImWchar)c) * scale;// ((int)c < font->IndexAdvanceX.Size ? font->IndexAdvanceX.Data[c] : font->FallbackAdvanceX)* scale;
|
||||||
line_width += char_width;
|
line_width += char_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4322,7 +4323,7 @@ void ImGui::PushPasswordFont()
|
||||||
out_font->Ascent = in_font->Ascent;
|
out_font->Ascent = in_font->Ascent;
|
||||||
out_font->Descent = in_font->Descent;
|
out_font->Descent = in_font->Descent;
|
||||||
out_font->ContainerAtlas = in_font->ContainerAtlas;
|
out_font->ContainerAtlas = in_font->ContainerAtlas;
|
||||||
out_font->FallbackGlyph = glyph;
|
out_font->FallbackGlyphIndex = in_font->Glyphs.index_from_ptr(glyph); // FIXME: broken
|
||||||
out_font->FallbackAdvanceX = glyph->AdvanceX;
|
out_font->FallbackAdvanceX = glyph->AdvanceX;
|
||||||
IM_ASSERT(out_font->Glyphs.Size == 0 && out_font->IndexAdvanceX.Size == 0 && out_font->IndexLookup.Size == 0);
|
IM_ASSERT(out_font->Glyphs.Size == 0 && out_font->IndexAdvanceX.Size == 0 && out_font->IndexLookup.Size == 0);
|
||||||
PushFont(out_font);
|
PushFont(out_font);
|
||||||
|
|
|
||||||
|
|
@ -166,7 +166,7 @@ namespace
|
||||||
// NB: No ctor/dtor, explicitly call Init()/Shutdown()
|
// NB: No ctor/dtor, explicitly call Init()/Shutdown()
|
||||||
struct FreeTypeFont
|
struct FreeTypeFont
|
||||||
{
|
{
|
||||||
bool InitFont(FT_Library ft_library, const ImFontConfig& src, unsigned int extra_user_flags); // Initialize from an external data buffer. Doesn't copy data, and you must ensure it stays valid up to this object lifetime.
|
bool InitFont(FT_Library ft_library, ImFontConfig& src, unsigned int extra_user_flags); // Initialize from an external data buffer. Doesn't copy data, and you must ensure it stays valid up to this object lifetime.
|
||||||
void CloseFont();
|
void CloseFont();
|
||||||
void SetPixelHeight(int pixel_height); // Change font pixel size. All following calls to RasterizeGlyph() will use this size
|
void SetPixelHeight(int pixel_height); // Change font pixel size. All following calls to RasterizeGlyph() will use this size
|
||||||
const FT_Glyph_Metrics* LoadGlyph(uint32_t in_codepoint);
|
const FT_Glyph_Metrics* LoadGlyph(uint32_t in_codepoint);
|
||||||
|
|
@ -185,7 +185,7 @@ namespace
|
||||||
float InvRasterizationDensity;
|
float InvRasterizationDensity;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool FreeTypeFont::InitFont(FT_Library ft_library, const ImFontConfig& src, unsigned int extra_font_builder_flags)
|
bool FreeTypeFont::InitFont(FT_Library ft_library, ImFontConfig& src, unsigned int extra_font_builder_flags)
|
||||||
{
|
{
|
||||||
FT_Error error = FT_New_Memory_Face(ft_library, (uint8_t*)src.FontData, (uint32_t)src.FontDataSize, (uint32_t)src.FontNo, &Face);
|
FT_Error error = FT_New_Memory_Face(ft_library, (uint8_t*)src.FontData, (uint32_t)src.FontDataSize, (uint32_t)src.FontNo, &Face);
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue