|
@@ -77,6 +77,7 @@ CODE
|
|
// [SECTION] RENDER HELPERS
|
|
// [SECTION] RENDER HELPERS
|
|
// [SECTION] INITIALIZATION, SHUTDOWN
|
|
// [SECTION] INITIALIZATION, SHUTDOWN
|
|
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
|
|
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
|
|
|
|
+// [SECTION] FONTS
|
|
// [SECTION] ID STACK
|
|
// [SECTION] ID STACK
|
|
// [SECTION] INPUTS
|
|
// [SECTION] INPUTS
|
|
// [SECTION] ERROR CHECKING, STATE RECOVERY
|
|
// [SECTION] ERROR CHECKING, STATE RECOVERY
|
|
@@ -1277,6 +1278,7 @@ static void UpdateMouseWheel();
|
|
static void UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt);
|
|
static void UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt);
|
|
|
|
|
|
// Misc
|
|
// Misc
|
|
|
|
+static void UpdateFontsNewFrame();
|
|
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);
|
|
@@ -5393,10 +5395,8 @@ void ImGui::NewFrame()
|
|
|
|
|
|
// Setup current font and draw list shared data
|
|
// Setup current font and draw list shared data
|
|
// FIXME-VIEWPORT: the concept of a single ClipRectFullscreen is not ideal!
|
|
// FIXME-VIEWPORT: the concept of a single ClipRectFullscreen is not ideal!
|
|
- g.IO.Fonts->Locked = true;
|
|
|
|
SetupDrawListSharedData();
|
|
SetupDrawListSharedData();
|
|
- SetCurrentFont(GetDefaultFont());
|
|
|
|
- IM_ASSERT(g.Font->IsLoaded());
|
|
|
|
|
|
+ UpdateFontsNewFrame();
|
|
|
|
|
|
// 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)
|
|
@@ -8424,56 +8424,6 @@ void ImGui::End()
|
|
SetCurrentViewport(g.CurrentWindow, g.CurrentWindow->Viewport);
|
|
SetCurrentViewport(g.CurrentWindow, g.CurrentWindow->Viewport);
|
|
}
|
|
}
|
|
|
|
|
|
-// Important: this alone doesn't alter current ImDrawList state. This is called by PushFont/PopFont only.
|
|
|
|
-void ImGui::SetCurrentFont(ImFont* font)
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- IM_ASSERT(font && font->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
|
|
|
|
- IM_ASSERT(font->Scale > 0.0f);
|
|
|
|
- g.Font = font;
|
|
|
|
- g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale);
|
|
|
|
- g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f;
|
|
|
|
- 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.FontSize = g.FontSize;
|
|
|
|
- g.DrawListSharedData.FontScale = g.FontScale;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// Use ImDrawList::_SetTextureID(), making our shared g.FontStack[] authoritative against window-local ImDrawList.
|
|
|
|
-// - Whereas ImDrawList::PushTextureID()/PopTextureID() is not to be used across Begin() calls.
|
|
|
|
-// - Note that we don't propagate current texture id when e.g. Begin()-ing into a new window, we never really did...
|
|
|
|
-// - Some code paths never really fully worked with multiple atlas textures.
|
|
|
|
-// - 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
|
|
|
|
-// because we have a concrete need and a test bed for multiple atlas textures.
|
|
|
|
-void ImGui::PushFont(ImFont* font)
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- if (font == NULL)
|
|
|
|
- font = GetDefaultFont();
|
|
|
|
- g.FontStack.push_back(font);
|
|
|
|
- SetCurrentFont(font);
|
|
|
|
- g.CurrentWindow->DrawList->_SetTextureID(font->ContainerAtlas->TexID);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void ImGui::PopFont()
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- if (g.FontStack.Size <= 0)
|
|
|
|
- {
|
|
|
|
- IM_ASSERT_USER_ERROR(0, "Calling PopFont() too many times!");
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- g.FontStack.pop_back();
|
|
|
|
- ImFont* font = g.FontStack.Size == 0 ? GetDefaultFont() : g.FontStack.back();
|
|
|
|
- SetCurrentFont(font);
|
|
|
|
- g.CurrentWindow->DrawList->_SetTextureID(font->ContainerAtlas->TexID);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled)
|
|
void ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled)
|
|
{
|
|
{
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
@@ -9151,6 +9101,71 @@ bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max)
|
|
return window->ClipRect.Overlaps(ImRect(rect_min, rect_max));
|
|
return window->ClipRect.Overlaps(ImRect(rect_min, rect_max));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
|
+// [SECTION] FONTS
|
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
|
+// Most of the relevant font logic is in imgui_draw.cpp.
|
|
|
|
+// Those are high-level support functions.
|
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
|
+
|
|
|
|
+void ImGui::UpdateFontsNewFrame()
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ g.IO.Fonts->Locked = true;
|
|
|
|
+ SetCurrentFont(GetDefaultFont());
|
|
|
|
+ IM_ASSERT(g.Font->IsLoaded());
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// Important: this alone doesn't alter current ImDrawList state. This is called by PushFont/PopFont only.
|
|
|
|
+void ImGui::SetCurrentFont(ImFont* font)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ IM_ASSERT(font && font->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
|
|
|
|
+ IM_ASSERT(font->Scale > 0.0f);
|
|
|
|
+ g.Font = font;
|
|
|
|
+ g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale);
|
|
|
|
+ g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f;
|
|
|
|
+ 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.FontSize = g.FontSize;
|
|
|
|
+ g.DrawListSharedData.FontScale = g.FontScale;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// Use ImDrawList::_SetTextureID(), making our shared g.FontStack[] authoritative against window-local ImDrawList.
|
|
|
|
+// - Whereas ImDrawList::PushTextureID()/PopTextureID() is not to be used across Begin() calls.
|
|
|
|
+// - Note that we don't propagate current texture id when e.g. Begin()-ing into a new window, we never really did...
|
|
|
|
+// - Some code paths never really fully worked with multiple atlas textures.
|
|
|
|
+// - 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
|
|
|
|
+// because we have a concrete need and a test bed for multiple atlas textures.
|
|
|
|
+void ImGui::PushFont(ImFont* font)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ if (font == NULL)
|
|
|
|
+ font = GetDefaultFont();
|
|
|
|
+ g.FontStack.push_back(font);
|
|
|
|
+ SetCurrentFont(font);
|
|
|
|
+ g.CurrentWindow->DrawList->_SetTextureID(font->ContainerAtlas->TexID);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::PopFont()
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ if (g.FontStack.Size <= 0)
|
|
|
|
+ {
|
|
|
|
+ IM_ASSERT_USER_ERROR(0, "Calling PopFont() too many times!");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ g.FontStack.pop_back();
|
|
|
|
+ ImFont* font = g.FontStack.Size == 0 ? GetDefaultFont() : g.FontStack.back();
|
|
|
|
+ SetCurrentFont(font);
|
|
|
|
+ g.CurrentWindow->DrawList->_SetTextureID(font->ContainerAtlas->TexID);
|
|
|
|
+}
|
|
|
|
+
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// [SECTION] ID STACK
|
|
// [SECTION] ID STACK
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|