73 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// 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
 | 
						|
}
 |