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