From 78ea3ae74774c55071ac2497bbd00137210563c6 Mon Sep 17 00:00:00 2001 From: bloeys Date: Sat, 4 Feb 2023 05:21:48 +0400 Subject: [PATCH] Better DPI handling on windows (crispy text!) --- main.go | 43 +++++++++++++++++++++++++++++++++++++++- rsrc_windows_386.syso | Bin 0 -> 1524 bytes rsrc_windows_amd64.syso | Bin 0 -> 1524 bytes 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100755 rsrc_windows_386.syso create mode 100755 rsrc_windows_amd64.syso diff --git a/main.go b/main.go index 6550dd0..eeea15e 100755 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "runtime" "github.com/bloeys/gglm/gglm" "github.com/bloeys/nmage/assets" @@ -35,6 +36,9 @@ import ( const ( camSpeed = 15 mouseSensitivity = 0.5 + + unscaledWindowWidth = 1280 + unscaledWindowHeight = 720 ) var ( @@ -60,6 +64,8 @@ var ( debugDrawDepthBuffer bool skyboxCmap assets.Cubemap + + dpiScaling float32 ) type OurGame struct { @@ -113,7 +119,8 @@ func main() { } //Create window - window, err = engine.CreateOpenGLWindowCentered("nMage", 1280, 720, engine.WindowFlags_RESIZABLE, rend3dgl.NewRend3DGL()) + dpiScaling = getDpiScaling(unscaledWindowWidth, unscaledWindowHeight) + window, err = engine.CreateOpenGLWindowCentered("nMage", int32(unscaledWindowWidth*dpiScaling), int32(unscaledWindowHeight*dpiScaling), engine.WindowFlags_RESIZABLE, rend3dgl.NewRend3DGL()) if err != nil { logging.ErrLog.Fatalln("Failed to create window. Err: ", err) } @@ -147,6 +154,40 @@ func (g *OurGame) handleWindowEvents(e sdl.Event) { } } +func getDpiScaling(unscaledWindowWidth, unscaledWindowHeight int32) float32 { + + // Great read on DPI here: https://nlguillemot.wordpress.com/2016/12/11/high-dpi-rendering/ + + // The no-scaling DPI on different platforms (e.g. when scale=100% on windows) + var defaultDpi float32 = 96 + if runtime.GOOS == "windows" { + defaultDpi = 96 + } else if runtime.GOOS == "darwin" { + defaultDpi = 72 + } + + // Current DPI of the monitor + _, dpiHorizontal, _, err := sdl.GetDisplayDPI(0) + if err != nil { + dpiHorizontal = defaultDpi + fmt.Printf("Failed to get DPI with error '%s'. Using default DPI of '%f'\n", err.Error(), defaultDpi) + } + + // Scaling factor (e.g. will be 1.25 for 125% scaling on windows) + dpiScaling := dpiHorizontal / defaultDpi + + fmt.Printf( + "Default DPI=%f\nHorizontal DPI=%f\nDPI scaling=%f\nUnscaled window size (width, height)=(%d, %d)\nScaled window size (width, height)=(%d, %d)\n\n", + defaultDpi, + dpiHorizontal, + dpiScaling, + unscaledWindowWidth, unscaledWindowHeight, + int32(float32(unscaledWindowWidth)*dpiScaling), int32(float32(unscaledWindowHeight)*dpiScaling), + ) + + return dpiScaling +} + func (g *OurGame) Init() { var err error diff --git a/rsrc_windows_386.syso b/rsrc_windows_386.syso new file mode 100755 index 0000000000000000000000000000000000000000..c54ec02b16ecd2ca56afb247bbb7ebba2a20ac83 GIT binary patch literal 1524 zcmb7E*>2P@6io#P(J$aJ@*~2NJx!`ip{hWPpaQ97d3EBOHX^Zu?MxXVBtC-=+5s(^I~VmvFrOC$63EQ&P-`lT}s!tueev>>ovVQJd>ifTt-@ENN&rs}3V*xhyA0@ZqEnzCsd^ACty>K6L|K@f)ZecMzBB*j{SGClOYR0jCV6L-Pq zf;!zxtG$$FJ_IxlqnzeRS<)=x zew}ikv%Tz(05J>eFoTFDQJK>?jsse+ z7RIq3hDn`AS0NPMjkFZrR{qu%xTf=u6^+KMUo?Wt3w;8{VAJR+alCI1FPMT6@7$Pv z-}5$2GMk!YhVFPL#|tm?{lt5_jYbZP8ldn-u%FNcX#F1+g7jw#J*ZBK#z?gcAL^Ah z&|Mj{_-mtu_lrnxWY;z`I;_n?)N*v|FQYLfQbRQ;9DpfC1s?_+7~ro|vus*8gDJac zXWD)85f9p?e*sHq-PYdcgz1G?%J-m%J2Zz?g>lSD%~}oDn%kQ|Zki~(>+TfZ6xF(4 zIP@SmGR4N*VicIe4KYknj7+gWbz|q-ta>C8OlA}kSFjF0jz`9rZR$Tek{uR>9!X)8 zY&E&!sC4GrA8~snZB$Yns_MKkP?h(z-!{R sOq>nu>{5L*>sa$mP+KuviEXUASnw%89ByM3m+*)kw* z$3#S&*=teJ0-T0fIW+ORK$K}j{q?X>o9|eCQ+HwIF18avb>@^&3VjXmO}JrfG7!~44tM4&r=Mc1!(;r7J~Gqg&tHVMPsB|h7a^g z8|W?#TKu)q!uv&}*RpGy86DPUA!<3g^_S6@5~-mY6b`@?qk<0u4h-;Ds#!KIoWhh{ zv@`8K{)h){(?5qLv~FwfbHemOEaiJp#2uQ$s=_$tq-L##E6wdqAlFS4-c@%BZ;EQ& zFC2Oh9GPO{Z7~YW;f5HdC`P7Opt`a1ZB{)J2_`cNi7Qx#A1_A6m~HAmJCYq1g&s*^ zlx#J*FAXRtcK1R$-Y2~KDl2XS0gb--)l twoIH3?DRr?GwWFMO;B4gT#9Y1yIAlkK;%!$sdnAkVsgvcw;ZHg=O<*3y~h9m literal 0 HcmV?d00001