Go Graphics library for use in a text terminal. Only 1bit graphics can be used with two colors. Used unicode block symbols for drawing. 2x3 mode is supported by the Iosevka font or some terminals (like default on Ubuntu).
- Available 5 graphics modes, from 2x3 pixels grid for terminal symbol to 1x1, 1x2 and 2x2, or you can create own custom mode with your graphics
- Set/get one pixel
- Drawings: lines (vertical, horizontal, or with any angle), boxes, circles, arcs
- Fill area with a different options, for example fill with patterns
- Buffer manipulating: cut, clone, convert to/from stdlib Image or text
- Buffer transform: BitBlt with options, clear, flip, invert, scroll (vertical, horizontal)
- Sub-package for turtle graphics, also available drawing by text script
- Sprite support with Put, Withdraw, Move, etc methods
go get github.com/msoap/tcg
package main
import (
"log"
"time"
"github.com/gdamore/tcell/v2"
"github.com/msoap/tcg"
)
func main() {
tg, err := tcg.New(tcg.Mode2x3) // each terminal symbol contains a 2x3 pixels grid, also you can use 1x1, 1x2, and 2x2 modes
if err != nil {
log.Fatalf("create tcg: %s", err)
}
i := 0
for {
pixColor := tg.Buf.At(10, 10) // get color of pixel
tg.Buf.Set(11, 11, pixColor) // draw one pixel with color from 10,10
tg.Buf.Line(0, 0, i, i, tcg.Black) // draw a diagonal line
tg.Show() // synchronize buffer with screen
if tg.TCellScreen.HasPendingEvent() {
if ev, ok := tg.TCellScreen.PollEvent().(*tcell.EventKey); ok && ev.Rune() == 'q' {
break // exit by 'q' key
}
}
i++
time.Sleep(time.Second)
}
tg.Finish() // finish application and restore screen
}
See more examples in examples folder.
Game of Life example in iTerm2 terminal:
See more screenshots.
- fonts support
- sprites
- animation in sprite
- Go terminal library - github.com/gdamore/tcell
- Turtle graphics
- Try it in the Go Playground
Unicode symbols:
- Block Elements - wikipedia
- Block Elements - unicode.org
- Symbols for Legacy Computing - wikipedia
- Symbols for Legacy Computing - unicode.org
Supported fonts (for "2x3" mode):