package gfx import ( "io/fs" "os" "path/filepath" "github.com/chompy/roguelike_rpg/internal/util" "github.com/hajimehoshi/ebiten/v2/text/v2" ) type FontDef struct { Path string `yaml:"path"` Size int `yaml:"size"` Effects []string `yaml:"effects"` } type FontLibrary map[string]*Font func LoadFontLibrary(assetFS fs.FS) (FontLibrary, error) { // load fonts.yaml fontLibraryConf := make(map[string]FontDef) if err := util.ReadYAML(assetFS, filepath.Join("gfx", "fonts.yaml"), &fontLibraryConf); err != nil { return nil, err } // preload fonts and effects fontSources := make(map[string]*text.GoTextFaceSource) effects := make(map[string]Effect) for _, fontDef := range fontLibraryConf { if fontSources[fontDef.Path] == nil && fontDef.Path != "" { fontReader, err := assetFS.Open(fontDef.Path) if err != nil { return nil, err } defer fontReader.Close() fontSource, err := text.NewGoTextFaceSource(fontReader) if err != nil { return nil, err } fontSources[fontDef.Path] = fontSource } for _, effectName := range fontDef.Effects { if effects[effectName] == nil { luaEffect, err := LoadLuaEffect(assetFS, effectName) if err != nil && !os.IsNotExist(err) { return nil, err } if err == nil { effects[effectName] = luaEffect continue } shaderEffect, err := LoadShaderEffect(assetFS, effectName) if err != nil && !os.IsNotExist(err) { return nil, err } if err == nil { effects[effectName] = shaderEffect continue } } } } fontLibrary := make(FontLibrary, 0) for name, fontDef := range fontLibraryConf { fontSource := fontSources[fontDef.Path] if fontSource == nil { continue } fontEffects := make([]Effect, 0) for _, effectName := range fontDef.Effects { if effects[effectName] != nil { fontEffects = append(fontEffects, effects[effectName]) } } fontLibrary[name] = &Font{ Font: &text.GoTextFace{Source: fontSource, Size: float64(fontDef.Size)}, effects: fontEffects, } } return fontLibrary, nil } func (l FontLibrary) Get(names ...string) ([]*Font, error) { out := make([]*Font, 0) for _, name := range names { if l[name] == nil { return nil, ErrFontNotDefined } out = append(out, l[name]) } return out, nil } func (l FontLibrary) GetOne(name string) (*Font, error) { if l[name] != nil { return l[name], nil } return nil, ErrFontNotDefined }