v2 / vlib / v / tests / generics / generic_array_test.v
114 lines · 92 sloc · 2.76 KB · e2e5cf8db56f3562c7baa735061690be936bdf3e
Raw
1import arrays
2
3pub fn Canvas.new(width int, height int) &Canvas {
4 return &Canvas{
5 layers: create_buffer(width, height)
6 }
7}
8
9pub fn (canvas Canvas) size() (int, int) {
10 return canvas.layers[0].len, canvas.layers.len
11}
12
13pub fn (canvas Canvas) string() string {
14 output := buffer_to_braille(canvas.layers, dots_to_braille_rune_map)
15 return arrays.join_to_string(output, '\n', |row| arrays.join_to_string(row, '',
16 |character| '${character}'))
17}
18
19pub fn (mut canvas Canvas) set(x int, y int) {
20 canvas.layers[y][x] = true
21}
22
23pub fn (mut canvas Canvas) unset(x int, y int) {
24 canvas.layers[y][x] = false
25}
26
27pub fn (mut canvas Canvas) clear() {
28 width, height := canvas.size()
29 canvas.layers = create_buffer(width, height)
30}
31
32struct Canvas {
33mut:
34 layers [][]bool
35}
36
37const dots_to_braille = [u8(0), 3, 1, 4, 2, 5, 6, 7]
38const dots_to_braille_rune_map = memoize_dots_to_braille_rune()
39
40fn dots_to_braille_rune(dots u8) rune {
41 mut mask := 0
42 for index in 0 .. 8 {
43 if ((dots >> index) & 1) == 1 {
44 mask |= 1 << dots_to_braille[index]
45 }
46 }
47
48 return rune(0x2800 + mask)
49}
50
51fn memoize_dots_to_braille_rune() [256]rune {
52 mut memo := [256]rune{}
53
54 for index in 0 .. 256 {
55 memo[index] = dots_to_braille_rune(index)
56 }
57
58 return memo
59}
60
61fn buffer_to_braille(buffer [][]bool, braille_mapping [256]rune) [][]rune {
62 out_rows := buffer.len / 4
63 out_cols := buffer[0].len / 2
64 mut output := [][]rune{len: out_rows, init: []rune{len: out_cols}}
65
66 for row := 0; row < out_rows; row += 1 {
67 row_offset := row * 4
68 for column := 0; column < out_cols; column += 1 {
69 col_offset := column * 2
70
71 mut dots := u8(buffer[row_offset + 0][col_offset + 0])
72 dots |= u8(buffer[row_offset + 0][col_offset + 1]) << 1
73 dots |= u8(buffer[row_offset + 1][col_offset + 0]) << 2
74 dots |= u8(buffer[row_offset + 1][col_offset + 1]) << 3
75 dots |= u8(buffer[row_offset + 2][col_offset + 0]) << 4
76 dots |= u8(buffer[row_offset + 2][col_offset + 1]) << 5
77 dots |= u8(buffer[row_offset + 3][col_offset + 0]) << 6
78 dots |= u8(buffer[row_offset + 3][col_offset + 1]) << 7
79
80 output[row][column] = dots_to_braille_rune(dots)
81 }
82 }
83
84 return output
85}
86
87fn create_buffer(width int, height int) [][]bool {
88 return [][]bool{len: height, init: []bool{len: width}}
89}
90
91fn test_main() {
92 braille_mapping := memoize_dots_to_braille_rune()
93 width, height := 40, 48
94 mut canvas := Canvas.new(width, height)
95 mut buffer := [][]bool{len: height, init: []bool{len: width}}
96
97 minr := 16 * 16
98 maxr := 20 * 20
99 for y := 0; y < 48; y += 1 {
100 for x := 0; x < width; x += 1 {
101 cy := y - 24
102 big_cx := x - 20
103 small_cx := x - 16
104 big := (big_cx * big_cx) + (cy * cy)
105 small := (small_cx * small_cx) + (cy * cy)
106 if small > minr && big < maxr {
107 buffer[y][x] = true
108 canvas.set(x, y)
109 }
110 }
111 }
112
113 _ := buffer_to_braille(buffer, braille_mapping)
114}
115