mirror of
https://github.com/kovidgoyal/kitty.git
synced 2026-02-01 11:34:59 +01:00
61 lines
1.6 KiB
Go
61 lines
1.6 KiB
Go
package vt
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
var _ = fmt.Print
|
|
|
|
const extra_capacity uint = 4
|
|
|
|
type LineBuf struct {
|
|
cells []Cell
|
|
attrs []LineAttrs
|
|
line_map, scratch []uint
|
|
xnum, ynum uint
|
|
}
|
|
|
|
func NewLineBuf(xnum, ynum uint) *LineBuf {
|
|
lm := make([]uint, ynum, ynum+extra_capacity)
|
|
var i uint
|
|
for i = 0; i < ynum; i++ {
|
|
lm[i] = i
|
|
}
|
|
return &LineBuf{
|
|
cells: make([]Cell, xnum*ynum, xnum*(ynum+extra_capacity)),
|
|
attrs: make([]LineAttrs, len(lm), cap(lm)),
|
|
scratch: make([]uint, len(lm), cap(lm)),
|
|
xnum: xnum, ynum: ynum, line_map: lm,
|
|
}
|
|
}
|
|
|
|
func (self *LineBuf) Line(y uint) Line {
|
|
idx := self.line_map[y]
|
|
return Line{Attrs: self.attrs[y], Cells: self.cells[idx*self.xnum : (idx+1)*self.xnum]}
|
|
}
|
|
|
|
func (self *LineBuf) AddLines(n uint) {
|
|
ynum := self.ynum + n
|
|
if uint(cap(self.line_map)) >= ynum {
|
|
self.line_map = self.line_map[0:ynum:cap(self.line_map)]
|
|
self.scratch = self.scratch[0:ynum:cap(self.scratch)]
|
|
self.attrs = self.attrs[0:ynum:cap(self.attrs)]
|
|
self.cells = self.cells[0 : ynum*self.xnum : cap(self.cells)]
|
|
} else {
|
|
newattrs := make([]LineAttrs, ynum, ynum+extra_capacity)
|
|
copy(newattrs, self.attrs)
|
|
newlinemap := make([]uint, ynum, ynum+extra_capacity)
|
|
copy(newlinemap, self.line_map)
|
|
for n = self.ynum; n < ynum; n++ {
|
|
newlinemap[n] = n
|
|
}
|
|
newcells := make([]Cell, self.xnum*ynum, self.xnum*(ynum+extra_capacity))
|
|
copy(newcells, self.cells)
|
|
self.attrs = newattrs
|
|
self.line_map = newlinemap
|
|
self.cells = newcells
|
|
self.scratch = make([]uint, len(self.line_map), cap(self.line_map))
|
|
}
|
|
self.ynum = ynum
|
|
}
|