termui/buffer.go

90 lines
1.8 KiB
Go
Raw Normal View History

// Copyright 2015 Zack Guo <gizak@icloud.com>. All rights reserved.
// Use of this source code is governed by a MIT license that can
// be found in the LICENSE file.
package termui
import "image"
// Cell is a rune with assigned Fg and Bg
type Cell struct {
Ch rune
Fg Attribute
Bg Attribute
}
// Buffer is a renderable rectangle cell data container.
type Buffer struct {
Area image.Rectangle // selected drawing area
CellMap map[image.Point]Cell
}
// At returns the cell at (x,y).
func (b Buffer) At(x, y int) Cell {
return b.CellMap[image.Pt(x, y)]
}
// Set assigns a char to (x,y)
func (b Buffer) Set(x, y int, c Cell) {
b.CellMap[image.Pt(x, y)] = c
}
// Bounds returns the domain for which At can return non-zero color.
func (b Buffer) Bounds() image.Rectangle {
x0, y0, x1, y1 := 0, 0, 0, 0
for p := range b.CellMap {
switch {
case p.X > x1:
x1 = p.X
case p.X < x0:
x0 = p.X
case p.Y > y1:
y1 = p.Y
case p.Y < y0:
y0 = p.Y
}
}
return image.Rect(x0, y0, x1, y1)
}
// Align sets drawing area to the buffer's bound
func (b *Buffer) Align() {
b.Area = b.Bounds()
}
// NewCell returns a new cell
func NewCell(ch rune, fg, bg Attribute) Cell {
return Cell{ch, fg, bg}
}
// Union squeezes buf into b
func (b Buffer) Union(buf Buffer) {
for p, c := range buf.CellMap {
b.Set(p.X, p.Y, c)
}
}
// Union returns a new Buffer formed by squeezing bufs into one Buffer
func Union(bufs ...Buffer) Buffer {
buf := NewBuffer()
for _, b := range bufs {
buf.Union(b)
}
buf.Align()
return buf
}
// Point for adapting use, will be removed after resolving bridging.
type Point struct {
X int
Y int
Ch rune
Fg Attribute
Bg Attribute
}
// NewBuffer returns a new Buffer
func NewBuffer() Buffer {
return Buffer{CellMap: make(map[image.Point]Cell)}
}