Add braille canvas
This commit is contained in:
parent
b436024302
commit
2d8fd3efda
74
canvas.go
Normal file
74
canvas.go
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
// Copyright 2015 Zack Guo <gizak@icloud.com>. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT license that can
|
||||||
|
// be found in the LICENSE file.
|
||||||
|
|
||||||
|
package termui
|
||||||
|
|
||||||
|
/*
|
||||||
|
dots:
|
||||||
|
,___,
|
||||||
|
|1 4|
|
||||||
|
|2 5|
|
||||||
|
|3 6|
|
||||||
|
|7 8|
|
||||||
|
`````
|
||||||
|
*/
|
||||||
|
|
||||||
|
var brailleBase = '\u2800'
|
||||||
|
|
||||||
|
var brailleOftMap = [4][2]rune{
|
||||||
|
{'\u0001', '\u0008'},
|
||||||
|
{'\u0002', '\u0010'},
|
||||||
|
{'\u0004', '\u0020'},
|
||||||
|
{'\u0040', '\u0080'}}
|
||||||
|
|
||||||
|
// Canvas contains drawing map: i,j -> rune
|
||||||
|
type Canvas map[[2]int]rune
|
||||||
|
|
||||||
|
// NewCanvas returns an empty Canvas
|
||||||
|
func NewCanvas() Canvas {
|
||||||
|
return make(map[[2]int]rune)
|
||||||
|
}
|
||||||
|
|
||||||
|
func chOft(x, y int) rune {
|
||||||
|
return brailleOftMap[y%4][x%2]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Canvas) rawCh(x, y int) rune {
|
||||||
|
if ch, ok := c[[2]int{x, y}]; ok {
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
return '\u0000' //brailleOffset
|
||||||
|
}
|
||||||
|
|
||||||
|
// return coordinate in terminal
|
||||||
|
func chPos(x, y int) (int, int) {
|
||||||
|
return y / 4, x / 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set sets a point (x,y) in the virtual coordinate
|
||||||
|
func (c Canvas) Set(x, y int) {
|
||||||
|
i, j := chPos(x, y)
|
||||||
|
ch := c.rawCh(i, j)
|
||||||
|
ch |= chOft(x, y)
|
||||||
|
c[[2]int{i, j}] = ch
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unset removes point (x,y)
|
||||||
|
func (c Canvas) Unset(x, y int) {
|
||||||
|
i, j := chPos(x, y)
|
||||||
|
ch := c.rawCh(i, j)
|
||||||
|
ch &= ^chOft(x, y)
|
||||||
|
c[[2]int{i, j}] = ch
|
||||||
|
}
|
||||||
|
|
||||||
|
// Buffer returns un-styled points
|
||||||
|
func (c Canvas) Buffer() []Point {
|
||||||
|
ps := make([]Point, len(c))
|
||||||
|
i := 0
|
||||||
|
for k, v := range c {
|
||||||
|
ps[i] = newPoint(v+brailleBase, k[0], k[1])
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
return ps
|
||||||
|
}
|
55
canvas_test.go
Normal file
55
canvas_test.go
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package termui
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/davecgh/go-spew/spew"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCanvasSet(t *testing.T) {
|
||||||
|
c := NewCanvas()
|
||||||
|
c.Set(0, 0)
|
||||||
|
c.Set(0, 1)
|
||||||
|
c.Set(0, 2)
|
||||||
|
c.Set(0, 3)
|
||||||
|
c.Set(1, 3)
|
||||||
|
c.Set(2, 3)
|
||||||
|
c.Set(3, 3)
|
||||||
|
c.Set(4, 3)
|
||||||
|
c.Set(5, 3)
|
||||||
|
spew.Dump(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCanvasUnset(t *testing.T) {
|
||||||
|
c := NewCanvas()
|
||||||
|
c.Set(0, 0)
|
||||||
|
c.Set(0, 1)
|
||||||
|
c.Set(0, 2)
|
||||||
|
c.Unset(0, 2)
|
||||||
|
spew.Dump(c)
|
||||||
|
c.Unset(0, 3)
|
||||||
|
spew.Dump(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCanvasBuffer(t *testing.T) {
|
||||||
|
c := NewCanvas()
|
||||||
|
c.Set(0, 0)
|
||||||
|
c.Set(0, 1)
|
||||||
|
c.Set(0, 2)
|
||||||
|
c.Set(0, 3)
|
||||||
|
c.Set(1, 3)
|
||||||
|
c.Set(2, 3)
|
||||||
|
c.Set(3, 3)
|
||||||
|
c.Set(4, 3)
|
||||||
|
c.Set(5, 3)
|
||||||
|
c.Set(6, 3)
|
||||||
|
c.Set(7, 2)
|
||||||
|
c.Set(8, 1)
|
||||||
|
c.Set(9, 0)
|
||||||
|
bufs := c.Buffer()
|
||||||
|
rs := make([]rune, len(bufs))
|
||||||
|
for i, v := range bufs {
|
||||||
|
rs[i] = v.Ch
|
||||||
|
}
|
||||||
|
spew.Dump(string(rs))
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user