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.
43 lines
1.9 KiB
C++
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
|