代码拉取完成,页面将自动刷新
同步操作将从 Gitee 极速下载/Fyne 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package gl
import (
"image"
"os"
"sync"
"time"
"fyne.io/fyne"
)
type rasterInfo struct {
pix *image.RGBA
w, h int
expires time.Time
}
var cacheDuration = time.Minute * 5
var rasters = make(map[fyne.Resource]*rasterInfo)
var aspects = make(map[interface{}]float32, 16)
var rasterMutex sync.RWMutex
var janitorOnce sync.Once
func init() {
if t, err := time.ParseDuration(os.Getenv("FYNE_CACHE")); err == nil {
cacheDuration = t
}
svgCacheJanitor()
}
func svgCacheJanitor() {
delay := cacheDuration / 2
if delay < time.Second {
delay = time.Second
}
go janitorOnce.Do(func() {
for {
time.Sleep(delay)
now := time.Now()
rasterMutex.Lock()
for k, v := range rasters {
if v.expires.Before(now) {
delete(rasters, k)
}
}
rasterMutex.Unlock()
}
})
}
func svgCacheGet(res fyne.Resource, w int, h int) *image.RGBA {
rasterMutex.RLock()
defer rasterMutex.RUnlock()
v, ok := rasters[res]
if !ok || v == nil || v.w != w || v.h != h {
return nil
}
v.expires = time.Now().Add(cacheDuration)
return v.pix
}
func svgCachePut(res fyne.Resource, pix *image.RGBA, w int, h int) {
rasterMutex.Lock()
defer rasterMutex.Unlock()
defer func() {
recover()
}()
rasters[res] = &rasterInfo{
pix: pix,
w: w,
h: h,
expires: time.Now().Add(cacheDuration),
}
}
func svgCacheReset() {
rasterMutex.Lock()
for k := range rasters {
delete(rasters, k)
}
rasterMutex.Unlock()
}
func svgCacheMonitorTheme() {
listener := make(chan fyne.Settings)
fyne.CurrentApp().Settings().AddChangeListener(listener)
go func() {
for {
<-listener
svgCacheReset()
}
}()
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。