added a way to delete images; images are now also deleted automatically in the finalizer
This commit is contained in:
parent
9c1845211a
commit
d3dc4cc3b7
2 changed files with 53 additions and 14 deletions
10
canvas.go
10
canvas.go
|
@ -121,6 +121,15 @@ func (cv *Canvas) activate() {
|
||||||
activeCanvas = cv
|
activeCanvas = cv
|
||||||
cv.Activate()
|
cv.Activate()
|
||||||
}
|
}
|
||||||
|
loop:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case f := <-glChan:
|
||||||
|
f()
|
||||||
|
default:
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -128,6 +137,7 @@ var (
|
||||||
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) {
|
||||||
|
|
45
images.go
45
images.go
|
@ -5,41 +5,61 @@ 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) {
|
||||||
img := &Image{w: src.Bounds().Dx(), h: src.Bounds().Dy()}
|
img := &Image{w: src.Bounds().Dx(), h: src.Bounds().Dy()}
|
||||||
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue