diff --git a/tools/make-dotcode.py b/tools/make-dotcode.py index bda0580c7..1a2d7160c 100644 --- a/tools/make-dotcode.py +++ b/tools/make-dotcode.py @@ -34,8 +34,6 @@ for i in range(16): for i in range(16): gg[i] = rev[gg[i]] -print(*[hex(x) for x in gg]) - def interleave(data, header): data = data.reshape([-1, 48]).T new_data = np.zeros((64, data.shape[1]), dtype=data.dtype) @@ -88,67 +86,69 @@ def bin2raw(data): new_data = interleave(np.frombuffer(data, np.uint8), header) return new_data.tobytes() -with open(sys.argv[1], 'rb') as f: - data = f.read() -size = len(data) - -if size in (1344, 2112): - data = bin2raw(data) +def make_dotcode(data): size = len(data) - with open('dotcode.raw', 'wb') as f: - f.write(data) -blocks = size // blocksize -height = 36 -width = 35 -margin = 2 + if size in (1344, 2112): + data = bin2raw(data) + size = len(data) -dots = np.zeros((width * blocks + margin * 2 + 1, height + margin * 2), dtype=np.bool) -anchor = np.array([[0, 1, 1, 1, 0], - [1, 1, 1, 1, 1], - [1, 1, 1, 1, 1], - [1, 1, 1, 1, 1], - [0, 1, 1, 1, 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=np.bool) -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, 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]] -addr = [0x03FF] -for i in range(1, 54): - addr.append(addr[i - 1] ^ ((i & -i) * 0x769)) - if (i & 0x07) == 0: - addr[i] ^= 0x769 - if (i & 0x0F) == 0: - addr[i] ^= 0x769 << 1 - if (i & 0x1F) == 0: - addr[i] ^= (0x769 << 2) ^ 0x769 + blocks = size // blocksize + height = 36 + width = 35 + margin = 2 -base = 1 if blocks == 18 else 25 -for i in range(blocks + 1): - 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 + margin, margin + 5] = 1 - a = addr[base + i] - for j in range(16): - dots[i * width + margin, margin + 14 + j] = a & (1 << (15 - j)) -for i in range(blocks): - dots[i * width:(i + 1) * width, margin] = alignment - dots[i * width:(i + 1) * width, height + margin - 1] = alignment - block = [] - for byte in data[i * blocksize:(i + 1) * blocksize]: - block.extend(nybbles[byte >> 4]) - block.extend(nybbles[byte & 0xF]) - j = 0 - for y in range(3): - dots[i * width + margin + 5:i * width + margin + 31, margin + 2 + y] = block[j:j + 26] - j += 26 - for y in range(26): - dots[i * width + margin + 1:i * width + margin + 35, margin + 5 + y] = block[j:j + 34] - j += 34 - for y in range(3): - dots[i * width + margin + 5:i * width + margin + 31, margin + 31 + y] = block[j:j + 26] - j += 26 -im = PIL.Image.fromarray(dots.T) + dots = np.zeros((width * blocks + margin * 2 + 1, height + margin * 2), dtype=bool) + anchor = np.array([[0, 1, 1, 1, 0], + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1], + [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=bool) + 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, 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]] + addr = [0x03FF] + for i in range(1, 54): + addr.append(addr[i - 1] ^ ((i & -i) * 0x769)) + if (i & 0x07) == 0: + addr[i] ^= 0x769 + if (i & 0x0F) == 0: + addr[i] ^= 0x769 << 1 + if (i & 0x1F) == 0: + addr[i] ^= (0x769 << 2) ^ 0x769 + + base = 1 if blocks == 18 else 25 + for i in range(blocks + 1): + 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 + margin, margin + 5] = 1 + a = addr[base + i] + for j in range(16): + dots[i * width + margin, margin + 14 + j] = a & (1 << (15 - j)) + for i in range(blocks): + dots[i * width:(i + 1) * width, margin] = alignment + dots[i * width:(i + 1) * width, height + margin - 1] = alignment + block = [] + for byte in data[i * blocksize:(i + 1) * blocksize]: + block.extend(nybbles[byte >> 4]) + block.extend(nybbles[byte & 0xF]) + j = 0 + for y in range(3): + dots[i * width + margin + 5:i * width + margin + 31, margin + 2 + y] = block[j:j + 26] + j += 26 + for y in range(26): + dots[i * width + margin + 1:i * width + margin + 35, margin + 5 + y] = block[j:j + 34] + j += 34 + for y in range(3): + dots[i * width + margin + 5:i * width + margin + 31, margin + 31 + y] = block[j:j + 26] + j += 26 + 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.save('dotcode.png') +im.save('dotcode.bmp')