removed explicit deleting of gradients

removed finalizers from backends, instead using a finalizer as an emergency catch on the frontend
This commit is contained in:
Thomas Friedel 2020-03-21 13:03:56 +01:00
parent 7faf3cdcc6
commit f47d24543d
5 changed files with 13 additions and 80 deletions

View file

@ -28,8 +28,6 @@ type GLContext struct {
imageBuf []byte
ptsBuf []float32
glChan chan func()
}
// NewGLContext creates all the necessary GL resources,
@ -37,7 +35,6 @@ type GLContext struct {
func NewGLContext() (*GLContext, error) {
ctx := &GLContext{
ptsBuf: make([]float32, 0, 4096),
glChan: make(chan func()),
}
err := gl.Init()
@ -231,18 +228,6 @@ func (b *GoGLBackend) activate() {
activeContext = b
b.activateFn()
}
b.runGLQueue()
}
func (b *GoGLBackend) runGLQueue() {
for {
select {
case f := <-b.glChan:
f()
default:
return
}
}
}
// Delete deletes the offscreen texture. After calling this

View file

@ -1,8 +1,6 @@
package goglbackend
import (
"runtime"
"github.com/tfriedel6/canvas/backend/backendbase"
"github.com/tfriedel6/canvas/backend/goglbackend/gl"
)
@ -42,11 +40,6 @@ func (b *GoGLBackend) LoadLinearGradient(data backendbase.Gradient) backendbase.
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
lg.load(data)
runtime.SetFinalizer(lg, func(lg *LinearGradient) {
b.glChan <- func() {
gl.DeleteTextures(1, &lg.tex)
}
})
return lg
}
@ -64,11 +57,6 @@ func (b *GoGLBackend) LoadRadialGradient(data backendbase.Gradient) backendbase.
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
rg.load(data)
runtime.SetFinalizer(rg, func(rg *RadialGradient) {
b.glChan <- func() {
gl.DeleteTextures(1, &rg.tex)
}
})
return rg
}

View file

@ -1,8 +1,6 @@
package xmobilebackend
import (
"runtime"
"github.com/tfriedel6/canvas/backend/backendbase"
"golang.org/x/mobile/gl"
)
@ -42,11 +40,6 @@ func (b *XMobileBackend) LoadLinearGradient(data backendbase.Gradient) backendba
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
lg.load(data)
runtime.SetFinalizer(lg, func(lg *LinearGradient) {
b.glChan <- func() {
b.glctx.DeleteTexture(lg.tex)
}
})
return lg
}
@ -64,11 +57,6 @@ func (b *XMobileBackend) LoadRadialGradient(data backendbase.Gradient) backendba
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
rg.load(data)
runtime.SetFinalizer(rg, func(rg *RadialGradient) {
b.glChan <- func() {
b.glctx.DeleteTexture(rg.tex)
}
})
return rg
}

View file

@ -32,8 +32,6 @@ type GLContext struct {
imageBuf []byte
ptsBuf []float32
glChan chan func()
}
// NewGLContext creates all the necessary GL resources,
@ -43,7 +41,6 @@ func NewGLContext(glctx gl.Context) (*GLContext, error) {
glctx: glctx,
ptsBuf: make([]float32, 0, 4096),
glChan: make(chan func()),
}
var err error
@ -224,18 +221,6 @@ func (b *XMobileBackend) activate() {
activeContext = b
b.activateFn()
}
b.runGLQueue()
}
func (b *XMobileBackend) runGLQueue() {
for {
select {
case f := <-b.glChan:
f()
default:
return
}
}
}
// Delete deletes the offscreen texture. After calling this

View file

@ -2,6 +2,7 @@ package canvas
import (
"image/color"
"runtime"
"github.com/tfriedel6/canvas/backend/backendbase"
)
@ -15,7 +16,6 @@ type LinearGradient struct {
from, to vec
created bool
loaded bool
deleted bool
opaque bool
grad backendbase.LinearGradient
data backendbase.Gradient
@ -32,7 +32,6 @@ type RadialGradient struct {
radTo float64
created bool
loaded bool
deleted bool
opaque bool
grad backendbase.RadialGradient
data backendbase.Gradient
@ -42,13 +41,17 @@ type RadialGradient struct {
// the coordinates from where to where the gradient
// will apply on the canvas
func (cv *Canvas) CreateLinearGradient(x0, y0, x1, y1 float64) *LinearGradient {
return &LinearGradient{
lg := &LinearGradient{
cv: cv,
opaque: true,
from: vec{x0, y0},
to: vec{x1, y1},
data: make(backendbase.Gradient, 0, 20),
}
runtime.SetFinalizer(lg, func(*LinearGradient) {
lg.grad.Delete()
})
return lg
}
// CreateRadialGradient creates a new radial gradient with
@ -56,7 +59,7 @@ func (cv *Canvas) CreateLinearGradient(x0, y0, x1, y1 float64) *LinearGradient {
// gradient will apply from the first to the second
// circle
func (cv *Canvas) CreateRadialGradient(x0, y0, r0, x1, y1, r1 float64) *RadialGradient {
return &RadialGradient{
rg := &RadialGradient{
cv: cv,
opaque: true,
from: vec{x0, y0},
@ -65,30 +68,14 @@ func (cv *Canvas) CreateRadialGradient(x0, y0, r0, x1, y1, r1 float64) *RadialGr
radTo: r1,
data: make(backendbase.Gradient, 0, 20),
}
}
// Delete explicitly deletes the gradient
func (lg *LinearGradient) Delete() {
if lg.deleted {
return
}
lg.grad.Delete()
lg.grad = nil
lg.deleted = true
}
// Delete explicitly deletes the gradient
func (rg *RadialGradient) Delete() {
if rg.deleted {
return
}
runtime.SetFinalizer(rg, func(*RadialGradient) {
rg.grad.Delete()
rg.grad = nil
rg.deleted = true
})
return rg
}
func (lg *LinearGradient) load() {
if lg.loaded || len(lg.data) < 1 || lg.deleted {
if lg.loaded || len(lg.data) < 1 {
return
}
@ -102,7 +89,7 @@ func (lg *LinearGradient) load() {
}
func (rg *RadialGradient) load() {
if rg.loaded || len(rg.data) < 1 || rg.deleted {
if rg.loaded || len(rg.data) < 1 {
return
}