Compare commits

..

No commits in common. "main" and "v1.1.4" have entirely different histories.
main ... v1.1.4

5 changed files with 11 additions and 50 deletions

View File

@ -7,7 +7,6 @@ import (
// Buffer is a 2-dimensional buffer // Buffer is a 2-dimensional buffer
type Buffer[T any] struct { type Buffer[T any] struct {
data [][]T data [][]T
x, y int
width int width int
height int height int
parent *Buffer[T] parent *Buffer[T]
@ -25,7 +24,6 @@ func NewBuffer[T any](width, height int, defaultValue T) *Buffer[T] {
} }
return &Buffer[T]{ return &Buffer[T]{
x: 0, y: 0,
data: b, data: b,
width: width, width: width,
height: height, height: height,
@ -34,18 +32,18 @@ func NewBuffer[T any](width, height int, defaultValue T) *Buffer[T] {
} }
} }
func (b *Buffer[T]) limX(x int) int { func (b *Buffer[T]) x(x int) int {
return limit(x, 0, b.width-1) return limit(x, 0, b.width-1)
} }
func (b *Buffer[T]) limY(y int) int { func (b *Buffer[T]) y(y int) int {
return limit(y, 0, b.height-1) return limit(y, 0, b.height-1)
} }
// Set sets the value at position (x,y) to c // Set sets the value at position (x,y) to c
func (b *Buffer[T]) Set(x, y int, v T) { func (b *Buffer[T]) Set(x, y int, v T) {
if b.width > 0 && b.height > 0 { if b.width > 0 && b.height > 0 {
b.data[b.limY(y)][b.limX(x)] = v b.data[b.y(y)][b.x(x)] = v
} }
} }
@ -69,32 +67,14 @@ func (b *Buffer[T]) Height() int {
return b.height return b.height
} }
// Offset returns the offset of b relative to its parent buffer. // ForEach calls f for every value in this buffer
// Offset returns zeros if b has no parent
func (b *Buffer[T]) Offset() (x, y int) {
return b.x, b.y
}
// OffsetX returns the horizontal offset of b relative to its parent buffer.
// OffsetX returns 0 if b has no parent
func (b *Buffer[T]) OffsetX() int {
return b.x
}
// OffsetY returns the vertical offset of b relative to its parent buffer.
// OffsetY returns 0 if b has no parent
func (b *Buffer[T]) OffsetY() int {
return b.y
}
// ForEachLine calls f for each line in b
func (b *Buffer[T]) ForEachLine(f func(line int, content []T)) { func (b *Buffer[T]) ForEachLine(f func(line int, content []T)) {
for line, content := range b.data { for line, content := range b.data {
f(line, content) f(line, content)
} }
} }
// ForEach calls f for every value in b // ForEach calls f for every value in this buffer
func (b *Buffer[T]) ForEach(f func(x, y int, v T)) { func (b *Buffer[T]) ForEach(f func(x, y int, v T)) {
for y, col := range b.data { for y, col := range b.data {
for x, v := range col { for x, v := range col {
@ -136,7 +116,6 @@ func (b *Buffer[T]) Sub(x, y, w, h int) *Buffer[T] {
// make buffer // make buffer
return &Buffer[T]{ return &Buffer[T]{
x: x, y: y,
data: data, data: data,
width: w, width: w,
height: h, height: h,

View File

@ -22,9 +22,3 @@ func TestSet(t *testing.T) {
b := NewBuffer(0, 0, ' ') b := NewBuffer(0, 0, ' ')
b.Set(0, 0, 'a') b.Set(0, 0, 'a')
} }
func TestOffset(t *testing.T) {
b := NewBuffer(10, 10, ' ')
b = b.Sub(3, 3, 3, 3)
fmt.Println(b.OffsetX(), b.OffsetY())
}

6
go.mod
View File

@ -1,7 +1,3 @@
module git.tordarus.net/tordarus/buf2d module git.tordarus.net/Tordarus/buf2d
go 1.18 go 1.18
require github.com/mattn/go-runewidth v0.0.14
require github.com/rivo/uniseg v0.2.0 // indirect

4
go.sum
View File

@ -1,4 +0,0 @@
github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=

View File

@ -2,23 +2,19 @@ package buf2d
import ( import (
"strings" "strings"
"github.com/mattn/go-runewidth"
) )
// WriteString writes a whole string to the buffer at position (x,y). // WriteString writes a whole string to the buffer at position (x,y)
// no word wrap is applied at all. If the string does not fit, it will be truncated. // no word wrap is applied at all. If the string does not fit, it will be truncated
// It returns the amount of runes in str func WriteString(b *Buffer[rune], str string, x, y int) {
func WriteString(b *Buffer[rune], str string, x, y int) (width int) {
dx := x dx := x
for _, r := range str { for _, r := range str {
if dx >= b.Width() { if dx >= b.width {
return return
} }
b.Set(dx, y, r) b.Set(dx, y, r)
dx += runewidth.RuneWidth(r) dx++
} }
return dx - x
} }
// WriteMultiLineString writes a multi-line string to the buffer at position (x,y) // WriteMultiLineString writes a multi-line string to the buffer at position (x,y)