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:
parent
7faf3cdcc6
commit
f47d24543d
5 changed files with 13 additions and 80 deletions
|
@ -28,8 +28,6 @@ type GLContext struct {
|
||||||
imageBuf []byte
|
imageBuf []byte
|
||||||
|
|
||||||
ptsBuf []float32
|
ptsBuf []float32
|
||||||
|
|
||||||
glChan chan func()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGLContext creates all the necessary GL resources,
|
// NewGLContext creates all the necessary GL resources,
|
||||||
|
@ -37,7 +35,6 @@ type GLContext struct {
|
||||||
func NewGLContext() (*GLContext, error) {
|
func NewGLContext() (*GLContext, error) {
|
||||||
ctx := &GLContext{
|
ctx := &GLContext{
|
||||||
ptsBuf: make([]float32, 0, 4096),
|
ptsBuf: make([]float32, 0, 4096),
|
||||||
glChan: make(chan func()),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err := gl.Init()
|
err := gl.Init()
|
||||||
|
@ -231,18 +228,6 @@ func (b *GoGLBackend) activate() {
|
||||||
activeContext = b
|
activeContext = b
|
||||||
b.activateFn()
|
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
|
// Delete deletes the offscreen texture. After calling this
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package goglbackend
|
package goglbackend
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime"
|
|
||||||
|
|
||||||
"github.com/tfriedel6/canvas/backend/backendbase"
|
"github.com/tfriedel6/canvas/backend/backendbase"
|
||||||
"github.com/tfriedel6/canvas/backend/goglbackend/gl"
|
"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_S, gl.CLAMP_TO_EDGE)
|
||||||
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
|
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
|
||||||
lg.load(data)
|
lg.load(data)
|
||||||
runtime.SetFinalizer(lg, func(lg *LinearGradient) {
|
|
||||||
b.glChan <- func() {
|
|
||||||
gl.DeleteTextures(1, &lg.tex)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return lg
|
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_S, gl.CLAMP_TO_EDGE)
|
||||||
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
|
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
|
||||||
rg.load(data)
|
rg.load(data)
|
||||||
runtime.SetFinalizer(rg, func(rg *RadialGradient) {
|
|
||||||
b.glChan <- func() {
|
|
||||||
gl.DeleteTextures(1, &rg.tex)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return rg
|
return rg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package xmobilebackend
|
package xmobilebackend
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime"
|
|
||||||
|
|
||||||
"github.com/tfriedel6/canvas/backend/backendbase"
|
"github.com/tfriedel6/canvas/backend/backendbase"
|
||||||
"golang.org/x/mobile/gl"
|
"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_S, gl.CLAMP_TO_EDGE)
|
||||||
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
|
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
|
||||||
lg.load(data)
|
lg.load(data)
|
||||||
runtime.SetFinalizer(lg, func(lg *LinearGradient) {
|
|
||||||
b.glChan <- func() {
|
|
||||||
b.glctx.DeleteTexture(lg.tex)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return lg
|
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_S, gl.CLAMP_TO_EDGE)
|
||||||
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
|
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
|
||||||
rg.load(data)
|
rg.load(data)
|
||||||
runtime.SetFinalizer(rg, func(rg *RadialGradient) {
|
|
||||||
b.glChan <- func() {
|
|
||||||
b.glctx.DeleteTexture(rg.tex)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return rg
|
return rg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,6 @@ type GLContext struct {
|
||||||
imageBuf []byte
|
imageBuf []byte
|
||||||
|
|
||||||
ptsBuf []float32
|
ptsBuf []float32
|
||||||
|
|
||||||
glChan chan func()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGLContext creates all the necessary GL resources,
|
// NewGLContext creates all the necessary GL resources,
|
||||||
|
@ -43,7 +41,6 @@ func NewGLContext(glctx gl.Context) (*GLContext, error) {
|
||||||
glctx: glctx,
|
glctx: glctx,
|
||||||
|
|
||||||
ptsBuf: make([]float32, 0, 4096),
|
ptsBuf: make([]float32, 0, 4096),
|
||||||
glChan: make(chan func()),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
@ -224,18 +221,6 @@ func (b *XMobileBackend) activate() {
|
||||||
activeContext = b
|
activeContext = b
|
||||||
b.activateFn()
|
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
|
// Delete deletes the offscreen texture. After calling this
|
||||||
|
|
39
gradients.go
39
gradients.go
|
@ -2,6 +2,7 @@ package canvas
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
|
"runtime"
|
||||||
|
|
||||||
"github.com/tfriedel6/canvas/backend/backendbase"
|
"github.com/tfriedel6/canvas/backend/backendbase"
|
||||||
)
|
)
|
||||||
|
@ -15,7 +16,6 @@ type LinearGradient struct {
|
||||||
from, to vec
|
from, to vec
|
||||||
created bool
|
created bool
|
||||||
loaded bool
|
loaded bool
|
||||||
deleted bool
|
|
||||||
opaque bool
|
opaque bool
|
||||||
grad backendbase.LinearGradient
|
grad backendbase.LinearGradient
|
||||||
data backendbase.Gradient
|
data backendbase.Gradient
|
||||||
|
@ -32,7 +32,6 @@ type RadialGradient struct {
|
||||||
radTo float64
|
radTo float64
|
||||||
created bool
|
created bool
|
||||||
loaded bool
|
loaded bool
|
||||||
deleted bool
|
|
||||||
opaque bool
|
opaque bool
|
||||||
grad backendbase.RadialGradient
|
grad backendbase.RadialGradient
|
||||||
data backendbase.Gradient
|
data backendbase.Gradient
|
||||||
|
@ -42,13 +41,17 @@ type RadialGradient struct {
|
||||||
// the coordinates from where to where the gradient
|
// the coordinates from where to where the gradient
|
||||||
// will apply on the canvas
|
// will apply on the canvas
|
||||||
func (cv *Canvas) CreateLinearGradient(x0, y0, x1, y1 float64) *LinearGradient {
|
func (cv *Canvas) CreateLinearGradient(x0, y0, x1, y1 float64) *LinearGradient {
|
||||||
return &LinearGradient{
|
lg := &LinearGradient{
|
||||||
cv: cv,
|
cv: cv,
|
||||||
opaque: true,
|
opaque: true,
|
||||||
from: vec{x0, y0},
|
from: vec{x0, y0},
|
||||||
to: vec{x1, y1},
|
to: vec{x1, y1},
|
||||||
data: make(backendbase.Gradient, 0, 20),
|
data: make(backendbase.Gradient, 0, 20),
|
||||||
}
|
}
|
||||||
|
runtime.SetFinalizer(lg, func(*LinearGradient) {
|
||||||
|
lg.grad.Delete()
|
||||||
|
})
|
||||||
|
return lg
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateRadialGradient creates a new radial gradient with
|
// 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
|
// gradient will apply from the first to the second
|
||||||
// circle
|
// circle
|
||||||
func (cv *Canvas) CreateRadialGradient(x0, y0, r0, x1, y1, r1 float64) *RadialGradient {
|
func (cv *Canvas) CreateRadialGradient(x0, y0, r0, x1, y1, r1 float64) *RadialGradient {
|
||||||
return &RadialGradient{
|
rg := &RadialGradient{
|
||||||
cv: cv,
|
cv: cv,
|
||||||
opaque: true,
|
opaque: true,
|
||||||
from: vec{x0, y0},
|
from: vec{x0, y0},
|
||||||
|
@ -65,30 +68,14 @@ func (cv *Canvas) CreateRadialGradient(x0, y0, r0, x1, y1, r1 float64) *RadialGr
|
||||||
radTo: r1,
|
radTo: r1,
|
||||||
data: make(backendbase.Gradient, 0, 20),
|
data: make(backendbase.Gradient, 0, 20),
|
||||||
}
|
}
|
||||||
}
|
runtime.SetFinalizer(rg, func(*RadialGradient) {
|
||||||
|
rg.grad.Delete()
|
||||||
// Delete explicitly deletes the gradient
|
})
|
||||||
func (lg *LinearGradient) Delete() {
|
return rg
|
||||||
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
|
|
||||||
}
|
|
||||||
rg.grad.Delete()
|
|
||||||
rg.grad = nil
|
|
||||||
rg.deleted = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lg *LinearGradient) load() {
|
func (lg *LinearGradient) load() {
|
||||||
if lg.loaded || len(lg.data) < 1 || lg.deleted {
|
if lg.loaded || len(lg.data) < 1 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +89,7 @@ func (lg *LinearGradient) load() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rg *RadialGradient) load() {
|
func (rg *RadialGradient) load() {
|
||||||
if rg.loaded || len(rg.data) < 1 || rg.deleted {
|
if rg.loaded || len(rg.data) < 1 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue