sdlcanvas and glfwcanvas now scale automatically for hidpi

removed glfw 3.2 dependency
This commit is contained in:
Thomas Friedel 2020-01-25 16:56:32 +01:00
parent 04d4dab3ff
commit 6912878a8c
5 changed files with 22 additions and 11 deletions

View file

@ -33,6 +33,8 @@ type Window struct {
KeyUp func(scancode int, rn rune, name string) KeyUp func(scancode int, rn rune, name string)
KeyChar func(rn rune) KeyChar func(rn rune)
SizeChange func(w, h int) SizeChange func(w, h int)
scalex float64
scaley float64
} }
// CreateWindow creates a window using SDL and initializes the OpenGL context // CreateWindow creates a window using SDL and initializes the OpenGL context
@ -77,11 +79,11 @@ func CreateWindow(w, h int, title string) (*Window, *canvas.Canvas, error) {
wnd := &Window{ wnd := &Window{
Window: window, Window: window,
canvas: cv, canvas: cv,
scalex: float64(fbw) / float64(w),
scaley: float64(fbh) / float64(h),
} }
var mx, my int var mx, my int
sx := float64(fbw) / float64(w)
sy := float64(fbh) / float64(h)
window.SetMouseButtonCallback(func(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mod glfw.ModifierKey) { window.SetMouseButtonCallback(func(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mod glfw.ModifierKey) {
if action == glfw.Press && wnd.MouseDown != nil { if action == glfw.Press && wnd.MouseDown != nil {
@ -91,7 +93,7 @@ func CreateWindow(w, h int, title string) (*Window, *canvas.Canvas, error) {
} }
}) })
window.SetCursorPosCallback(func(w *glfw.Window, xpos, ypos float64) { window.SetCursorPosCallback(func(w *glfw.Window, xpos, ypos float64) {
mx, my = int(math.Round(xpos*sx)), int(math.Round(ypos*sy)) mx, my = int(math.Round(xpos*wnd.scalex)), int(math.Round(ypos*wnd.scaley))
if wnd.MouseMove != nil { if wnd.MouseMove != nil {
wnd.MouseMove(mx, my) wnd.MouseMove(mx, my)
} }
@ -115,8 +117,8 @@ func CreateWindow(w, h int, title string) (*Window, *canvas.Canvas, error) {
}) })
window.SetSizeCallback(func(w *glfw.Window, width, height int) { window.SetSizeCallback(func(w *glfw.Window, width, height int) {
fbw, fbh := window.GetFramebufferSize() fbw, fbh := window.GetFramebufferSize()
sx = float64(fbw) / float64(width) wnd.scalex = float64(fbw) / float64(width)
sy = float64(fbh) / float64(height) wnd.scaley = float64(fbh) / float64(height)
if wnd.SizeChange != nil { if wnd.SizeChange != nil {
wnd.SizeChange(width, height) wnd.SizeChange(width, height)
} else { } else {
@ -166,7 +168,14 @@ func (wnd *Window) FinishFrame() {
func (wnd *Window) MainLoop(run func()) { func (wnd *Window) MainLoop(run func()) {
for !wnd.close { for !wnd.close {
wnd.StartFrame() wnd.StartFrame()
if wnd.scalex != 1 || wnd.scaley != 1 {
wnd.canvas.Save()
wnd.canvas.Scale(wnd.scalex, wnd.scaley)
}
run() run()
if wnd.scalex != 1 || wnd.scaley != 1 {
wnd.canvas.Restore()
}
wnd.FinishFrame() wnd.FinishFrame()
} }
} }

View file

@ -1,6 +1,6 @@
package glfwcanvas package glfwcanvas
import "github.com/go-gl/glfw/v3.2/glfw" import "github.com/go-gl/glfw/v3.3/glfw"
var keyNameMap [347]string var keyNameMap [347]string
var keyRuneMap [347]rune var keyRuneMap [347]rune

1
go.mod
View file

@ -2,7 +2,6 @@ module github.com/tfriedel6/canvas
require ( require (
github.com/go-gl/gl v0.0.0-20181026044259-55b76b7df9d2 github.com/go-gl/gl v0.0.0-20181026044259-55b76b7df9d2
github.com/go-gl/glfw v0.0.0-20181014061658-691ee1b84c51
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
github.com/veandco/go-sdl2 v0.4.0 github.com/veandco/go-sdl2 v0.4.0

4
go.sum
View file

@ -1,13 +1,9 @@
github.com/go-gl/gl v0.0.0-20181026044259-55b76b7df9d2 h1:78Hza2KHn2PX1jdydQnffaU2A/xM0g3Nx1xmMdep9Gk= github.com/go-gl/gl v0.0.0-20181026044259-55b76b7df9d2 h1:78Hza2KHn2PX1jdydQnffaU2A/xM0g3Nx1xmMdep9Gk=
github.com/go-gl/gl v0.0.0-20181026044259-55b76b7df9d2/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= github.com/go-gl/gl v0.0.0-20181026044259-55b76b7df9d2/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
github.com/go-gl/glfw v0.0.0-20181014061658-691ee1b84c51 h1:elGSwayRx7uAsfA5PnVKeTHh+AVsUTmas0CkHOw/DSk=
github.com/go-gl/glfw v0.0.0-20181014061658-691ee1b84c51/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72 h1:b+9H1GAsx5RsjvDFLoS5zkNBzIQMuVKUYQDmxU3N5XE= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72 h1:b+9H1GAsx5RsjvDFLoS5zkNBzIQMuVKUYQDmxU3N5XE=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/veandco/go-sdl2 v0.3.3 h1:4/TirgB2MQ7oww3pM3Yfgf1YbChMlAQAmiCPe5koK0I=
github.com/veandco/go-sdl2 v0.3.3/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg=
github.com/veandco/go-sdl2 v0.4.0 h1:l9q6K+Dvpd/VlZdw2ufApKnWhAQqx9UL8Zrvbjtm3Lw= github.com/veandco/go-sdl2 v0.4.0 h1:l9q6K+Dvpd/VlZdw2ufApKnWhAQqx9UL8Zrvbjtm3Lw=
github.com/veandco/go-sdl2 v0.4.0/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg= github.com/veandco/go-sdl2 v0.4.0/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg=
golang.org/x/exp v0.0.0-20181106170214-d68db9428509 h1:k21GX33vzpH/syMF7TgrLxe8ILtvwbyuHtEO3ebR82E= golang.org/x/exp v0.0.0-20181106170214-d68db9428509 h1:k21GX33vzpH/syMF7TgrLxe8ILtvwbyuHtEO3ebR82E=

View file

@ -267,7 +267,14 @@ func (wnd *Window) MainLoop(run func()) {
} }
} }
if wnd.scalex != 1 || wnd.scaley != 1 {
wnd.canvas.Save()
wnd.canvas.Scale(wnd.scalex, wnd.scaley)
}
run() run()
if wnd.scalex != 1 || wnd.scaley != 1 {
wnd.canvas.Restore()
}
wnd.FinishFrame() wnd.FinishFrame()
} }