diff --git a/Dalamud/Interface/Internal/InterfaceManager.cs b/Dalamud/Interface/Internal/InterfaceManager.cs index e5c4cbdb4..a58260c0a 100644 --- a/Dalamud/Interface/Internal/InterfaceManager.cs +++ b/Dalamud/Interface/Internal/InterfaceManager.cs @@ -64,7 +64,7 @@ namespace Dalamud.Interface.Internal private readonly SwapChainVtableResolver address; private RawDX11Scene? scene; - private GameFontHandle? axisFontHandle; + private GameFontHandle[] axisFontHandles; private bool overwriteAllNotoGlyphsWithAxis; // can't access imgui IO before first present call @@ -353,16 +353,17 @@ namespace Dalamud.Interface.Internal /// Requets handle. public SpecialGlyphRequest NewFontSizeRef(float size, List> ranges) { - var allContained = true; + var allContained = false; var fonts = ImGui.GetIO().Fonts.Fonts; ImFontPtr foundFont = null; unsafe { - for (int i = 0, i_ = fonts.Size; allContained && i < i_; i++) + for (int i = 0, i_ = fonts.Size; i < i_; i++) { if (!this.glyphRequests.Any(x => x.FontInternal.NativePtr == fonts[i].NativePtr)) continue; + allContained = true; foreach (var range in ranges) { if (!allContained) @@ -418,12 +419,16 @@ namespace Dalamud.Interface.Internal var configuration = Service.Get(); this.overwriteAllNotoGlyphsWithAxis = configuration.UseAxisFontsFromGame; - var currentFamilyAndSize = GameFontStyle.GetRecommendedFamilyAndSize(GameFontFamily.Axis, this.axisFontHandle?.Style.Size ?? 0f); - var expectedFamilyAndSize = GameFontStyle.GetRecommendedFamilyAndSize(GameFontFamily.Axis, DefaultFontSizePt * ImGui.GetIO().FontGlobalScale); - if (currentFamilyAndSize != expectedFamilyAndSize) + if (this.axisFontHandles == null) { - this.axisFontHandle?.Dispose(); - this.axisFontHandle = Service.Get().NewFontRef(new(expectedFamilyAndSize)); + this.axisFontHandles = new GameFontHandle[] + { + Service.Get().NewFontRef(new(GameFontFamilyAndSize.Axis96)), + Service.Get().NewFontRef(new(GameFontFamilyAndSize.Axis12)), + Service.Get().NewFontRef(new(GameFontFamilyAndSize.Axis14)), + Service.Get().NewFontRef(new(GameFontFamilyAndSize.Axis18)), + Service.Get().NewFontRef(new(GameFontFamilyAndSize.Axis36)), + }; } } @@ -659,7 +664,7 @@ namespace Dalamud.Interface.Internal List> codepointRanges = new(); codepointRanges.Add(Tuple.Create(Fallback1Codepoint, Fallback1Codepoint)); codepointRanges.Add(Tuple.Create(Fallback2Codepoint, Fallback2Codepoint)); - + // ImGui default ellipsis characters codepointRanges.Add(Tuple.Create(0x2026, 0x2026)); codepointRanges.Add(Tuple.Create(0x0085, 0x0085)); @@ -736,14 +741,24 @@ namespace Dalamud.Interface.Internal if (font.NativePtr == MonoFont.NativePtr) continue; - if (this.overwriteAllNotoGlyphsWithAxis) - GameFontManager.CopyGlyphsAcrossFonts(this.axisFontHandle?.ImFont, font, false, false); - else - GameFontManager.CopyGlyphsAcrossFonts(this.axisFontHandle?.ImFont, font, false, false, 0xE020, 0xE0DB); - } + var axisFont = this.axisFontHandles[^1]; + for (var i = this.axisFontHandles.Length - 2; i >= 0; i--) + { + if (this.axisFontHandles[i].Style.Size >= (font.FontSize - 1) * fontScale * 3 / 4) + axisFont = this.axisFontHandles[i]; + else + break; + } - // Fill missing glyphs in DefaultFont from Axis - GameFontManager.CopyGlyphsAcrossFonts(this.axisFontHandle?.ImFont, DefaultFont, true, false); + if (this.overwriteAllNotoGlyphsWithAxis) + GameFontManager.CopyGlyphsAcrossFonts(axisFont.ImFont, font, false, false); + else + GameFontManager.CopyGlyphsAcrossFonts(axisFont.ImFont, font, false, false, 0xE020, 0xE0DB); + + // Fill missing glyphs in DefaultFont from Axis + if (font.NativePtr == DefaultFont.NativePtr) + GameFontManager.CopyGlyphsAcrossFonts(axisFont.ImFont, DefaultFont, true, false); + } // Fill missing glyphs in MonoFont from DefaultFont GameFontManager.CopyGlyphsAcrossFonts(DefaultFont, MonoFont, true, false); diff --git a/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs b/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs index 7ea7b64dd..40bb29672 100644 --- a/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs +++ b/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs @@ -245,6 +245,7 @@ namespace Dalamud.Interface.Internal.Windows this.specialGlyphRequests[entry.Name] = fontHandle = Service.Get().NewFontSizeRef(TargetFontSizePx, entry.Name); ImGui.PushFont(fontHandle.Font); + ImGui.SetWindowFontScale(TargetFontSizePx / fontHandle.Size); var scale = ImGui.GetIO().FontGlobalScale;