Skip to content

Commit 19739ed

Browse files
committed
code and tests
1 parent 46586b1 commit 19739ed

File tree

2 files changed

+172
-0
lines changed

2 files changed

+172
-0
lines changed

src/TerminalGraphics.jl

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
"""
2+
Block and braile rendering of julia arrays, for terminal graphics.
3+
"""
4+
module TerminalGraphics
5+
6+
export blockize, brailize
7+
8+
blockize(a, cutoff=0) = blockize(a, cutoff, 1:size(a, 1), 1:size(a, 2))
9+
blockize(a, cutoff, yrange, xrange) = begin
10+
out = Array{Char,2}(undef, length(xrange) + 1, (length(yrange) - 1) ÷ 2 + 1)
11+
blockize!(out, a, cutoff, yrange, xrange)
12+
end
13+
14+
blockize!(out, a, cutoff, yrange, xrange) = join(block_array!(out, a, cutoff, yrange, xrange))
15+
16+
function block_array!(out, a, cutoff, yrange, xrange)
17+
for y in yrange.start:2:yrange.stop
18+
for x in xrange
19+
top = checkval(a, y, x, yrange, xrange, cutoff)
20+
bottom = checkval(a, y + 1, x, yrange, xrange, cutoff)
21+
if top
22+
ch = bottom ? '' : ''
23+
else
24+
ch = bottom ? '' : ' '
25+
end
26+
out[x-xrange.start + 1, (y-yrange.start) ÷ 2 + 1] = Char(ch)
27+
end
28+
# Return after every column
29+
out[end, (y-yrange.start) ÷ 2 + 1] = Char('\n')
30+
end
31+
# The last character is null
32+
out[end, end] = 0x00
33+
out
34+
end
35+
36+
const braile_hex = ((0x01, 0x08), (0x02, 0x10), (0x04, 0x20), (0x40, 0x80))
37+
38+
brailize(a, cutoff=0) = brailize(a, cutoff, 1:size(a, 1), 1:size(a, 2))
39+
brailize(a, cutoff, yrange, xrange) = begin
40+
out = Array{Char,2}(undef, (length(xrange) - 1) ÷ 2 + 2, (length(yrange) - 1) ÷ 4 + 1)
41+
brailize!(out, a, cutoff, yrange, xrange)
42+
end
43+
44+
brailize!(out, a, cutoff, yrange, xrange) = join(braile_array!(out, a, cutoff, yrange, xrange))
45+
46+
function braile_array!(out, a, cutoff, yrange, xrange)
47+
for y = yrange.start:4:yrange.stop
48+
for x = xrange.start:2:xrange.stop
49+
ch = 0x2800
50+
for j = 0:3, i = 0:1
51+
if checkval(a, y+j, x+i, yrange, xrange, cutoff)
52+
ch += braile_hex[j % 4 + 1][i % 2 + 1]
53+
end
54+
end
55+
out[(x - xrange.start) ÷ 2 + 1, (y-yrange.start) ÷ 4 + 1] = ch
56+
end
57+
# Return after every column
58+
out[end, (y-yrange.start) ÷ 4 + 1] = Char('\n')
59+
end
60+
# The last character is null
61+
out[end, end] = 0x00
62+
out
63+
end
64+
65+
checkval(a, y, x, yrange, xrange, cutoff) = begin
66+
if x <= xrange.stop && y <= yrange.stop
67+
a[y, x] > cutoff
68+
else
69+
false
70+
end
71+
end
72+
73+
end # module

test/runtests.jl

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
using TerminalGraphics,
2+
Test
3+
4+
pac = [0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0;
5+
0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0;
6+
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0;
7+
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0;
8+
0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0;
9+
0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0;
10+
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0;
11+
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0;
12+
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0;
13+
1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0;
14+
1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1;
15+
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0;
16+
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0;
17+
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0;
18+
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0;
19+
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0;
20+
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0;
21+
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0;
22+
0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0;
23+
0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0]
24+
25+
26+
block_pac = """
27+
▄▄██████▄▄
28+
▄██████████████▄
29+
▄███████ ████████
30+
▄██████████████▀▀
31+
███████████▀▀
32+
███████████▄▄ ▀
33+
▀██████████████▄▄
34+
▀█████████████████
35+
▀██████████████▀
36+
▀▀██████▀▀ \0"""
37+
38+
test_pac = blockize(pac)
39+
@test test_pac == block_pac
40+
println(test_pac, "\n\n", block_pac, "\n\n")
41+
42+
43+
brail_pac =
44+
"""
45+
⠀⣠⣴⣾⣿⣿⣷⣦⣄⠀
46+
⣰⣿⣿⣿⣧⣼⣿⡿⠟⠃
47+
⣿⣿⣿⣿⣿⣏⡁⠀⠀⠠
48+
⠹⣿⣿⣿⣿⣿⣿⣷⣦⡄
49+
⠀⠙⠻⢿⣿⣿⡿⠟⠋⠀\0"""
50+
51+
test_pac = brailize(pac)
52+
@test test_pac == brail_pac
53+
println(test_pac, "\n\n", brail_pac, "\n\n")
54+
55+
56+
ghost = [1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0;
57+
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0;
58+
1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0;
59+
0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0;
60+
1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0;
61+
0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0;
62+
1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0;
63+
0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0;
64+
1.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 0.0 1.0;
65+
0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0;
66+
1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0;
67+
0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0;
68+
1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0;
69+
0.0 0.0 0.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0;
70+
1.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 0.0 1.0;
71+
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0;
72+
1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]
73+
74+
75+
block_ghost =
76+
"""
77+
▄▄████▄▄
78+
▄▀▀████▀▀██▄
79+
▄▄ ██▄▄ ██
80+
██▀ ▄███▀ ▄███
81+
██████████████
82+
██▀███▀▀███▀██
83+
▀ ▀▀ ▀▀ ▀\0"""
84+
85+
test_ghost = blockize(ghost, 0.5, 3:15, 4:17)
86+
@test test_ghost == block_ghost
87+
println(test_ghost, "\n\n", block_ghost, "\n\n")
88+
89+
90+
braile_ghost =
91+
"""
92+
⠀⣠⣴⣶⣦⣄⠀
93+
⣨⡄⢹⣯⡄⢹⣇
94+
⣿⣶⣿⣿⣶⣿⣿
95+
⠋⠈⠛⠀⠛⠁⠙\0"""
96+
97+
test_ghost = brailize(ghost, 0.5, 2:15, 4:17)
98+
@test test_ghost == braile_ghost
99+
println(test_ghost, "\n\n", braile_ghost)

0 commit comments

Comments
 (0)