images and fonts can now be optionally named for later access; DrawImage and SetFont can now accept file names directly and will cache using the path

This commit is contained in:
Thomas Friedel 2018-02-15 10:12:32 +01:00
parent 59033ea55b
commit 5175b1ba73
4 changed files with 66 additions and 15 deletions

View file

@ -5,6 +5,7 @@ import (
"image"
"unsafe"
"github.com/golang/freetype/truetype"
"github.com/tfriedel6/lm"
)
@ -358,6 +359,10 @@ func parseStyle(value ...interface{}) drawStyle {
case *Image:
style.image = v
return style
case string:
if img, ok := images[v]; ok {
style.image = img
}
}
}
c, ok := parseColor(value...)
@ -428,8 +433,22 @@ func (cv *Canvas) SetLineWidth(width float32) {
}
// SetFont sets the font and font size
func (cv *Canvas) SetFont(font *Font, size float32) {
cv.state.font = font
func (cv *Canvas) SetFont(font interface{}, size float32) {
switch v := font.(type) {
case *Font:
cv.state.font = v
case *truetype.Font:
cv.state.font = &Font{font: v}
case string:
if f, ok := fonts[v]; ok {
cv.state.font = f
} else {
f, err := LoadFont(v, v)
if err == nil {
cv.state.font = f
}
}
}
cv.state.fontSize = size
}

View file

@ -17,7 +17,9 @@ type Image struct {
deleted bool
}
func LoadImage(src interface{}) (*Image, error) {
var images = make(map[string]*Image)
func LoadImage(src interface{}, name string) (*Image, error) {
var img *Image
var err error
switch v := src.(type) {
@ -45,16 +47,19 @@ func LoadImage(src interface{}) (*Image, error) {
if err != nil {
return nil, err
}
return LoadImage(srcImg)
return LoadImage(srcImg, name)
case []byte:
srcImg, _, err := image.Decode(bytes.NewReader(v))
if err != nil {
return nil, err
}
return LoadImage(srcImg)
return LoadImage(srcImg, name)
default:
return nil, errors.New("Unsupported source type")
}
if name != "" {
images[name] = img
}
runtime.SetFinalizer(img, func(img *Image) {
glChan <- func() {
gli.DeleteTextures(1, &img.tex)
@ -169,7 +174,26 @@ func (img *Image) Delete() {
img.deleted = true
}
func (cv *Canvas) DrawImage(img *Image, coords ...float32) {
func (cv *Canvas) DrawImage(image interface{}, coords ...float32) {
var img *Image
switch v := image.(type) {
case *Image:
img = v
case string:
if i, ok := images[v]; ok {
img = i
} else {
i, err := LoadImage(v, v)
if err == nil {
img = i
}
}
}
if img == nil {
return
}
if img.deleted {
return
}

View file

@ -118,8 +118,8 @@ func (cv *Canvas) Arc(x, y, radius, startAngle, endAngle float32, anticlockwise
step := 6 / fmath.Max(tr[0], tr[1])
if step > 0.8 {
step = 0.8
} else if step < 0.01 {
step = 0.01
} else if step < 0.05 {
step = 0.05
}
if anticlockwise {
for a := startAngle; a > endAngle; a -= step {
@ -316,8 +316,8 @@ func (cv *Canvas) addCircleTris(center lm.Vec2, radius float32, tris []float32)
step := 6 / radius
if step > 0.8 {
step = 0.8
} else if step < 0.01 {
step = 0.01
} else if step < 0.05 {
step = 0.05
}
for angle := step; angle <= math.Pi*2+step; angle += step {
s, c := fmath.Sincos(angle)

18
text.go
View file

@ -18,10 +18,13 @@ type Font struct {
font *truetype.Font
}
func LoadFont(src interface{}) (*Font, error) {
var fonts = make(map[string]*Font)
func LoadFont(src interface{}, name string) (*Font, error) {
var f *Font
switch v := src.(type) {
case *truetype.Font:
return &Font{font: v}, nil
f = &Font{font: v}
case string:
data, err := ioutil.ReadFile(v)
if err != nil {
@ -31,15 +34,20 @@ func LoadFont(src interface{}) (*Font, error) {
if err != nil {
return nil, err
}
return &Font{font: font}, nil
f = &Font{font: font}
case []byte:
font, err := freetype.ParseFont(v)
if err != nil {
return nil, err
}
return &Font{font: font}, nil
}
f = &Font{font: font}
default:
return nil, errors.New("Unsupported source type")
}
if name != "" {
fonts[name] = f
}
return f, nil
}
func (cv *Canvas) FillText(str string, x, y float32) {