aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/gizak/termui/canvas.go
blob: 6d2513ebd4f157d002d663d3a095bd0813d54a30 (plain) (blame)
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
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2017 Zack Guo <zack.y.guo@gmail.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() Buffer {
    buf := NewBuffer()
    for k, v := range c {
        buf.Set(k[0], k[1], Cell{Ch: v + brailleBase})
    }
    return buf
}