mirror of
https://codeberg.org/scip/golsky.git
synced 2025-12-16 12:10:58 +01:00
114 lines
2.5 KiB
Go
114 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/golang/freetype/truetype"
|
|
"github.com/tinne26/etxt"
|
|
"golang.org/x/image/font"
|
|
)
|
|
|
|
var FontRenderer = LoadFonts("assets/fonts")
|
|
|
|
const (
|
|
GameFont string = "NotoSans-Regular"
|
|
GameFontETXT string = "Noto Sans"
|
|
FontSizeBig int = 48
|
|
FontSizeNormal int = 24
|
|
FontSizeSmall int = 12
|
|
)
|
|
|
|
type Texter struct {
|
|
Renderer *etxt.Renderer
|
|
FontNormal *font.Face
|
|
FontBig *font.Face
|
|
FontSmall *font.Face
|
|
}
|
|
|
|
func LoadFonts(dir string) Texter {
|
|
// load the font for use with ebitenui
|
|
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(FontSizeNormal),
|
|
DPI: 72,
|
|
Hinting: font.HintingFull,
|
|
})
|
|
|
|
biggameface := truetype.NewFace(gamefont, &truetype.Options{
|
|
Size: float64(FontSizeBig),
|
|
DPI: 72,
|
|
Hinting: font.HintingFull,
|
|
})
|
|
|
|
smallgameface := truetype.NewFace(gamefont, &truetype.Options{
|
|
Size: float64(FontSizeSmall),
|
|
DPI: 72,
|
|
Hinting: font.HintingFull,
|
|
})
|
|
|
|
// load the font for use with etxt
|
|
fontlib := etxt.NewFontLibrary()
|
|
_, _, err = fontlib.ParseEmbedDirFonts(dir, assetfs)
|
|
if err != nil {
|
|
log.Fatalf("Error while loading fonts: %s", err.Error())
|
|
}
|
|
|
|
/*
|
|
err = fontlib.EachFont(
|
|
func(fontName string, font *etxt.Font) error {
|
|
fmt.Printf("font: %s\n", fontName)
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
*/
|
|
|
|
if !fontlib.HasFont(GameFontETXT) {
|
|
log.Fatal("missing font: " + GameFontETXT)
|
|
}
|
|
|
|
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(GameFontETXT))
|
|
|
|
return Texter{
|
|
Renderer: renderer,
|
|
FontNormal: &gameface,
|
|
FontBig: &biggameface,
|
|
FontSmall: &smallgameface,
|
|
}
|
|
}
|
|
|
|
// 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
|
|
}
|