package assets import ( "log" "github.com/golang/freetype/truetype" "github.com/tinne26/etxt" "golang.org/x/image/font" ) var FontRenderer = LoadFonts("fonts") const ( GameFont string = "x12y20pxScanLine" FontSize int = 16 ) type Texter struct { Renderer *etxt.Renderer Font *font.Face } func LoadFonts(dir string) *Texter { fontbytes, err := assetfs.ReadFile(dir + "/" + GameFont + ".ttf") if err != nil { log.Fatal(err) } gamefont, err := truetype.Parse(fontbytes) if err != nil { log.Fatal(err) } gameface := truetype.NewFace(gamefont, &truetype.Options{ Size: float64(FontSize), DPI: 72, Hinting: font.HintingFull, }) 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: renderer, Font: &gameface} } // 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 }