package main import ( "errors" "os" "github.com/charmbracelet/log" "github.com/golang/freetype/truetype" "golang.org/x/image/font" "golang.org/x/image/font/opentype" ) const defaultFontSize = 24.0 var fontManager *FontManager type FontManager struct { fontData []byte fontType string // opentype or truetype } func initFontManager() error { fontBytes, err := os.ReadFile(fontPath) if err != nil { return err } // initially try to parse as opentype/truetype if _, err := opentype.Parse(fontBytes); err == nil { fontManager = &FontManager{ fontData: fontBytes, fontType: "opentype", } log.Debug("Initialized OpenType font manager") } else if _, err := truetype.Parse(fontBytes); err == nil { fontManager = &FontManager{ fontData: fontBytes, fontType: "truetype", } log.Debug("Initialized TrueType font manager") } else { return err } return nil } func createFontFace(size float64) (font.Face, error) { if fontManager == nil { return nil, errors.New("font manager not initialized") } switch fontManager.fontType { case "opentype": parsedFont, err := opentype.Parse(fontManager.fontData) if err != nil { return nil, err } return opentype.NewFace(parsedFont, &opentype.FaceOptions{ Size: size, DPI: 72, }) case "truetype": ttf, err := truetype.Parse(fontManager.fontData) if err != nil { return nil, err } return truetype.NewFace(ttf, &truetype.Options{ Size: size, DPI: 72, }), nil default: return nil, errors.New("unknown font type") } }