forked from fyne-io/fyne
/
driver.go
64 lines (49 loc) · 1.41 KB
/
driver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Package gl provides a full Fyne render implementation using system OpenGL libraries.
// This supports Windows, Mac OS X and Linux using the gl and glfw packages from go-gl.
package gl
import (
"sync"
"fyne.io/fyne"
"github.com/goki/freetype/truetype"
"golang.org/x/image/font"
)
var canvasMutex sync.RWMutex
var canvases = make(map[fyne.CanvasObject]fyne.Canvas)
const textDPI = 78
type gLDriver struct {
windows []fyne.Window
done chan interface{}
}
func (d *gLDriver) CanvasForObject(obj fyne.CanvasObject) fyne.Canvas {
canvasMutex.RLock()
defer canvasMutex.RUnlock()
return canvases[obj]
}
func loadFont(data fyne.Resource) *truetype.Font {
loaded, err := truetype.Parse(data.Content())
if err != nil {
fyne.LogError("font load error", err)
}
return loaded
}
func (d *gLDriver) RenderedTextSize(text string, size int, style fyne.TextStyle) fyne.Size {
var opts truetype.Options
opts.Size = float64(size)
opts.DPI = textDPI
face := cachedFontFace(style, &opts)
advance := font.MeasureString(face, text)
return fyne.NewSize(advance.Ceil(), face.Metrics().Height.Ceil())
}
func (d *gLDriver) Quit() {
close(d.done)
}
func (d *gLDriver) Run() {
go svgCacheMonitorTheme()
d.runGL()
}
// NewGLDriver sets up a new Driver instance implemented using the GLFW Go library and OpenGL bindings.
func NewGLDriver() fyne.Driver {
driver := new(gLDriver)
driver.done = make(chan interface{})
return driver
}