SummerCart64/sw/bootloader/tools/asset_converter.py
2023-12-14 19:26:54 +01:00

71 lines
1.9 KiB
Python

#!/usr/bin/env python3
import sys
from PIL import Image
def compress(data: bytes, step_size: int=4) -> bytes:
uncompressed_length = len(data)
if ((uncompressed_length % step_size) != 0):
raise ValueError(f'Data length not aligned to {step_size}')
compressed_data = bytes()
compressed_data += uncompressed_length.to_bytes(4, byteorder='big')
count = 0
last_value = b''
for offset in range(0, uncompressed_length + step_size, step_size):
next_value = data[offset:(offset + step_size)]
if (offset != 0):
if ((next_value == last_value) and (count < 255)):
count += 1
else:
compressed_data += count.to_bytes(1, byteorder='big')
compressed_data += last_value
count = 0
last_value = next_value
return compressed_data
if __name__ == '__main__':
if (len(sys.argv) < 3):
print(f'Usage: python {sys.argv[0]} input_path output_path [--compress]')
sys.exit(1)
asset_input = sys.argv[1]
asset_output = sys.argv[2]
asset_compress = len(sys.argv) > 3 and (sys.argv[3] == '--compress')
source_asset = None
final_asset = None
try:
source_asset = Image.open(asset_input)
converted_asset = source_asset.convert('RGB').tobytes()
if (asset_compress):
converted_asset = compress(converted_asset, step_size=3)
final_asset = open(asset_output, 'wb')
final_asset.write(converted_asset)
except FileNotFoundError:
print(f'Couldn\'t open file "{asset_input}"')
sys.exit(2)
except Exception as e:
print(e)
sys.exit(3)
finally:
if (source_asset):
source_asset.close()
if (final_asset):
final_asset.close()