12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- 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
- }
|