Merge pull request #114 from dbriemann/feature/video-modes

Adds video mode support and a community example for its usage.
This commit is contained in:
Michal Štrba 2018-05-04 22:58:59 +02:00 committed by GitHub
commit 345761edb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 155 additions and 0 deletions

View File

@ -0,0 +1,12 @@
# Video Modes
Just a demo on how to retrieve and set video modes with Pixel.
Made by [David Linus Briemann](https://github.com/dbriemann/).
## Controls
ESC - Quit
W - Toggle between fullscreen and windowed.
Switch video modes with the shown characters.

View File

@ -0,0 +1,116 @@
package main
import (
"fmt"
"github.com/faiface/pixel"
"github.com/faiface/pixel/pixelgl"
"github.com/faiface/pixel/text"
"golang.org/x/image/colornames"
"golang.org/x/image/font/basicfont"
)
type setting struct {
mode *pixelgl.VideoMode
monitor *pixelgl.Monitor
}
var (
texts []*text.Text
staticText *text.Text
settings []setting
activeSetting *setting
isFullScreen = false
)
func run() {
cfg := pixelgl.WindowConfig{
Title: "Video Modes",
Bounds: pixel.R(0, 0, 800, 600),
}
win, err := pixelgl.NewWindow(cfg)
if err != nil {
panic(err)
}
atlas := text.NewAtlas(basicfont.Face7x13, text.ASCII)
// Retrieve all monitors.
monitors := pixelgl.Monitors()
texts = make([]*text.Text, len(monitors))
key := byte('0')
for i := 0; i < len(monitors); i++ {
// Retrieve all video modes for a specific monitor.
modes := monitors[i].VideoModes()
for j := 0; j < len(modes); j++ {
settings = append(settings, setting{
monitor: monitors[i],
mode: &modes[j],
})
}
texts[i] = text.New(pixel.V(10+250*float64(i), -20), atlas)
texts[i].Color = colornames.Black
texts[i].WriteString(fmt.Sprintf("MONITOR %s\n\n", monitors[i].Name()))
for _, v := range modes {
texts[i].WriteString(fmt.Sprintf("(%c) %dx%d @ %d hz\n", key, v.Width, v.Height, v.RefreshRate))
key++
}
}
staticText = text.New(pixel.V(10, 30), atlas)
staticText.Color = colornames.Black
staticText.WriteString("ESC to exit\nW toggles windowed/fullscreen")
activeSetting = &settings[0]
for !win.Closed() {
win.Clear(colornames.Antiquewhite)
for _, txt := range texts {
txt.Draw(win, pixel.IM.Moved(pixel.V(0, win.Bounds().H())))
}
staticText.Draw(win, pixel.IM)
if win.JustPressed(pixelgl.KeyEscape) {
win.SetClosed(true)
}
if win.JustPressed(pixelgl.KeyW) {
if isFullScreen {
// Switch to windowed and backup the correct monitor.
win.SetMonitor(nil)
isFullScreen = false
} else {
// Switch to fullscreen.
win.SetMonitor(activeSetting.monitor)
isFullScreen = true
}
win.SetBounds(pixel.R(0, 0, float64(activeSetting.mode.Width), float64(activeSetting.mode.Height)))
}
input := win.Typed()
if len(input) > 0 {
key := int(input[0]) - 48
fmt.Println(key)
if key >= 0 && key < len(settings) {
activeSetting = &settings[key]
if isFullScreen {
win.SetMonitor(activeSetting.monitor)
} else {
win.SetMonitor(nil)
}
win.SetBounds(pixel.R(0, 0, float64(activeSetting.mode.Width), float64(activeSetting.mode.Height)))
}
}
win.Update()
}
}
func main() {
pixelgl.Run(run)
}

View File

@ -10,6 +10,17 @@ type Monitor struct {
monitor *glfw.Monitor
}
// VideoMode represents all properties of a video mode and is
// associated with a monitor if it is used in fullscreen mode.
type VideoMode struct {
// Width is the width of the vide mode in pixels.
Width int
// Height is the height of the video mode in pixels.
Height int
// RefreshRate holds the refresh rate of the associated monitor in Hz.
RefreshRate int
}
// PrimaryMonitor returns the main monitor (usually the one with the taskbar and stuff).
func PrimaryMonitor() *Monitor {
var monitor *glfw.Monitor
@ -95,3 +106,19 @@ func (m *Monitor) RefreshRate() (rate float64) {
rate = float64(mode.RefreshRate)
return
}
// VideoModes returns all available video modes for the monitor.
func (m *Monitor) VideoModes() (vmodes []VideoMode) {
var modes []*glfw.VidMode
mainthread.Call(func() {
modes = m.monitor.GetVideoModes()
})
for _, mode := range modes {
vmodes = append(vmodes, VideoMode{
Width: mode.Width,
Height: mode.Height,
RefreshRate: mode.RefreshRate,
})
}
return
}