From 4520637aed532efbb1d1bb1ab699032c6284a8e0 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 11 Jul 2025 14:54:54 +0200 Subject: [PATCH] fix: Pixel perfect font not scaling correctly --- lib/libimhex/source/api/imhex_api.cpp | 13 +++++++--- main/gui/source/window/window.cpp | 4 +-- plugins/fonts/source/library_fonts.cpp | 36 ++++++++++++++------------ 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/lib/libimhex/source/api/imhex_api.cpp b/lib/libimhex/source/api/imhex_api.cpp index 1cf26c427..6d94e132b 100644 --- a/lib/libimhex/source/api/imhex_api.cpp +++ b/lib/libimhex/source/api/imhex_api.cpp @@ -1030,11 +1030,16 @@ namespace hex { void Font::push(float size) const { auto font = getFont(m_fontName); - if (size <= 0.0F && font != nullptr) { - size = font->LegacySize; - } + if (font != nullptr) { + if (size <= 0.0F) { + size = font->LegacySize; + } - size *= System::getGlobalScale(); + if (!font->Sources[0]->PixelSnapH) + size *= System::getGlobalScale(); + else + size *= std::floor(System::getGlobalScale()); + } ImGui::PushFont(font, size); } diff --git a/main/gui/source/window/window.cpp b/main/gui/source/window/window.cpp index 38f652c81..0da16b789 100644 --- a/main/gui/source/window/window.cpp +++ b/main/gui/source/window/window.cpp @@ -1283,8 +1283,8 @@ namespace hex { io.UserData = &m_imguiCustomData; - auto scale = ImHexApi::System::getGlobalScale(); - style.ScaleAllSizes(scale); + style.ScaleAllSizes(ImHexApi::System::getGlobalScale()); + auto scale = ImHexApi::System::getNativeScale(); io.DisplayFramebufferScale = ImVec2(scale, scale); style.WindowMenuButtonPosition = ImGuiDir_None; diff --git a/plugins/fonts/source/library_fonts.cpp b/plugins/fonts/source/library_fonts.cpp index 8276de8a7..43c809c1d 100644 --- a/plugins/fonts/source/library_fonts.cpp +++ b/plugins/fonts/source/library_fonts.cpp @@ -36,19 +36,21 @@ namespace hex::fonts { std::memcpy(config.Name, name.get().c_str(), std::min(name.get().size(), sizeof(config.Name) - 1)); - if (settings.isBold()) - config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Bold; - if (settings.isItalic()) - config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Oblique; - switch (settings.getAntialiasingType()) { - case AntialiasingType::None: - config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Monochrome | ImGuiFreeTypeLoaderFlags_MonoHinting; - break; - case AntialiasingType::Grayscale: - break; - case AntialiasingType::Lcd: - config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_SubPixel; - break; + if (!settings.isPixelPerfectFont()) { + if (settings.isBold()) + config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Bold; + if (settings.isItalic()) + config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Oblique; + switch (settings.getAntialiasingType()) { + case AntialiasingType::None: + config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Monochrome | ImGuiFreeTypeLoaderFlags_MonoHinting; + break; + case AntialiasingType::Grayscale: + break; + case AntialiasingType::Lcd: + config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_SubPixel; + break; + } } { @@ -57,9 +59,11 @@ namespace hex::fonts { *imguiFont = atlas->AddFontFromFileTTF(fontPath.string().c_str(), 0.0F, &config); if (*imguiFont == nullptr) { - if (settings.isPixelPerfectFont()) - *imguiFont = atlas->AddFontDefault(); - else { + if (settings.isPixelPerfectFont()) { + auto defaultConfig = config; + defaultConfig.SizePixels = ImHexApi::Fonts::DefaultFontSize; + *imguiFont = atlas->AddFontDefault(&defaultConfig); + } else { static auto jetbrainsFont = romfs::get("fonts/JetBrainsMono.ttf"); *imguiFont = atlas->AddFontFromMemoryTTF(const_cast(jetbrainsFont.data()), jetbrainsFont.size(), 0.0F, &config);