package app import ( _ "embed" "github.com/veandco/go-sdl2/sdl" "github.com/veandco/go-sdl2/ttf" ) //go:embed assets/Trueno-wml2.otf var viewerFontData []byte const textBoxPaddingX = 10 const textBoxPaddingY = 7 func renderText(text string) (*sdl.Surface, error) { rwData, err := sdl.RWFromMem(viewerFontData) if err != nil { return nil, err } defer rwData.Close() font, err := ttf.OpenFontRW(rwData, 0, 24) if err != nil { return nil, err } defer font.Close() color := sdl.Color{R: 0xff, G: 0xff, B: 0xff, A: 0xff} surface, err := font.RenderUTF8Blended(text, color) if err != nil { return nil, err } return surface, nil } // renderTextBox renders text inside a box func renderTextBox(text string) (*sdl.Surface, error) { textSurface, err := renderText(text) if err != nil { return nil, err } defer textSurface.Free() // Create a new surface for the text box boxSurface, err := sdl.CreateRGBSurfaceWithFormat(0, textSurface.W+(textBoxPaddingX*2), textSurface.H+(textBoxPaddingY*2), 32, sdl.PIXELFORMAT_RGBA8888) if err != nil { return nil, err } // Draw a border around the text box boxBorderRect := &sdl.Rect{X: 0, Y: 0, W: boxSurface.W, H: boxSurface.H} if err := boxSurface.FillRect(boxBorderRect, 0xffffffff); err != nil { return nil, err } boxBgRect := &sdl.Rect{X: 1, Y: 1, W: boxSurface.W - 2, H: boxSurface.H - 2} if err := boxSurface.FillRect(boxBgRect, 0); err != nil { return nil, err } // Render the text surface on top of the box surface textRect := &sdl.Rect{X: textBoxPaddingX, Y: textBoxPaddingY, W: textSurface.W, H: textSurface.H} if err := textSurface.Blit(nil, boxSurface, textRect); err != nil { return nil, err } return boxSurface, nil } func (v *Viewer) RenderMessage(text string) error { var err error v.messageSurface, err = renderTextBox(text) v.messageTick = sdl.GetTicks64() return err }