From 776897d3c9ae721dcb1dfa935162a67dbac7a69d Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 24 Jun 2025 15:24:09 +0200 Subject: [PATCH 1/5] Fonts: fixed PVS Studio false positive "expression 'cmd_count != draw_list->CmdBuffer.Size' is always false." (#8720, #8465) Amend 608dd96 --- imgui_draw.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imgui_draw.cpp b/imgui_draw.cpp index 8d56c0178..50b486cad 100644 --- a/imgui_draw.cpp +++ b/imgui_draw.cpp @@ -5705,7 +5705,7 @@ begin: } // Edge case: calling RenderText() with unloaded glyphs triggering texture change. It doesn't happen via ImGui:: calls because CalcTextSize() is always used. - if (cmd_count != draw_list->CmdBuffer.Size) + if (cmd_count != draw_list->CmdBuffer.Size) //-V547 { IM_ASSERT(draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ElemCount == 0); draw_list->CmdBuffer.pop_back(); From 04a5b9c2cf58c78b116e4dbcfe90f8cb1eec2a07 Mon Sep 17 00:00:00 2001 From: Geert Bleyen Date: Tue, 24 Jun 2025 16:13:44 +0200 Subject: [PATCH 2/5] Backends: SDL3: fixed pulling SDL_PROP_WINDOW_COCOA_WINDOW_POINTER into viewport->PlatformHandleRaw. (#8725, #8726) SDL_VIDEO_DRIVER_COCOA does not exist on SDL3. --- backends/imgui_impl_sdl3.cpp | 2 +- docs/CHANGELOG.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backends/imgui_impl_sdl3.cpp b/backends/imgui_impl_sdl3.cpp index 68fc4d746..9c0d6581c 100644 --- a/backends/imgui_impl_sdl3.cpp +++ b/backends/imgui_impl_sdl3.cpp @@ -458,7 +458,7 @@ static void ImGui_ImplSDL3_SetupPlatformHandles(ImGuiViewport* viewport, SDL_Win viewport->PlatformHandleRaw = nullptr; #if defined(_WIN32) && !defined(__WINRT__) viewport->PlatformHandleRaw = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, nullptr); -#elif defined(__APPLE__) && defined(SDL_VIDEO_DRIVER_COCOA) +#elif defined(__APPLE__) viewport->PlatformHandleRaw = SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, nullptr); #endif } diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 1f166b629..948b3d326 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -445,6 +445,8 @@ Other changes: memory ownership change. (#8530, #7801) [@Green-Sky] - Backends: SDL3: honor ImGuiPlatformImeData->WantTextInput as an alternative way to call SDL_StartTextInput(), without IME being necessarily visible. (#8584) + - Backends: SDL3: fixed pulling SDL_PROP_WINDOW_COCOA_WINDOW_POINTER into + viewport->PlatformHandleRaw. (#8725, #8726) [@eertbleyen] - Backends: OSX: ImGui_ImplOSX_HandleEvent() only process event for window containing our view. (#8644) [@BingoXuan] - Examples: From ca72eb059648efdba4617170005206d7d44539dc Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 24 Jun 2025 18:53:40 +0200 Subject: [PATCH 3/5] (Breaking) Fonts: obsolete PushFont() default parameter. --- docs/CHANGELOG.txt | 26 +++++++++++++++++--------- imgui.cpp | 20 ++++++++++---------- imgui.h | 30 ++++++++++++++++++------------ 3 files changed, 45 insertions(+), 31 deletions(-) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 948b3d326..d468b60ae 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -73,17 +73,25 @@ Breaking changes: Platform_GetWindowFramebufferScale() handler in 'docking' branch. - Fonts: **IMPORTANT** on Font Sizing: - Before 1.92, fonts were of a single size. They can now be dynamically sized. - - PushFont() API now has an optional size parameter. PushFontSize() was also added. - void PushFont(ImFont* font) --> void PushFont(ImFont* font, float size = 0.0f); - - Before 1.92: ImGui::PushFont() always used font "default" size specified in AddFont() call. - - Since 1.92: ImGui::PushFont() preserve the current font size which is a shared value. + - PushFont() API now has a REQUIRED size parameter. + void PushFont(ImFont* font) --> void PushFont(ImFont* font, float size); + - PushFont(font, 0.0f) // Change font and keep current size + - PushFont(NULL, 20.0f) // Keep font and change current size + - PushFont(font, 20.0f) // Change font and set size to 20.0f + - PushFont(font, style.FontSizeBase * 2.0f) // Change font and set size to be twice bigger than current size. + - PushFont(font, font->LegacySize) // Change font and set size to size passed to AddFontXXX() function. Same as pre-1.92 behavor, for fixed size fonts. - To use old behavior: - use 'ImGui::PushFont(font, font->LegacySize)' at call site (preferred). - or set 'ImFontConfig::Flags |= ImFontFlags_DefaultToLegacySize' in AddFont() call (not desirable as it requires e.g. all third-party code to be aware of it). + We intentionally didn't add a default parameter because it would make the long-term + transition more difficult. + - Kept inline redirection font. Will obsolete. + - External scale factors may be applied over the provided size. + This is why it is called 'FontSizeBase' in the style structure. - ImFont::FontSize was removed and does not make sense anymore. ImFont::LegacySize is the size passed to AddFont(). - - Removed support for PushFont(NULL) which was a shortcut for "default font". + - Removed support for old PushFont(NULL) which was a shortcut for "revert to default font". - Renamed/moved 'io.FontGlobalScale' to 'style.FontScaleMain'. - Fonts: **IMPORTANT** on Font Merging: - When searching for a glyph in multiple merged fonts: font inputs are now scanned in order @@ -182,8 +190,8 @@ Breaking changes: - renamed ImGuiFreeType::GetBuilderForFreeType() to ImGuiFreeType::GetFontLoader() - old: io.Fonts->FontBuilderIO = ImGuiFreeType::GetBuilderForFreeType() - new: io.Fonts.FontLoader = ImGuiFreeType::GetFontLoader(); -- DrawList: Fixed a regression from 1.91.1 where a Begin()/PushFont()/AddImage() sequence - would not restore the correct atlas Texture Identifier when the PushFont() call used +- DrawList: Fixed a regression from 1.91.1 where a Begin()/PushFont()/AddImage() sequence + would not restore the correct atlas Texture Identifier when the PushFont() call used a font from a different atlas. (#8694, caused by #3224, #3875, #6398, #7903) - DrawList: Renamed ImDrawList::PushTextureID()/PopTextureID() to PushTexture()/PopTexture(). - Fonts: (users of custom rectangles) @@ -332,7 +340,7 @@ Other changes: one in docking (they accidentally diverged). (#8554) - Windows: BeginChild(): fixed being unable to combine manual resize on one axis and automatic resize on the other axis. (#8690) - e.g. neither ImGuiChildFlags_ResizeX | ImGuiChildFlags_AutoResizeY + e.g. neither ImGuiChildFlags_ResizeX | ImGuiChildFlags_AutoResizeY or ImGuiChildFlags_ResizeY | ImGuiChildFlags_AutoResizeX worked before. - TreeNode: added experimental flags to draw tree hierarchy outlines linking parent and tree nodes: (#2920) @@ -357,7 +365,7 @@ Other changes: - TreeNode: fixed incorrect clipping of arrow/bullet when using ImGuiTreeNodeFlags_SpanAllColumns. - InputText: fixed cursor positioning issue using up/down keys near end of lines while editing non-ASCII text. (Regression from 1.91.2) (#8635, #7925) -- InputText: fixed a buffer overrun that could happen when using dynamically resizing +- InputText: fixed a buffer overrun that could happen when using dynamically resizing buffers (e.g. imgui_stdlib.cpp for std::string, or ImGuiInputTextFlags_CallbackRezize) and programmatically making an insertion. (#8689) [@ocornut, @m9710797] - Tables: fixed TableHeader() eager vertical clipping of text which may be noticeable diff --git a/imgui.cpp b/imgui.cpp index 1234bce4d..44a613ac9 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -470,10 +470,11 @@ CODE - With a legacy backend (< 1.92): Instead of setting io.FontGlobalScale = 1.0f/N -> set ImFontCfg::RasterizerDensity = N. This already worked before, but is now pretty much required. - With a new backend (1.92+): This should be all automatic. FramebufferScale is automatically used to set current font RasterizerDensity. FramebufferScale is a per-viewport property provided by backend through the Platform_GetWindowFramebufferScale() handler in 'docking' branch. - Fonts: **IMPORTANT** on Font Sizing: Before 1.92, fonts were of a single size. They can now be dynamically sized. - - PushFont() API now has an optional size parameter. PushFontSize() was also added. - - Before 1.92: ImGui::PushFont() always used font "default" size specified in AddFont() call. - - Since 1.92: ImGui::PushFont() preserve the current font size which is a shared value. + - PushFont() API now has a REQUIRED size parameter. PushFontSize() was also added. + - Before 1.92: PushFont() always used font "default" size specified in AddFont() call. It is equivalent to calling PushFont(font, font->LegacySize). + - Since 1.92: PushFont(font, 0.0f) preserve the current font size which is a shared value. - To use old behavior: (A) use 'ImGui::PushFont(font, font->LegacySize)' at call site (preferred). (B) Set 'ImFontConfig::Flags |= ImFontFlags_DefaultToLegacySize' in AddFont() call (not desirable as it requires e.g. third-party code to be aware of it). + - Kept inline single parameter function. Will obsolete. - Fonts: **IMPORTANT** on Font Merging: - When searching for a glyph in multiple merged fonts: font inputs are now scanned in orderfor the first font input which the desired glyph. This is technically a different behavior than before! - e.g. If you are merging fonts you may have glyphs that you expected to load from Font Source 2 which exists in Font Source 1. After the update and when using a new backend, those glyphs may now loaded from Font Source 1! @@ -8901,23 +8902,22 @@ void ImGui::SetFontRasterizerDensity(float rasterizer_density) UpdateCurrentFontSize(0.0f); } -// If you want to scale an existing font size: -// - Use e.g. PushFontSize(style.FontSizeBase * factor) (= value before external scale factors applied). -// - Do NOT use PushFontSize(GetFontSize() * factor) (= value after external scale factors applied). +// If you want to scale an existing font size! Read comments in imgui.h! void ImGui::PushFont(ImFont* font, float font_size_base) { ImGuiContext& g = *GImGui; //if (font == NULL) // Before 1.92 (June 2025), PushFont(NULL) == PushFont(GetDefaultFont()) // font = g.Font; IM_ASSERT(font != NULL); + IM_ASSERT(font_size_base >= 0.0f); g.FontStack.push_back({ g.Font, g.FontSizeBase, g.FontSize }); - if (font_size_base <= 0.0f) + if (font_size_base == 0.0f) { if (font->Flags & ImFontFlags_DefaultToLegacySize) - font_size_base = font->LegacySize; // Legacy: use AddFont() specified font size. Same as doing PushFont(font, font->LegacySize) + font_size_base = font->LegacySize; // Legacy: use AddFont() specified font size. Same as doing PushFont(font, font->LegacySize) else - font_size_base = g.FontSizeBase; // Keep current font size + font_size_base = g.FontSizeBase; // Keep current font size } SetCurrentFont(font, font_size_base, 0.0f); } @@ -16909,7 +16909,7 @@ void ImGui::DebugNodeFont(ImFont* font) Indent(); if (cfg->ShowFontPreview) { - PushFont(font); + PushFont(font, 0.0f); Text("The quick brown fox jumps over the lazy dog"); PopFont(); } diff --git a/imgui.h b/imgui.h index b73089d66..2c361c4cf 100644 --- a/imgui.h +++ b/imgui.h @@ -493,21 +493,26 @@ namespace ImGui IMGUI_API void SetScrollFromPosY(float local_y, float center_y_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position. // Parameters stacks (font) + // - PushFont(font, 0.0f) // Change font and keep current size + // - PushFont(NULL, 20.0f) // Keep font and change current size + // - PushFont(font, 20.0f) // Change font and set size to 20.0f + // - PushFont(font, style.FontSizeBase * 2.0f) // Change font and set size to be twice bigger than current size. + // - PushFont(font, font->LegacySize) // Change font and set size to size passed to AddFontXXX() function. Same as pre-1.92 behavior. // *IMPORTANT* before 1.92, fonts had a single size. They can now be dynamically be adjusted. - // - Before 1.92: PushFont() always used font default size. - // - Since 1.92: PushFont() preserve the current shared font size. - // - To use old behavior (single size font, size specified in AddFontXXX() call: - // - Use 'PushFont(font, font->LegacySize)' at call site - // - Or set 'ImFontConfig::Flags |= ImFontFlags_DefaultToLegacySize' before calling AddFont(), and then 'PushFont(font)' will use this size. - // *IMPORTANT* External scale factors are applied over the provided value. If you want to scale an existing font size: - // - OK: PushFontSize(style.FontSizeBase * 2.0f) (= value before external scale factors applied). - // - NOT OK: PushFontSize(GetFontSize() * 2.0f) (= value after external scale factors applied. External scale factors are: 'style.FontScaleMain * style.FontScaleDpi * maybe more'). - IMGUI_API void PushFont(ImFont* font, float font_size_base = -1); // use NULL as a shortcut to push default font. Use <0.0f to keep current font size. + // - In 1.92 we have REMOVED the single parameter version of PushFont() because it seems like the easiest way to provide an error-proof transition. + // - PushFont(font) before 1.92 = PushFont(font, font->LegacySize) after 1.92 // Use default font size as passed to AddFontXXX() function. + // *IMPORTANT* external scale factors are applied over the provided size. If you want to scale an *existing* font size: + // - External scale factors are: 'style.FontScaleMain * style.FontScaleDpi' and maybe more. + // - CORRECT: PushFont(NULL, style.FontSizeBase) // use current unscaled size == does nothing + // - CORRECT: PushFont(NULL, style.FontSizeBase * 2.0f) // use current unscaled size x2 == make text twice bigger + // - INCORRECT: PushFont(NULL, GetFontSize()) // INCORRECT! use size after external factors applied == EXTERNAL SCALING FACTORS WILL APPLY TWICE! + // - INCORRECT: PushFont(NULL, GetFontSize() * 2.0f) // INCORRECT! use size after external factors applied == EXTERNAL SCALING FACTORS WILL APPLY TWICE! + IMGUI_API void PushFont(ImFont* font, float font_size_base_unscaled); // Use NULL as a shortcut to keep current font. Use 0.0f to keep current size. IMGUI_API void PopFont(); IMGUI_API void PushFontSize(float font_size_base); // keep current font, change its size. Final 'font size = font_size_base * external scale factors'. IMGUI_API void PopFontSize(); IMGUI_API ImFont* GetFont(); // get current font - IMGUI_API float GetFontSize(); // get current font size (= height in pixels) AFTER external scale factors applied. *IMPORTANT* DO NOT PASS THIS VALUE TO PushFont()/PushFontSize()! Use ImGui::GetStyle().FontSizeBase to get value before external scale factors. + IMGUI_API float GetFontSize(); // get current scaled font size (= height in pixels). AFTER external scale factors applied. *IMPORTANT* DO NOT PASS THIS VALUE TO PushFont()/PushFontSize()! Use ImGui::GetStyle().FontSizeBase to get value before external scale factors. IMGUI_API ImFontBaked* GetFontBaked(); // get current font bound at current size // == GetFont()->GetFontBaked(GetFontSize()) // Parameters stacks (shared) @@ -3756,7 +3761,7 @@ struct ImFontBaked enum ImFontFlags_ { ImFontFlags_None = 0, - ImFontFlags_DefaultToLegacySize = 1 << 0, // Legacy compatibility: make PushFont() calls without explicit size use font->LegacySize instead of current font size. + ImFontFlags_DefaultToLegacySize = 1 << 0, // Legacy compatibility: make `PushFont(font)` == `PushFont(font, font->LegacySize)`. Otherwise by default/shared current font size is used. ImFontFlags_NoLoadError = 1 << 1, // Disable throwing an error/assert when calling AddFontXXX() with missing file/data. Calling code is expected to check AddFontXXX() return value. ImFontFlags_NoLoadGlyphs = 1 << 2, // [Internal] Disable loading new glyphs. ImFontFlags_LockBakedSizes = 1 << 3, // [Internal] Disable loading new baked sizes, disable garbage collecting current ones. e.g. if you want to lock a font to a single size. Important: if you use this to preload given sizes, consider the possibility of multiple font density used on Retina display. @@ -3949,7 +3954,8 @@ struct ImGuiPlatformImeData namespace ImGui { // OBSOLETED in 1.92.0 (from June 2025) - IMGUI_API void SetWindowFontScale(float scale); // Set font scale factor for current window. Prefer using PushFontSize(style.FontSizeBase * factor) or use style.FontScaleMain to scale all windows. + static inline void PushFont(ImFont* font) { IM_ASSERT(font != NULL); PushFont(font, font->LegacySize); } + IMGUI_API void SetWindowFontScale(float scale); // Set font scale factor for current window. Prefer using PushFont(NULL, style.FontSizeBase * factor) or use style.FontScaleMain to scale all windows. // OBSOLETED in 1.91.9 (from February 2025) IMGUI_API void Image(ImTextureRef tex_ref, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col); // <-- 'border_col' was removed in favor of ImGuiCol_ImageBorder. If you use 'tint_col', use ImageWithBg() instead. // OBSOLETED in 1.91.0 (from July 2024) From 97e0d59619f0796f64be2a4b35383e422c93b5d6 Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 24 Jun 2025 19:01:59 +0200 Subject: [PATCH 4/5] (Breaking) Fonts: removed PushFontSize(), PopFontSize(). --- docs/CHANGELOG.txt | 3 +-- docs/FAQ.md | 2 +- docs/FONTS.md | 2 +- docs/TODO.txt | 1 - imgui.cpp | 21 ++++----------------- imgui.h | 6 ++---- imgui_draw.cpp | 2 +- imgui_internal.h | 2 +- 8 files changed, 11 insertions(+), 28 deletions(-) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index d468b60ae..7c7daf79d 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -150,7 +150,7 @@ Breaking changes: ImGuiContext to create one, you'll need to call ImFontAtlasUpdateNewFrame() yourself. An assert will trigger if you don't. - Fonts: obsolete ImGui::SetWindowFontScale() which is not useful anymore. Prefer using - PushFontSize(style.FontSizeBase * factor) or to manipulate other scaling factors. + PushFont(NULL, style.FontSizeBase * factor) or to manipulate other scaling factors. - Fonts: obsoleted ImFont::Scale which is not useful anymore. - Fonts: changed ImFont::CalcWordWrapPositionA() to ImFont::CalcWordWrapPosition(): - old: const char* CalcWordWrapPositionA(float scale, const char* text, ....); @@ -270,7 +270,6 @@ Other changes: - Fonts: ImFontAtlas::AddFontXXX() functions may be called at any time during the frame. - Fonts: ImFontAtlas::AddFontXXX() can fail more gracefully if error handling is configured to not assert (this will be better exposed via future font flags). -- Fonts: added ImGui::PushFontSize()/PopFontSize() functions. - Fonts: added style.FontScaleBase scaling factor (previously called io.FontGlobalScale). - Fonts: added style.FontScaleDpi scaling factor. This is designed to be be changed on per-monitor/per-viewport basis, which `io.ConfigDpiScaleFonts` does automatically. diff --git a/docs/FAQ.md b/docs/FAQ.md index 0e8ba5c77..ad35d5451 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -572,7 +572,7 @@ Since 1.92 (June 2025) fonts may be dynamically used at any size. To change font size: ```cpp -ImGui::PushFontSize(42.0f); +ImGui::PushFont(NULL, 42.0f); ``` To change font and font size: ```cpp diff --git a/docs/FONTS.md b/docs/FONTS.md index 8edfbd33b..5a43b4403 100644 --- a/docs/FONTS.md +++ b/docs/FONTS.md @@ -77,7 +77,7 @@ Future versions of Dear ImGui should solve this problem. v1.92 introduces a newer, dynamic font system. It requires backend to support the `ImGuiBackendFlags_HasTextures` feature: - Users of icons, Asian and non-English languages do not need to pre-build all glyphs ahead of time. Saving on loading time, memory, and also reducing issues with missing glyphs. Specifying glyph ranges is not needed anymore. -- `PushFontSize()` may be used anytime to change font size. +- `PushFont(NULL, new_size)` may be used anytime to change font size. - Packing custom rectangles is more convenient as pixels may be written to immediately. - Any update to fonts previously required backend specific calls to re-upload the texture, and said calls were not portable across backends. It is now possible to scale fonts etc. in a way that doesn't require you to make backend-specific calls. - It is possible to plug a custom loader/backend to any font source. diff --git a/docs/TODO.txt b/docs/TODO.txt index 8866d04fb..03deffb2d 100644 --- a/docs/TODO.txt +++ b/docs/TODO.txt @@ -249,7 +249,6 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - font: finish CustomRectRegister() to allow mapping Unicode codepoint to custom texture data - font: remove ID from CustomRect registration, it seems unnecessary! - font: make it easier to submit own bitmap font (same texture, another texture?). (#2127, #2575) - - font: PushFontSize API (#1018) - font: MemoryTTF taking ownership confusing/not obvious, maybe default should be opposite? - font: storing MinAdvanceX per font would allow us to skip calculating line width (under a threshold of character count) in loops looking for block width - font/demo: add tools to show glyphs used by a text blob, display U16 value, list missing glyphs. diff --git a/imgui.cpp b/imgui.cpp index 44a613ac9..eceda68f1 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -470,7 +470,7 @@ CODE - With a legacy backend (< 1.92): Instead of setting io.FontGlobalScale = 1.0f/N -> set ImFontCfg::RasterizerDensity = N. This already worked before, but is now pretty much required. - With a new backend (1.92+): This should be all automatic. FramebufferScale is automatically used to set current font RasterizerDensity. FramebufferScale is a per-viewport property provided by backend through the Platform_GetWindowFramebufferScale() handler in 'docking' branch. - Fonts: **IMPORTANT** on Font Sizing: Before 1.92, fonts were of a single size. They can now be dynamically sized. - - PushFont() API now has a REQUIRED size parameter. PushFontSize() was also added. + - PushFont() API now has a REQUIRED size parameter. - Before 1.92: PushFont() always used font "default" size specified in AddFont() call. It is equivalent to calling PushFont(font, font->LegacySize). - Since 1.92: PushFont(font, 0.0f) preserve the current font size which is a shared value. - To use old behavior: (A) use 'ImGui::PushFont(font, font->LegacySize)' at call site (preferred). (B) Set 'ImFontConfig::Flags |= ImFontFlags_DefaultToLegacySize' in AddFont() call (not desirable as it requires e.g. third-party code to be aware of it). @@ -498,7 +498,7 @@ CODE - Fonts: specifying glyph ranges is now unnecessary. The value of ImFontConfig::GlyphRanges[] is only useful for legacy backends. All GetGlyphRangesXXXX() functions are now marked obsolete: GetGlyphRangesDefault(), GetGlyphRangesGreek(), GetGlyphRangesKorean(), GetGlyphRangesJapanese(), GetGlyphRangesChineseSimplifiedCommon(), GetGlyphRangesChineseFull(), GetGlyphRangesCyrillic(), GetGlyphRangesThai(), GetGlyphRangesVietnamese(). - Fonts: removed ImFontAtlas::TexDesiredWidth to enforce a texture width. (#327) - Fonts: if you create and manage ImFontAtlas instances yourself (instead of relying on ImGuiContext to create one, you'll need to call ImFontAtlasUpdateNewFrame() yourself. An assert will trigger if you don't. - - Fonts: obsolete ImGui::SetWindowFontScale() which is not useful anymore. Prefer using 'PushFontSize(style.FontSizeBase * factor)' or to manipulate other scaling factors. + - Fonts: obsolete ImGui::SetWindowFontScale() which is not useful anymore. Prefer using 'PushFont(NULL, style.FontSizeBase * factor)' or to manipulate other scaling factors. - Fonts: obsoleted ImFont::Scale which is not useful anymore. - Fonts: generally reworked Internals of ImFontAtlas and ImFont. While in theory a vast majority of users shouldn't be affected, some use cases or extensions might be. Among other things: - ImDrawCmd::TextureId has been changed to ImDrawCmd::TexRef. @@ -8551,7 +8551,7 @@ ImVec2 ImGui::GetFontTexUvWhitePixel() return GImGui->DrawListSharedData.TexUvWhitePixel; } -// Prefer using PushFontSize(style.FontSizeBase * factor), or use style.FontScaleMain to scale all windows. +// Prefer using PushFont(NULL, style.FontSizeBase * factor), or use style.FontScaleMain to scale all windows. #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS void ImGui::SetWindowFontScale(float scale) { @@ -8732,8 +8732,6 @@ bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) // - SetFontRasterizerDensity() [Internal] // - PushFont() // - PopFont() -// - PushFontSize() -// - PopFontSize() //----------------------------------------------------------------------------- void ImGui::UpdateFontsNewFrame() @@ -8854,7 +8852,7 @@ void ImGui::UpdateCurrentFontSize(float restore_font_size_after_scaling) if (g.CurrentTable == NULL || g.CurrentTable->CurrentColumn != -1) // See 8465#issuecomment-2951509561. Ideally the SkipItems=true in tables would be amended with extra data. return; - // Restoring is pretty much only used by PopFont()/PopFontSize() + // Restoring is pretty much only used by PopFont() float final_size = (restore_font_size_after_scaling > 0.0f) ? restore_font_size_after_scaling : 0.0f; if (final_size == 0.0f) { @@ -8935,17 +8933,6 @@ void ImGui::PopFont() g.FontStack.pop_back(); } -void ImGui::PushFontSize(float font_size_base) -{ - ImGuiContext& g = *GImGui; - PushFont(g.Font, font_size_base); -} - -void ImGui::PopFontSize() -{ - PopFont(); -} - //----------------------------------------------------------------------------- // [SECTION] ID STACK //----------------------------------------------------------------------------- diff --git a/imgui.h b/imgui.h index 2c361c4cf..1022ea3fa 100644 --- a/imgui.h +++ b/imgui.h @@ -509,10 +509,8 @@ namespace ImGui // - INCORRECT: PushFont(NULL, GetFontSize() * 2.0f) // INCORRECT! use size after external factors applied == EXTERNAL SCALING FACTORS WILL APPLY TWICE! IMGUI_API void PushFont(ImFont* font, float font_size_base_unscaled); // Use NULL as a shortcut to keep current font. Use 0.0f to keep current size. IMGUI_API void PopFont(); - IMGUI_API void PushFontSize(float font_size_base); // keep current font, change its size. Final 'font size = font_size_base * external scale factors'. - IMGUI_API void PopFontSize(); IMGUI_API ImFont* GetFont(); // get current font - IMGUI_API float GetFontSize(); // get current scaled font size (= height in pixels). AFTER external scale factors applied. *IMPORTANT* DO NOT PASS THIS VALUE TO PushFont()/PushFontSize()! Use ImGui::GetStyle().FontSizeBase to get value before external scale factors. + IMGUI_API float GetFontSize(); // get current scaled font size (= height in pixels). AFTER external scale factors applied. *IMPORTANT* DO NOT PASS THIS VALUE TO PushFont()! Use ImGui::GetStyle().FontSizeBase to get value before external scale factors. IMGUI_API ImFontBaked* GetFontBaked(); // get current font bound at current size // == GetFont()->GetFontBaked(GetFontSize()) // Parameters stacks (shared) @@ -2232,7 +2230,7 @@ IM_MSVC_RUNTIME_CHECKS_RESTORE struct ImGuiStyle { // ImGui::GetFontSize() == FontSizeBase * (FontScaleMain * FontScaleDpi * other_scaling_factors) - float FontSizeBase; // Current base font size before external scaling factors are applied. Use PushFont()/PushFontSize() to modify. Use ImGui::GetFontSize() to obtain scaled value. + float FontSizeBase; // Current base font size before external scaling factors are applied. Use PushFont(NULL, size) to modify. Use ImGui::GetFontSize() to obtain scaled value. float FontScaleMain; // Main scale factor. May be set by application once, or exposed to end-user. float FontScaleDpi; // Additional scale factor from viewport/monitor contents scale. When io.ConfigDpiScaleFonts is enabled, this is automatically overwritten when changing monitor DPI. diff --git a/imgui_draw.cpp b/imgui_draw.cpp index 50b486cad..e540f9e6a 100644 --- a/imgui_draw.cpp +++ b/imgui_draw.cpp @@ -5227,7 +5227,7 @@ ImFontBaked* ImFont::GetFontBaked(float size, float density) ImFontBaked* baked = LastBaked; // Round font size - // - ImGui::PushFontSize() will already round, but other paths calling GetFontBaked() directly also needs it (e.g. ImFontAtlasBuildPreloadAllGlyphRanges) + // - ImGui::PushFont() will already round, but other paths calling GetFontBaked() directly also needs it (e.g. ImFontAtlasBuildPreloadAllGlyphRanges) size = ImGui::GetRoundedFontSize(size); if (density < 0.0f) diff --git a/imgui_internal.h b/imgui_internal.h index b2656a734..a01a974f5 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -2143,7 +2143,7 @@ struct ImGuiContext ImFont* Font; // Currently bound font. (== FontStack.back().Font) ImFontBaked* FontBaked; // Currently bound font at currently bound size. (== Font->GetFontBaked(FontSize)) float FontSize; // Currently bound font size == line height (== FontSizeBase + externals scales applied in the UpdateCurrentFontSize() function). - float FontSizeBase; // Font size before scaling == style.FontSizeBase == value passed to PushFont() / PushFontSize() when specified. + float FontSizeBase; // Font size before scaling == style.FontSizeBase == value passed to PushFont() when specified. float FontBakedScale; // == FontBaked->Size / FontSize. Scale factor over baked size. Rarely used nowadays, very often == 1.0f. float FontRasterizerDensity; // Current font density. Used by all calls to GetFontBaked(). float CurrentDpiScale; // Current window/viewport DpiScale == CurrentViewport->DpiScale From 89b5a2c3d50e4ca6a0a88378f096d7d05ff1c962 Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 24 Jun 2025 19:06:46 +0200 Subject: [PATCH 5/5] (Breaking) Fonts: removed ImFontFlags_DefaultToLegacySize. --- docs/CHANGELOG.txt | 7 +------ imgui.cpp | 9 ++------- imgui.h | 1 - 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 7c7daf79d..01694d50a 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -80,10 +80,7 @@ Breaking changes: - PushFont(font, 20.0f) // Change font and set size to 20.0f - PushFont(font, style.FontSizeBase * 2.0f) // Change font and set size to be twice bigger than current size. - PushFont(font, font->LegacySize) // Change font and set size to size passed to AddFontXXX() function. Same as pre-1.92 behavor, for fixed size fonts. - - To use old behavior: - - use 'ImGui::PushFont(font, font->LegacySize)' at call site (preferred). - - or set 'ImFontConfig::Flags |= ImFontFlags_DefaultToLegacySize' in AddFont() call - (not desirable as it requires e.g. all third-party code to be aware of it). + - To use old behavior use 'ImGui::PushFont(font, font->LegacySize)' at call site. We intentionally didn't add a default parameter because it would make the long-term transition more difficult. - Kept inline redirection font. Will obsolete. @@ -290,8 +287,6 @@ Other changes: window and other locations). - Fonts: added ImFontFlags (currently needs to be passed through ImFontConfig until we revamp font loading API): - - ImFontFlags_DefaultToLegacySize: for legacy compatibility: make PushFont() calls - without explicit size use font->LegacySize instead of current font size. - ImFontFlags_NoLoadError: disable erroring/assert when calling AddFontXXX() with missing file/data. Calling code is expected to check AddFontXXX() return value. - ImFontFlags_NoLoadGlyphs: disable loading new glyphs. diff --git a/imgui.cpp b/imgui.cpp index eceda68f1..e36d0a9e2 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -473,7 +473,7 @@ CODE - PushFont() API now has a REQUIRED size parameter. - Before 1.92: PushFont() always used font "default" size specified in AddFont() call. It is equivalent to calling PushFont(font, font->LegacySize). - Since 1.92: PushFont(font, 0.0f) preserve the current font size which is a shared value. - - To use old behavior: (A) use 'ImGui::PushFont(font, font->LegacySize)' at call site (preferred). (B) Set 'ImFontConfig::Flags |= ImFontFlags_DefaultToLegacySize' in AddFont() call (not desirable as it requires e.g. third-party code to be aware of it). + - To use old behavior: use 'ImGui::PushFont(font, font->LegacySize)' at call site. - Kept inline single parameter function. Will obsolete. - Fonts: **IMPORTANT** on Font Merging: - When searching for a glyph in multiple merged fonts: font inputs are now scanned in orderfor the first font input which the desired glyph. This is technically a different behavior than before! @@ -8911,12 +8911,7 @@ void ImGui::PushFont(ImFont* font, float font_size_base) g.FontStack.push_back({ g.Font, g.FontSizeBase, g.FontSize }); if (font_size_base == 0.0f) - { - if (font->Flags & ImFontFlags_DefaultToLegacySize) - font_size_base = font->LegacySize; // Legacy: use AddFont() specified font size. Same as doing PushFont(font, font->LegacySize) - else - font_size_base = g.FontSizeBase; // Keep current font size - } + font_size_base = g.FontSizeBase; // Keep current font size SetCurrentFont(font, font_size_base, 0.0f); } diff --git a/imgui.h b/imgui.h index 1022ea3fa..44ab90869 100644 --- a/imgui.h +++ b/imgui.h @@ -3759,7 +3759,6 @@ struct ImFontBaked enum ImFontFlags_ { ImFontFlags_None = 0, - ImFontFlags_DefaultToLegacySize = 1 << 0, // Legacy compatibility: make `PushFont(font)` == `PushFont(font, font->LegacySize)`. Otherwise by default/shared current font size is used. ImFontFlags_NoLoadError = 1 << 1, // Disable throwing an error/assert when calling AddFontXXX() with missing file/data. Calling code is expected to check AddFontXXX() return value. ImFontFlags_NoLoadGlyphs = 1 << 2, // [Internal] Disable loading new glyphs. ImFontFlags_LockBakedSizes = 1 << 3, // [Internal] Disable loading new baked sizes, disable garbage collecting current ones. e.g. if you want to lock a font to a single size. Important: if you use this to preload given sizes, consider the possibility of multiple font density used on Retina display.