60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package assets
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/tinne26/etxt"
|
|
)
|
|
|
|
var FontRenderer = LoadFonts("fonts")
|
|
|
|
const (
|
|
GameFont string = "x12y20pxScanLine"
|
|
FontSize int = 16
|
|
)
|
|
|
|
type Texter struct {
|
|
Renderer *etxt.Renderer
|
|
}
|
|
|
|
func LoadFonts(dir string) *Texter {
|
|
fontlib := etxt.NewFontLibrary()
|
|
_, _, err := fontlib.ParseEmbedDirFonts(dir, assetfs)
|
|
if err != nil {
|
|
log.Fatalf("Error while loading fonts: %s", err.Error())
|
|
}
|
|
|
|
if !fontlib.HasFont(GameFont) {
|
|
log.Fatal("missing font: " + GameFont)
|
|
}
|
|
|
|
err = fontlib.EachFont(checkMissingRunes)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
renderer := etxt.NewStdRenderer()
|
|
|
|
glyphsCache := etxt.NewDefaultCache(10 * 1024 * 1024) // 10MB
|
|
renderer.SetCacheHandler(glyphsCache.NewHandler())
|
|
renderer.SetFont(fontlib.GetFont(GameFont))
|
|
|
|
return &Texter{renderer}
|
|
}
|
|
|
|
// helper function used with FontLibrary.EachFont to make sure
|
|
// all loaded fonts contain the characters or alphabet we want
|
|
func checkMissingRunes(name string, font *etxt.Font) error {
|
|
const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
|
|
const symbols = "0123456789 .,;:!?-()[]{}_&#@"
|
|
|
|
missing, err := etxt.GetMissingRunes(font, letters+symbols)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(missing) > 0 {
|
|
log.Fatalf("Font '%s' missing runes: %s", name, string(missing))
|
|
}
|
|
return nil
|
|
}
|