|
@@ -5068,6 +5068,8 @@ static void InitViewportDrawData(ImGuiViewportP* viewport)
|
|
|
// - If the code here changes, may need to update code of functions like NextColumn() and PushColumnClipRect():
|
|
|
// some frequently called functions which to modify both channels and clipping simultaneously tend to use the
|
|
|
// more specialized SetWindowClipRectBeforeSetChannel() to avoid extraneous updates of underlying ImDrawCmds.
|
|
|
+// - This is analoguous to PushFont()/PopFont() in the sense that are a mixing a global stack and a window stack,
|
|
|
+// which in the case of ClipRect is not so problematic but tends to be more restrictive for fonts.
|
|
|
void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect)
|
|
|
{
|
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
@@ -7574,22 +7576,31 @@ void ImGui::SetCurrentFont(ImFont* font)
|
|
|
g.DrawListSharedData.FontScale = g.FontScale;
|
|
|
}
|
|
|
|
|
|
+// Use ImDrawList::_SetTextureID(), making our shared g.FontStack[] authorative 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)
|
|
|
+ if (font == NULL)
|
|
|
font = GetDefaultFont();
|
|
|
- SetCurrentFont(font);
|
|
|
g.FontStack.push_back(font);
|
|
|
- g.CurrentWindow->DrawList->PushTextureID(font->ContainerAtlas->TexID);
|
|
|
+ SetCurrentFont(font);
|
|
|
+ g.CurrentWindow->DrawList->_SetTextureID(font->ContainerAtlas->TexID);
|
|
|
}
|
|
|
|
|
|
void ImGui::PopFont()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- g.CurrentWindow->DrawList->PopTextureID();
|
|
|
+ IM_ASSERT(g.FontStack.Size > 0);
|
|
|
g.FontStack.pop_back();
|
|
|
- SetCurrentFont(g.FontStack.empty() ? GetDefaultFont() : g.FontStack.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)
|