Browse Source

Fonts: removed size rounding in AddFont() which breaks relative sizing of merged fonts (8502)

# Conflicts:
#	imgui.cpp
ocornut 4 months ago
parent
commit
168b97c291
3 changed files with 13 additions and 7 deletions
  1. 6 1
      imgui.cpp
  2. 6 6
      imgui_draw.cpp
  3. 1 0
      imgui_internal.h

+ 6 - 1
imgui.cpp

@@ -8628,7 +8628,12 @@ void ImGui::UpdateCurrentFontSize()
     final_size *= g.Font->Scale;
     if (ImGuiWindow* window = g.CurrentWindow)
         final_size *= window->FontWindowScale;
-    final_size = ImMax(1.0f, IM_ROUND(final_size));
+
+    // Round font size
+    // - We started rounding in 1.90 WIP (18991) as our layout system currently doesn't support non-rounded font size well yet.
+    // - We may support it better later and remove this rounding.
+    final_size = GetRoundedFontSize(final_size);
+    final_size = ImMax(1.0f, final_size);
 
     g.FontSize = final_size;
     g.FontBaked = (g.Font != NULL) ? g.Font->GetFontBaked(g.FontSize) : NULL;

+ 6 - 6
imgui_draw.cpp

@@ -3024,6 +3024,7 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
     }
 
     // Sanity check
+    // We don't round cfg.SizePixels yet as relative size of merged fonts are used afterwards.
     if (font_cfg->GlyphExcludeRanges != NULL)
     {
         int size = 0;
@@ -3039,12 +3040,6 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
     }
     IM_ASSERT(font_cfg->FontLoaderData == NULL);
 
-    // Round font size
-    // - We started rounding in 1.90 WIP (18991) as our layout system currently doesn't support non-rounded font size well yet.
-    // - Note that using io.FontGlobalScale or SetWindowFontScale(), with are legacy-ish, partially supported features, can still lead to unrounded sizes.
-    // - We may support it better later and remove this rounding.
-    new_font_cfg.SizePixels = ImTrunc(new_font_cfg.SizePixels);
-
     // Pointers to Sources are otherwise dangling
     ImFontAtlasBuildUpdatePointers(this);
     if (!ImFontAtlasBuildAddFont(this, &new_font_cfg))
@@ -5164,6 +5159,11 @@ ImGuiID ImFontAtlasBakedGetId(ImGuiID font_id, float baked_size)
 ImFontBaked* ImFont::GetFontBaked(float size)
 {
     ImFontBaked* baked = LastBaked;
+
+    // Round font size
+    // - ImGui::PushFontSize() will already round, but other paths calling GetFontBaked() directly also needs it (e.g. ImFontAtlasBuildPreloadAllGlyphRanges)
+    size = ImGui::GetRoundedFontSize(size);
+
     if (baked && baked->Size == size)
         return baked;
 

+ 1 - 0
imgui_internal.h

@@ -3111,6 +3111,7 @@ namespace ImGui
     // Fonts, drawing
     IMGUI_API void          SetCurrentFont(ImFont* font, float font_size);
     IMGUI_API void          UpdateCurrentFontSize();
+    inline float            GetRoundedFontSize(float size) { return IM_ROUND(size); }
     inline ImFont*          GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
     IMGUI_API void          PushPasswordFont();
     IMGUI_API void          PopPasswordFont();