| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package cache
- import (
- "sync"
- "time"
- "fyne.io/fyne/v2"
- )
- var (
- fontSizeCache = map[fontSizeEntry]fontMetric{}
- fontSizeLock = sync.RWMutex{}
- )
- type fontMetric struct {
- expiringCache
- size fyne.Size
- baseLine float32
- }
- type fontSizeEntry struct {
- text string
- size float32
- style fyne.TextStyle
- }
- // GetFontMetrics looks up a calculated size and baseline required for the specified text parameters.
- func GetFontMetrics(text string, fontSize float32, style fyne.TextStyle) (size fyne.Size, base float32) {
- ent := fontSizeEntry{text, fontSize, style}
- fontSizeLock.RLock()
- ret, ok := fontSizeCache[ent]
- fontSizeLock.RUnlock()
- if !ok {
- return fyne.Size{Width: 0, Height: 0}, 0
- }
- ret.setAlive()
- return ret.size, ret.baseLine
- }
- // SetFontMetrics stores a calculated font size and baseline for parameters that were missing from the cache.
- func SetFontMetrics(text string, fontSize float32, style fyne.TextStyle, size fyne.Size, base float32) {
- ent := fontSizeEntry{text, fontSize, style}
- metric := fontMetric{size: size, baseLine: base}
- metric.setAlive()
- fontSizeLock.Lock()
- fontSizeCache[ent] = metric
- fontSizeLock.Unlock()
- }
- // destroyExpiredFontMetrics destroys expired fontSizeCache entries
- func destroyExpiredFontMetrics(now time.Time) {
- expiredObjs := make([]fontSizeEntry, 0, 50)
- fontSizeLock.RLock()
- for k, v := range fontSizeCache {
- if v.isExpired(now) {
- expiredObjs = append(expiredObjs, k)
- }
- }
- fontSizeLock.RUnlock()
- fontSizeLock.Lock()
- for _, k := range expiredObjs {
- delete(fontSizeCache, k)
- }
- fontSizeLock.Unlock()
- }
|