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 }