1
0
Fork 0
radmatrix/firmware/scripts/gfx_convert.py

99 lines
2.5 KiB
Python

# read gfx folder
import os
import sys
import PIL
from PIL import Image
def get_all_gfx():
gfx = []
for root, dirs, files in os.walk("gfx"):
for file in files:
if file.startswith("."):
continue
# file name without extention
name = os.path.splitext(file)[0]
gfx.append((name, os.path.join(root, file)))
gfx.sort()
return gfx
def to_code(name, path):
img = Image.open(path)
img = img.convert("1", dither=Image.Dither.FLOYDSTEINBERG)
w, h = img.size
code = f"uint32_t gfx_{name}[{h}] = {'{'}\n"
for y in range(h):
code += " 0b"
for x in range(w):
px = img.getpixel((x, y))
code += '0' if px == 0 else '1'
code += ",\n"
code += "};\n\n"
return code
def generate_gfx():
gfx = get_all_gfx()
gfx_code = ''.join(to_code(name, path) for name, path in gfx)
header = f"#pragma once\n#include <Arduino.h>\n\n/* DO NOT MODIFY - AUTOGENERATED! */\n\n"
index = f"uint32_t* frames[{len(gfx)}] = {'{'}\n"
for name, _ in gfx:
index += f" gfx_{name},\n"
index += "};\n"
with open("src/gfx.h", "w") as f:
f.write(header)
f.write("#define GFX_COUNT " + str(len(gfx)) + "\n\n")
f.write(gfx_code)
f.write(index)
print("gfx.h generated!")
def png_to_code(name, path):
file = open(path, "rb")
data = file.read()
size = len(data)
code = f"static const uint8_t png_{name}[{size}] = {'{'}"
for i in range(size):
code += f"0x{data[i]:02x},"
code += "};\n"
code += f"#define PNG_SIZE_{name} {size}\n\n"
return code
def generate_png_gfx():
gfx = get_all_gfx()
gfx_code = ''.join(png_to_code(name, path) for name, path in gfx)
header = f"#pragma once\n#include <Arduino.h>\n\n/* DO NOT MODIFY - AUTOGENERATED! */\n\n"
index = f"static const uint8_t* png_frames[{len(gfx)}] = {'{'}"
for name, _ in gfx:
index += f"png_{name},"
index += "};\n\n"
size_index = f"size_t png_frame_sizes[{len(gfx)}] = {'{'}"
for name, _ in gfx:
size_index += f"PNG_SIZE_{name},"
size_index += "};\n"
with open("src/gfx_png.h", "w") as f:
f.write(header)
f.write("#define PNG_COUNT " + str(len(gfx)) + "\n\n")
f.write(gfx_code)
f.write(index)
f.write(size_index)
print("gfx_png.h generated!")
if __name__ == "__main__":
# generate_gfx()
generate_png_gfx()