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" "image"
"unsafe" "unsafe"
"github.com/golang/freetype/truetype"
"github.com/tfriedel6/lm" "github.com/tfriedel6/lm"
) )
@ -358,6 +359,10 @@ func parseStyle(value ...interface{}) drawStyle {
case *Image: case *Image:
style.image = v style.image = v
return style return style
case string:
if img, ok := images[v]; ok {
style.image = img
}
} }
} }
c, ok := parseColor(value...) c, ok := parseColor(value...)
@ -428,8 +433,22 @@ func (cv *Canvas) SetLineWidth(width float32) {
} }
// SetFont sets the font and font size // SetFont sets the font and font size
func (cv *Canvas) SetFont(font *Font, size float32) { func (cv *Canvas) SetFont(font interface{}, size float32) {
cv.state.font = font 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 cv.state.fontSize = size
} }

View file

@ -17,7 +17,9 @@ type Image struct {
deleted bool 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 img *Image
var err error var err error
switch v := src.(type) { switch v := src.(type) {
@ -45,16 +47,19 @@ func LoadImage(src interface{}) (*Image, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return LoadImage(srcImg) return LoadImage(srcImg, name)
case []byte: case []byte:
srcImg, _, err := image.Decode(bytes.NewReader(v)) srcImg, _, err := image.Decode(bytes.NewReader(v))
if err != nil { if err != nil {
return nil, err return nil, err
} }
return LoadImage(srcImg) return LoadImage(srcImg, name)
default: default:
return nil, errors.New("Unsupported source type") return nil, errors.New("Unsupported source type")
} }
if name != "" {
images[name] = img
}
runtime.SetFinalizer(img, func(img *Image) { runtime.SetFinalizer(img, func(img *Image) {
glChan <- func() { glChan <- func() {
gli.DeleteTextures(1, &img.tex) gli.DeleteTextures(1, &img.tex)
@ -169,7 +174,26 @@ func (img *Image) Delete() {
img.deleted = true 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 { if img.deleted {
return 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]) step := 6 / fmath.Max(tr[0], tr[1])
if step > 0.8 { if step > 0.8 {
step = 0.8 step = 0.8
} else if step < 0.01 { } else if step < 0.05 {
step = 0.01 step = 0.05
} }
if anticlockwise { if anticlockwise {
for a := startAngle; a > endAngle; a -= step { 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 step := 6 / radius
if step > 0.8 { if step > 0.8 {
step = 0.8 step = 0.8
} else if step < 0.01 { } else if step < 0.05 {
step = 0.01 step = 0.05
} }
for angle := step; angle <= math.Pi*2+step; angle += step { for angle := step; angle <= math.Pi*2+step; angle += step {
s, c := fmath.Sincos(angle) s, c := fmath.Sincos(angle)

18
text.go
View file

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