aboutsummaryrefslogtreecommitdiff
path: root/tools/dump-pal.py
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-11-05 11:22:55 +0000
committerJuan J. Martinez <jjm@usebox.net>2023-11-05 11:31:28 +0000
commit2fbdf974338bde8576efdae40a819a76b2391033 (patch)
tree64d41a37470143f142344f9a439d96de3e7918c2 /tools/dump-pal.py
downloadkitsunes-curse-2fbdf974338bde8576efdae40a819a76b2391033.tar.gz
kitsunes-curse-2fbdf974338bde8576efdae40a819a76b2391033.zip
Initial import of the open source release
Diffstat (limited to 'tools/dump-pal.py')
-rwxr-xr-xtools/dump-pal.py132
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()