9fans.net/go@v0.0.7/cmd/acme/internal/adraw/font.go (about) 1 package adraw 2 3 import ( 4 "sync" 5 6 "9fans.net/go/cmd/acme/internal/alog" 7 "9fans.net/go/cmd/acme/internal/util" 8 "9fans.net/go/draw" 9 ) 10 11 var Font *draw.Font 12 13 type RefFont struct { 14 lk sync.Mutex 15 Ref uint32 16 F *draw.Font 17 } 18 19 var RefFont1 RefFont 20 21 var RefFonts [2]*RefFont 22 23 var nfix int 24 25 func FindFont(fix, save, setfont bool, name string) *RefFont { 26 var r *RefFont 27 fixi := 0 28 if fix { 29 fixi = 1 30 if nfix++; nfix > 1 { 31 panic("fixi") 32 } 33 } 34 if name == "" { 35 name = FontNames[fixi] 36 r = RefFonts[fixi] 37 } 38 if r == nil { 39 for _, r = range FontCache { 40 if r.F.Name == name { 41 goto Found 42 } 43 } 44 f, err := Display.OpenFont(name) 45 if err != nil { 46 alog.Printf("can't open font file %s: %v\n", name, err) 47 return nil 48 } 49 r = new(RefFont) 50 r.F = f 51 FontCache = append(FontCache, r) 52 } 53 Found: 54 if save { 55 util.Incref(&r.Ref) 56 if RefFonts[fixi] != nil { 57 CloseFont(RefFonts[fixi]) 58 } 59 RefFonts[fixi] = r 60 if name != FontNames[fixi] { 61 FontNames[fixi] = name 62 } 63 } 64 if setfont { 65 RefFont1.F = r.F 66 util.Incref(&r.Ref) 67 CloseFont(RefFonts[0]) 68 Font = r.F 69 RefFonts[0] = r 70 util.Incref(&r.Ref) 71 Init() 72 } 73 util.Incref(&r.Ref) 74 return r 75 } 76 77 func CloseFont(r *RefFont) { 78 if util.Decref(&r.Ref) == 0 { 79 for i := range FontCache { 80 if FontCache[i] == r { 81 copy(FontCache[i:], FontCache[i+1:]) 82 FontCache = FontCache[:len(FontCache)-1] 83 goto Found 84 } 85 } 86 alog.Printf("internal error: can't find font in cache\n") 87 Found: 88 r.F.Free() 89 } 90 } 91 92 var FontNames = []string{ 93 "/lib/font/bit/lucsans/euro.8.font", 94 "/lib/font/bit/lucm/unicode.9.font", 95 } 96 97 var FontCache []*RefFont