116 lines
2.4 KiB
Go
116 lines
2.4 KiB
Go
package tins2020
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/veandco/go-sdl2/sdl"
|
|
"github.com/veandco/go-sdl2/ttf"
|
|
"opslag.de/schobers/fs/vfs"
|
|
)
|
|
|
|
type TextAlignment int
|
|
|
|
const (
|
|
TextAlignmentLeft TextAlignment = iota
|
|
TextAlignmentCenter
|
|
TextAlignmentRight
|
|
)
|
|
|
|
type Font struct {
|
|
*ttf.Font
|
|
}
|
|
|
|
func (f *Font) Render(renderer *sdl.Renderer, text string, pos Point, color sdl.Color) (*Texture, error) {
|
|
surface, err := f.RenderUTF8Blended(text, color)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer surface.Free()
|
|
texture, err := NewTextureFromSurface(renderer, surface)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return texture, nil
|
|
}
|
|
|
|
func (f *Font) RenderCopyAlign(renderer *sdl.Renderer, text string, pos Point, color sdl.Color, align TextAlignment) error {
|
|
texture, err := f.Render(renderer, text, pos, color)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer texture.Destroy()
|
|
rect := texture.Rect()
|
|
switch align {
|
|
case TextAlignmentLeft:
|
|
texture.Copy(renderer, &sdl.Rect{X: pos.X, Y: pos.Y, W: rect.W, H: rect.H})
|
|
case TextAlignmentCenter:
|
|
texture.Copy(renderer, &sdl.Rect{X: pos.X - (rect.W / 2), Y: pos.Y, W: rect.W, H: rect.H})
|
|
case TextAlignmentRight:
|
|
texture.Copy(renderer, &sdl.Rect{X: pos.X - rect.W, Y: pos.Y, W: rect.W, H: rect.H})
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (f *Font) RenderCopy(renderer *sdl.Renderer, text string, pos Point, color sdl.Color) error {
|
|
texture, err := f.Render(renderer, text, pos, color)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer texture.Destroy()
|
|
texture.Copy(renderer, texture.RectOffset(pos))
|
|
return nil
|
|
}
|
|
|
|
type Fonts struct {
|
|
dir vfs.CopyDir
|
|
fonts map[string]*Font
|
|
}
|
|
|
|
func (f *Fonts) Init(dir vfs.CopyDir) {
|
|
f.dir = dir
|
|
f.fonts = map[string]*Font{}
|
|
}
|
|
|
|
func (f *Fonts) Font(name string) *Font { return f.fonts[name] }
|
|
|
|
type FontDescriptor struct {
|
|
Name string
|
|
Path string
|
|
Size int
|
|
}
|
|
|
|
func (f *Fonts) LoadDesc(fonts ...FontDescriptor) error {
|
|
for _, desc := range fonts {
|
|
err := f.Load(desc.Name, desc.Path, desc.Size)
|
|
if err != nil {
|
|
return fmt.Errorf("error loading '%s'; error: %v", desc.Name, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (f *Fonts) Load(name, path string, size int) error {
|
|
fontPath, err := f.dir.Retrieve(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
font, err := ttf.OpenFont(fontPath, size)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if font, ok := f.fonts[name]; ok {
|
|
font.Close()
|
|
}
|
|
f.fonts[name] = &Font{font}
|
|
return nil
|
|
}
|
|
|
|
func (f *Fonts) Destroy() {
|
|
if f.fonts == nil {
|
|
return
|
|
}
|
|
for _, f := range f.fonts {
|
|
f.Close()
|
|
}
|
|
}
|