Tools: Spit out dotcodes that mGBA can read

This commit is contained in:
Vicki Pfau 2021-03-30 23:45:38 -07:00
parent 4bb8744cd5
commit 2e0c245e2d

View File

@ -34,8 +34,6 @@ for i in range(16):
for i in range(16): for i in range(16):
gg[i] = rev[gg[i]] gg[i] = rev[gg[i]]
print(*[hex(x) for x in gg])
def interleave(data, header): def interleave(data, header):
data = data.reshape([-1, 48]).T data = data.reshape([-1, 48]).T
new_data = np.zeros((64, data.shape[1]), dtype=data.dtype) new_data = np.zeros((64, data.shape[1]), dtype=data.dtype)
@ -88,34 +86,31 @@ def bin2raw(data):
new_data = interleave(np.frombuffer(data, np.uint8), header) new_data = interleave(np.frombuffer(data, np.uint8), header)
return new_data.tobytes() return new_data.tobytes()
with open(sys.argv[1], 'rb') as f: def make_dotcode(data):
data = f.read() size = len(data)
size = len(data)
if size in (1344, 2112): if size in (1344, 2112):
data = bin2raw(data) data = bin2raw(data)
size = len(data) size = len(data)
with open('dotcode.raw', 'wb') as f:
f.write(data)
blocks = size // blocksize blocks = size // blocksize
height = 36 height = 36
width = 35 width = 35
margin = 2 margin = 2
dots = np.zeros((width * blocks + margin * 2 + 1, height + margin * 2), dtype=np.bool) dots = np.zeros((width * blocks + margin * 2 + 1, height + margin * 2), dtype=bool)
anchor = np.array([[0, 1, 1, 1, 0], anchor = np.array([[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1], [1, 1, 1, 1, 1],
[1, 1, 1, 1, 1], [1, 1, 1, 1, 1],
[1, 1, 1, 1, 1], [1, 1, 1, 1, 1],
[0, 1, 1, 1, 0]], dtype=np.bool) [0, 1, 1, 1, 0]], dtype=bool)
alignment = np.array([1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0], dtype=np.bool) alignment = np.array([1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0], dtype=bool)
nybbles = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 1], [0, 0, 0, 1, 0], [1, 0, 0, 1, 0], nybbles = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 1], [0, 0, 0, 1, 0], [1, 0, 0, 1, 0],
[0, 0, 1, 0, 0], [0, 0, 1, 0, 1], [0, 0, 1, 1, 0], [1, 0, 1, 1, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 1], [0, 0, 1, 1, 0], [1, 0, 1, 1, 0],
[0, 1, 0, 0, 0], [0, 1, 0, 0, 1], [0, 1, 0, 1, 0], [1, 0, 1, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 1], [0, 1, 0, 1, 0], [1, 0, 1, 0, 0],
[0, 1, 1, 0, 0], [0, 1, 1, 0, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 0]] [0, 1, 1, 0, 0], [0, 1, 1, 0, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 0]]
addr = [0x03FF] addr = [0x03FF]
for i in range(1, 54): for i in range(1, 54):
addr.append(addr[i - 1] ^ ((i & -i) * 0x769)) addr.append(addr[i - 1] ^ ((i & -i) * 0x769))
if (i & 0x07) == 0: if (i & 0x07) == 0:
addr[i] ^= 0x769 addr[i] ^= 0x769
@ -124,15 +119,15 @@ for i in range(1, 54):
if (i & 0x1F) == 0: if (i & 0x1F) == 0:
addr[i] ^= (0x769 << 2) ^ 0x769 addr[i] ^= (0x769 << 2) ^ 0x769
base = 1 if blocks == 18 else 25 base = 1 if blocks == 18 else 25
for i in range(blocks + 1): for i in range(blocks + 1):
dots[i * width:i * width + 5, 0:5] = anchor dots[i * width:i * width + 5, 0:5] = anchor
dots[i * width:i * width + 5, height + margin * 2 - 5:height + margin * 2] = anchor dots[i * width:i * width + 5, height + margin * 2 - 5:height + margin * 2] = anchor
dots[i * width + margin, margin + 5] = 1 dots[i * width + margin, margin + 5] = 1
a = addr[base + i] a = addr[base + i]
for j in range(16): for j in range(16):
dots[i * width + margin, margin + 14 + j] = a & (1 << (15 - j)) dots[i * width + margin, margin + 14 + j] = a & (1 << (15 - j))
for i in range(blocks): for i in range(blocks):
dots[i * width:(i + 1) * width, margin] = alignment dots[i * width:(i + 1) * width, margin] = alignment
dots[i * width:(i + 1) * width, height + margin - 1] = alignment dots[i * width:(i + 1) * width, height + margin - 1] = alignment
block = [] block = []
@ -149,6 +144,11 @@ for i in range(blocks):
for y in range(3): for y in range(3):
dots[i * width + margin + 5:i * width + margin + 31, margin + 31 + y] = block[j:j + 26] dots[i * width + margin + 5:i * width + margin + 31, margin + 31 + y] = block[j:j + 26]
j += 26 j += 26
im = PIL.Image.fromarray(dots.T) return np.pad(dots.T, 2)
with open(sys.argv[1], 'rb') as f:
dots = make_dotcode(f.read())
im = PIL.Image.fromarray(dots)
im = PIL.ImageChops.invert(im) im = PIL.ImageChops.invert(im)
im.save('dotcode.png') im.save('dotcode.bmp')