// DPI -> UI scale math for the host overlay, factored out of ImGui/window code so it's unit-testable // without a live window. The host is per-monitor-DPI-aware (see wWinMain), so GetSystemMetrics and // GetDpiForWindow report true pixels; we scale ImGui's font and style by this factor ourselves to keep // the overlay the same physical size -- and crisp -- across display scalings instead of letting Windows // bitmap-stretch a virtualized-resolution window. #pragma once #include #include // USER_DEFAULT_SCREEN_DPI (== 96, the 100%-scale baseline) namespace coop { // ImGui's built-in default font (ProggyClean) rasterizes at this pixel size at 100% scale. Named once // here so the DPI math scales from a single owned constant instead of a bare 13 sprinkled around. inline constexpr float kBaseFontPx = 13.0f; // Bound the derived scale: never shrink the overlay below 100% (a readability floor), and cap absurd // values so a bogus DPI report can't blow the font atlas up to an enormous texture. inline constexpr float kMinUiScale = 1.0f; inline constexpr float kMaxUiScale = 8.0f; // UI scale factor for a monitor DPI (dots per inch, as GetDpiForWindow / WM_DPICHANGED report it). // 96 DPI == 100% == 1.0; 144 DPI (150%) == 1.5. A zero/unknown DPI falls back to the 96 baseline so // callers never derive a zero-size font. inline float dpi_scale_from(unsigned dpi) { if (dpi == 0) { dpi = USER_DEFAULT_SCREEN_DPI; } const float scale = static_cast(dpi) / static_cast(USER_DEFAULT_SCREEN_DPI); return std::clamp(scale, kMinUiScale, kMaxUiScale); } // Default-font pixel size for a monitor DPI: the base size scaled so glyphs rasterize crisp at the // target size. Pair with ImGui::GetStyle().ScaleAllSizes(dpi_scale_from(dpi)) for spacing/padding. inline float scaled_font_px(unsigned dpi) { return kBaseFontPx * dpi_scale_from(dpi); } } // namespace coop