diff --git a/scripts/asset_packer.py b/scripts/asset_packer.py new file mode 100644 index 000000000..92d31950b --- /dev/null +++ b/scripts/asset_packer.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +from PIL import Image, ImageOps +import heatshrink2 +import pathlib +import shutil +import struct +import typing +import time +import io + + +def convert_bm(img: "Image.Image | pathlib.Path") -> bytes: + if not isinstance(img, Image.Image): + img = Image.open(img) + + with io.BytesIO() as output: + img = img.convert("1") + img = ImageOps.invert(img) + img.save(output, format="XBM") + xbm = output.getvalue() + + f = io.StringIO(xbm.decode().strip()) + data = f.read().strip().replace("\n", "").replace(" ", "").split("=")[1][:-1] + data_str = data[1:-1].replace(",", " ").replace("0x", "") + data_bin = bytearray.fromhex(data_str) + + data_encoded_str = heatshrink2.compress(data_bin, window_sz2=8, lookahead_sz2=4) + data_enc = bytearray(data_encoded_str) + data_enc = bytearray([len(data_enc) & 0xFF, len(data_enc) >> 8]) + data_enc + + if len(data_enc) < len(data_bin) + 1: + return b"\x01\x00" + data_enc + else: + return b"\x00" + data_bin + + +def convert_bmx(img: "Image.Image | pathlib.Path") -> bytes: + if not isinstance(img, Image.Image): + img = Image.open(img) + + data = struct.pack("