File: linebuf.go

package info (click to toggle)
kitty 0.42.1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 28,564 kB
  • sloc: ansic: 82,787; python: 55,191; objc: 5,122; sh: 1,295; xml: 364; makefile: 143; javascript: 78
file content (60 lines) | stat: -rw-r--r-- 1,595 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
}