canvas.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.
  2. // Use of this source code is governed by a MIT license that can
  3. // be found in the LICENSE file.
  4. package termui
  5. /*
  6. dots:
  7. ,___,
  8. |1 4|
  9. |2 5|
  10. |3 6|
  11. |7 8|
  12. `````
  13. */
  14. var brailleBase = '\u2800'
  15. var brailleOftMap = [4][2]rune{
  16. {'\u0001', '\u0008'},
  17. {'\u0002', '\u0010'},
  18. {'\u0004', '\u0020'},
  19. {'\u0040', '\u0080'}}
  20. // Canvas contains drawing map: i,j -> rune
  21. type Canvas map[[2]int]rune
  22. // NewCanvas returns an empty Canvas
  23. func NewCanvas() Canvas {
  24. return make(map[[2]int]rune)
  25. }
  26. func chOft(x, y int) rune {
  27. return brailleOftMap[y%4][x%2]
  28. }
  29. func (c Canvas) rawCh(x, y int) rune {
  30. if ch, ok := c[[2]int{x, y}]; ok {
  31. return ch
  32. }
  33. return '\u0000' //brailleOffset
  34. }
  35. // return coordinate in terminal
  36. func chPos(x, y int) (int, int) {
  37. return y / 4, x / 2
  38. }
  39. // Set sets a point (x,y) in the virtual coordinate
  40. func (c Canvas) Set(x, y int) {
  41. i, j := chPos(x, y)
  42. ch := c.rawCh(i, j)
  43. ch |= chOft(x, y)
  44. c[[2]int{i, j}] = ch
  45. }
  46. // Unset removes point (x,y)
  47. func (c Canvas) Unset(x, y int) {
  48. i, j := chPos(x, y)
  49. ch := c.rawCh(i, j)
  50. ch &= ^chOft(x, y)
  51. c[[2]int{i, j}] = ch
  52. }
  53. // Buffer returns un-styled points
  54. func (c Canvas) Buffer() Buffer {
  55. buf := NewBuffer()
  56. for k, v := range c {
  57. buf.Set(k[0], k[1], Cell{Ch: v + brailleBase})
  58. }
  59. return buf
  60. }