linebuf.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package vt
  2. import (
  3. "fmt"
  4. )
  5. var _ = fmt.Print
  6. const extra_capacity uint = 4
  7. type LineBuf struct {
  8. cells []Cell
  9. attrs []LineAttrs
  10. line_map, scratch []uint
  11. xnum, ynum uint
  12. }
  13. func NewLineBuf(xnum, ynum uint) *LineBuf {
  14. lm := make([]uint, ynum, ynum+extra_capacity)
  15. var i uint
  16. for i = 0; i < ynum; i++ {
  17. lm[i] = i
  18. }
  19. return &LineBuf{
  20. cells: make([]Cell, xnum*ynum, xnum*(ynum+extra_capacity)),
  21. attrs: make([]LineAttrs, len(lm), cap(lm)),
  22. scratch: make([]uint, len(lm), cap(lm)),
  23. xnum: xnum, ynum: ynum, line_map: lm,
  24. }
  25. }
  26. func (self *LineBuf) Line(y uint) Line {
  27. idx := self.line_map[y]
  28. return Line{Attrs: self.attrs[y], Cells: self.cells[idx*self.xnum : (idx+1)*self.xnum]}
  29. }
  30. func (self *LineBuf) AddLines(n uint) {
  31. ynum := self.ynum + n
  32. if uint(cap(self.line_map)) >= ynum {
  33. self.line_map = self.line_map[0:ynum:cap(self.line_map)]
  34. self.scratch = self.scratch[0:ynum:cap(self.scratch)]
  35. self.attrs = self.attrs[0:ynum:cap(self.attrs)]
  36. self.cells = self.cells[0 : ynum*self.xnum : cap(self.cells)]
  37. } else {
  38. newattrs := make([]LineAttrs, ynum, ynum+extra_capacity)
  39. copy(newattrs, self.attrs)
  40. newlinemap := make([]uint, ynum, ynum+extra_capacity)
  41. copy(newlinemap, self.line_map)
  42. for n = self.ynum; n < ynum; n++ {
  43. newlinemap[n] = n
  44. }
  45. newcells := make([]Cell, self.xnum*ynum, self.xnum*(ynum+extra_capacity))
  46. copy(newcells, self.cells)
  47. self.attrs = newattrs
  48. self.line_map = newlinemap
  49. self.cells = newcells
  50. self.scratch = make([]uint, len(self.line_map), cap(self.line_map))
  51. }
  52. self.ynum = ynum
  53. }