76 lines
1.5 KiB
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")
|
|
}
|
|
}
|