-
Notifications
You must be signed in to change notification settings - Fork 0
/
font.go
59 lines (48 loc) · 1.14 KB
/
font.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package lazy
import (
"image"
"github.com/codeation/lru"
"github.com/codeation/impress/driver"
)
type keySplit struct {
text string
edge int
indent int
}
type font struct {
driver.Fonter
cacheSplit *lru.Cache[keySplit, []string]
cacheSize *lru.Cache[string, image.Point]
}
func (a *app) NewFont(height int, attributes map[string]string) driver.Fonter {
f := &font{
Fonter: a.Driver.NewFont(height, attributes),
}
f.cacheSplit = lru.NewCache(128, f.splitByKey)
f.cacheSize = lru.NewCache(1024, f.sizeByString)
return f
}
func (f *font) splitByKey(key keySplit) ([]string, error) {
return f.Fonter.Split(key.text, key.edge, key.indent), nil
}
func (f *font) sizeByString(text string) (image.Point, error) {
return f.Fonter.Size(text), nil
}
func (f *font) Split(text string, edge int, indent int) []string {
output, _ := f.cacheSplit.Get(keySplit{
text: text,
edge: edge,
indent: indent,
})
return output
}
func (f *font) Size(text string) image.Point {
output, _ := f.cacheSize.Get(text)
return output
}
func (f *font) ID() int {
if id, ok := f.Fonter.(interface{ ID() int }); ok {
return id.ID()
}
return 0
}