diff options
author | Juan J. Martinez <jjm@usebox.net> | 2023-11-05 11:22:55 +0000 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2023-11-05 11:31:28 +0000 |
commit | 2fbdf974338bde8576efdae40a819a76b2391033 (patch) | |
tree | 64d41a37470143f142344f9a439d96de3e7918c2 /tools/dump-pal.py | |
download | kitsunes-curse-2fbdf974338bde8576efdae40a819a76b2391033.tar.gz kitsunes-curse-2fbdf974338bde8576efdae40a819a76b2391033.zip |
Initial import of the open source release
Diffstat (limited to 'tools/dump-pal.py')
-rwxr-xr-x | tools/dump-pal.py | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/tools/dump-pal.py b/tools/dump-pal.py new file mode 100755 index 0000000..84c52e3 --- /dev/null +++ b/tools/dump-pal.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 + +__version__ = "1.0" + +from argparse import ArgumentParser +from PIL import Image + +# firmware +CPC_PAL = ( + [0, 0, 0], + [0, 0, 128], + [0, 0, 255], + [128, 0, 0], + [128, 0, 128], + [128, 0, 255], + [255, 0, 0], + [255, 0, 128], + [255, 0, 255], + [0, 128, 0], + [0, 128, 128], + [0, 128, 255], + [128, 128, 0], + [128, 128, 128], + [128, 128, 255], + [255, 128, 0], + [255, 128, 128], + [255, 128, 255], + [0, 255, 0], + [0, 255, 128], + [0, 255, 255], + [128, 255, 0], + [128, 255, 128], + [128, 255, 255], + [255, 255, 0], + [255, 255, 128], + [255, 255, 255], +) + +SW_TO_HW = ( + 0x54, + 0x44, + 0x55, + 0x5C, + 0x58, + 0x5D, + 0x4C, + 0x45, + 0x4D, + 0x56, + 0x46, + 0x57, + 0x5E, + 0x40, + 0x5F, + 0x4E, + 0x47, + 0x4F, + 0x52, + 0x42, + 0x53, + 0x5A, + 0x59, + 0x5B, + 0x4A, + 0x43, + 0x4B, +) + + +def main(): + + parser = ArgumentParser( + description="PNG to CPC palette (firmware)", + epilog="Copyright (C) 2015-2023 Juan J Martinez <jjm@usebox.net>", + ) + + parser.add_argument( + "--version", action="version", version="%(prog)s " + __version__ + ) + parser.add_argument("--header", dest="header", action="store_true") + parser.add_argument("--hardware", dest="hardware", action="store_true") + parser.add_argument("image", help="image to convert") + parser.add_argument( + "pal_dump", + help="filename for the palette dump (variable if header flag is set)", + ) + + args = parser.parse_args() + + try: + image = Image.open(args.image) + except IOError: + parser.error("failed to open the image") + + if image.mode != "P": + parser.error("not an indexed image (no palette)") + + palette = image.getpalette() + if not palette: + parser.error("failed to extract the palette (is this an indexed image?)") + + rgb = [] + for i in range(0, 16 * 3, 3): + c = palette[i : i + 3] + if c not in CPC_PAL: + parser.error("%r not in the CPC palette" % c) + rgb.append(c) + + out = [CPC_PAL.index(c) for c in rgb] + if len(out) < 16: + out.extend([0 for _ in range(16 - len(out))]) + + if args.hardware: + out = [SW_TO_HW[c] for c in out[:]] + + if args.header: + print("/* %s palette */" % ("hardware" if args.hardware else "firmware")) + print("#ifdef LOCAL") + print( + "const unsigned char %s[] = { %s };\n" + % (args.pal_dump, ", ".join([hex(c) for c in out])) + ) + print("#else") + print("extern const unsigned char %s[];\n" % (args.pal_dump)) + print("#endif") + else: + with open(args.pal_dump, "wb") as fd: + fd.write(bytearray(out)) + + +if __name__ == "__main__": + main() |