text.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package cache
  2. import (
  3. "sync"
  4. "time"
  5. "fyne.io/fyne/v2"
  6. )
  7. var (
  8. fontSizeCache = map[fontSizeEntry]fontMetric{}
  9. fontSizeLock = sync.RWMutex{}
  10. )
  11. type fontMetric struct {
  12. expiringCache
  13. size fyne.Size
  14. baseLine float32
  15. }
  16. type fontSizeEntry struct {
  17. text string
  18. size float32
  19. style fyne.TextStyle
  20. }
  21. // GetFontMetrics looks up a calculated size and baseline required for the specified text parameters.
  22. func GetFontMetrics(text string, fontSize float32, style fyne.TextStyle) (size fyne.Size, base float32) {
  23. ent := fontSizeEntry{text, fontSize, style}
  24. fontSizeLock.RLock()
  25. ret, ok := fontSizeCache[ent]
  26. fontSizeLock.RUnlock()
  27. if !ok {
  28. return fyne.Size{Width: 0, Height: 0}, 0
  29. }
  30. ret.setAlive()
  31. return ret.size, ret.baseLine
  32. }
  33. // SetFontMetrics stores a calculated font size and baseline for parameters that were missing from the cache.
  34. func SetFontMetrics(text string, fontSize float32, style fyne.TextStyle, size fyne.Size, base float32) {
  35. ent := fontSizeEntry{text, fontSize, style}
  36. metric := fontMetric{size: size, baseLine: base}
  37. metric.setAlive()
  38. fontSizeLock.Lock()
  39. fontSizeCache[ent] = metric
  40. fontSizeLock.Unlock()
  41. }
  42. // destroyExpiredFontMetrics destroys expired fontSizeCache entries
  43. func destroyExpiredFontMetrics(now time.Time) {
  44. expiredObjs := make([]fontSizeEntry, 0, 50)
  45. fontSizeLock.RLock()
  46. for k, v := range fontSizeCache {
  47. if v.isExpired(now) {
  48. expiredObjs = append(expiredObjs, k)
  49. }
  50. }
  51. fontSizeLock.RUnlock()
  52. fontSizeLock.Lock()
  53. for _, k := range expiredObjs {
  54. delete(fontSizeCache, k)
  55. }
  56. fontSizeLock.Unlock()
  57. }