adam-gui/vendor/fyne.io/fyne/v2/internal/cache/texture_common.go

69 lines
1.8 KiB
Go
Raw Permalink Normal View History

2024-04-29 19:13:50 +02:00
package cache
import (
"sync"
"fyne.io/fyne/v2"
)
var textures = sync.Map{} // map[fyne.CanvasObject]*textureInfo
// DeleteTexture deletes the texture from the cache map.
func DeleteTexture(obj fyne.CanvasObject) {
textures.Delete(obj)
}
// GetTexture gets cached texture.
func GetTexture(obj fyne.CanvasObject) (TextureType, bool) {
t, ok := textures.Load(obj)
if t == nil || !ok {
return NoTexture, false
}
texInfo := t.(*textureInfo)
texInfo.setAlive()
return texInfo.texture, true
}
// RangeExpiredTexturesFor range over the expired textures for the specified canvas.
//
// Note: If this is used to free textures, then it should be called inside a current
// gl context to ensure textures are deleted from gl.
func RangeExpiredTexturesFor(canvas fyne.Canvas, f func(fyne.CanvasObject)) {
now := timeNow()
textures.Range(func(key, value interface{}) bool {
obj, tinfo := key.(fyne.CanvasObject), value.(*textureInfo)
if tinfo.isExpired(now) && tinfo.canvas == canvas {
f(obj)
}
return true
})
}
// RangeTexturesFor range over the textures for the specified canvas.
//
// Note: If this is used to free textures, then it should be called inside a current
// gl context to ensure textures are deleted from gl.
func RangeTexturesFor(canvas fyne.Canvas, f func(fyne.CanvasObject)) {
textures.Range(func(key, value interface{}) bool {
obj, tinfo := key.(fyne.CanvasObject), value.(*textureInfo)
if tinfo.canvas == canvas {
f(obj)
}
return true
})
}
// SetTexture sets cached texture.
func SetTexture(obj fyne.CanvasObject, texture TextureType, canvas fyne.Canvas) {
texInfo := &textureInfo{texture: texture}
texInfo.canvas = canvas
texInfo.setAlive()
textures.Store(obj, texInfo)
}
// textureCacheBase defines base texture cache object.
type textureCacheBase struct {
expiringCacheNoLock
canvas fyne.Canvas
}