mandala/font.go

76 lines
1.5 KiB
Go

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")
}
}