94 lines
2.4 KiB
Go
94 lines
2.4 KiB
Go
|
package alui
|
||
|
|
||
|
import (
|
||
|
"opslag.de/schobers/allg5"
|
||
|
"opslag.de/schobers/geom"
|
||
|
)
|
||
|
|
||
|
type Fonts struct {
|
||
|
fonts map[string]*allg5.Font
|
||
|
}
|
||
|
|
||
|
type FontDescription struct {
|
||
|
Path string
|
||
|
Size int
|
||
|
Name string
|
||
|
}
|
||
|
|
||
|
func NewFonts() *Fonts {
|
||
|
return &Fonts{map[string]*allg5.Font{}}
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) Destroy() {
|
||
|
for _, font := range f.fonts {
|
||
|
font.Destroy()
|
||
|
}
|
||
|
f.fonts = nil
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) Draw(font string, left, top float32, color allg5.Color, text string) {
|
||
|
f.DrawFont(f.Get(font), left, top, color, text)
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) DrawAlign(font string, left, top, right float32, color allg5.Color, align allg5.HorizontalAlignment, text string) {
|
||
|
f.DrawAlignFont(f.Get(font), left, top, right, color, align, text)
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) DrawAlignFont(font *allg5.Font, left, top, right float32, color allg5.Color, align allg5.HorizontalAlignment, text string) {
|
||
|
switch align {
|
||
|
case allg5.AlignCenter:
|
||
|
center, top := geom.Round32(.5*(left+right)), geom.Round32(top)
|
||
|
font.Draw(center, top, color, allg5.AlignCenter, text)
|
||
|
case allg5.AlignRight:
|
||
|
right, top = geom.Round32(right), geom.Round32(top)
|
||
|
font.Draw(right, top, color, allg5.AlignRight, text)
|
||
|
default:
|
||
|
left, top = geom.Round32(left), geom.Round32(top)
|
||
|
font.Draw(left, top, color, allg5.AlignLeft, text)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) DrawCenter(font string, center, top float32, color allg5.Color, text string) {
|
||
|
f.DrawCenterFont(f.Get(font), center, top, color, text)
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) DrawCenterFont(font *allg5.Font, center, top float32, color allg5.Color, text string) {
|
||
|
f.DrawAlignFont(font, center, top, center, color, allg5.AlignCenter, text)
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) DrawFont(font *allg5.Font, left, top float32, color allg5.Color, text string) {
|
||
|
left, top = geom.Round32(left), geom.Round32(top)
|
||
|
font.Draw(left, top, color, allg5.AlignLeft, text)
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) Len() int { return len(f.fonts) }
|
||
|
|
||
|
func (f *Fonts) Load(path string, size int, name string) error {
|
||
|
font, err := allg5.LoadTTFFont(path, size)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if old := f.fonts[name]; old != nil {
|
||
|
old.Destroy()
|
||
|
}
|
||
|
f.fonts[name] = font
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) LoadFonts(descriptions ...FontDescription) error {
|
||
|
for _, desc := range descriptions {
|
||
|
err := f.Load(desc.Path, desc.Size, desc.Name)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (f *Fonts) Get(name string) *allg5.Font {
|
||
|
if name == "" {
|
||
|
return f.Get("default")
|
||
|
}
|
||
|
return f.fonts[name]
|
||
|
}
|