added a way to delete images; images are now also deleted automatically in the finalizer

This commit is contained in:
Thomas Friedel 2018-02-07 11:27:46 +01:00
parent 9c1845211a
commit d3dc4cc3b7
2 changed files with 53 additions and 14 deletions

View file

@ -121,13 +121,23 @@ func (cv *Canvas) activate() {
activeCanvas = cv activeCanvas = cv
cv.Activate() cv.Activate()
} }
loop:
for {
select {
case f := <-glChan:
f()
default:
break loop
}
}
} }
var ( var (
gli GL gli GL
buf uint32 buf uint32
sr *solidShader sr *solidShader
tr *textureShader tr *textureShader
glChan = make(chan func())
) )
func LoadGL(glimpl GL) (err error) { func LoadGL(glimpl GL) (err error) {

View file

@ -5,40 +5,60 @@ import (
"errors" "errors"
"image" "image"
"io/ioutil" "io/ioutil"
"runtime"
"unsafe" "unsafe"
) )
type Image struct { type Image struct {
w, h int w, h int
tex uint32 tex uint32
deleted bool
} }
func LoadImage(src interface{}) (*Image, error) { func LoadImage(src interface{}) (*Image, error) {
var img *Image
var err error
switch v := src.(type) { switch v := src.(type) {
case *image.RGBA: case *image.RGBA:
return loadImageRGBA(v) img, err = loadImageRGBA(v)
if err != nil {
return nil, err
}
case *image.Gray: case *image.Gray:
return loadImageGray(v) img, err = loadImageGray(v)
if err != nil {
return nil, err
}
case image.Image: case image.Image:
return loadImageConverted(v) img, err = loadImageConverted(v)
if err != nil {
return nil, err
}
case string: case string:
data, err := ioutil.ReadFile(v) data, err := ioutil.ReadFile(v)
if err != nil { if err != nil {
return nil, err return nil, err
} }
img, _, err := image.Decode(bytes.NewReader(data)) srcImg, _, err := image.Decode(bytes.NewReader(data))
if err != nil { if err != nil {
return nil, err return nil, err
} }
return LoadImage(img) return LoadImage(srcImg)
case []byte: case []byte:
img, _, 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(img) return LoadImage(srcImg)
default:
return nil, errors.New("Unsupported source type")
} }
return nil, errors.New("Unsupported source type") runtime.SetFinalizer(img, func(img *Image) {
glChan <- func() {
gli.DeleteTextures(1, &img.tex)
}
})
return img, nil
} }
func loadImageRGBA(src *image.RGBA) (*Image, error) { func loadImageRGBA(src *image.RGBA) (*Image, error) {
@ -142,7 +162,16 @@ func (img *Image) W() int { return img.w }
func (img *Image) H() int { return img.h } func (img *Image) H() int { return img.h }
func (img *Image) Size() (int, int) { return img.w, img.h } func (img *Image) Size() (int, int) { return img.w, img.h }
func (img *Image) Delete() {
gli.DeleteTextures(1, &img.tex)
img.deleted = true
}
func (cv *Canvas) DrawImage(img *Image, coords ...float32) { func (cv *Canvas) DrawImage(img *Image, coords ...float32) {
if img.deleted {
return
}
var sx, sy, sw, sh, dx, dy, dw, dh float32 var sx, sy, sw, sh, dx, dy, dw, dh float32
sw, sh = float32(img.w), float32(img.h) sw, sh = float32(img.w), float32(img.h)
dw, dh = float32(img.w), float32(img.h) dw, dh = float32(img.w), float32(img.h)