Files
BlackMark 30eccf749d Apply clang-format across the whole tree
Run clang-format (the repo's .clang-format: LLVM base, 120 cols, tabs,
Allman functions) over every source file so the tree is formatter-clean.
Whitespace only -- no behavior change; full x64 + x86 suites pass.

Also set SortIncludes: false in .clang-format. Windows include order is
load-bearing (windows.h must precede tlhelp32.h / mmreg.h / xinput.h /
dinput.h; winsock2.h must precede windows.h), and the default
alphabetical sort reorders tlhelp32.h ahead of windows.h -- a build
break. Leaving order alone keeps the manual, correct grouping.
2026-07-12 11:52:53 +02:00

43 lines
1.9 KiB
C++

// 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 <algorithm>
#include <windows.h> // 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<float>(dpi) / static_cast<float>(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