aboutsummaryrefslogtreecommitdiff
path: root/tools/png2sprites.py
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2020-12-30 19:07:31 +0000
committerJuan J. Martinez <jjm@usebox.net>2020-12-30 19:23:41 +0000
commit2682bc5d1d864341aaeb42a449db73c3ecd16d70 (patch)
tree9116764364b4ee0ce7f6037305077807b57776de /tools/png2sprites.py
downloadubox-msx-lib-2682bc5d1d864341aaeb42a449db73c3ecd16d70.tar.gz
ubox-msx-lib-2682bc5d1d864341aaeb42a449db73c3ecd16d70.zip
Initial import1.0
Diffstat (limited to 'tools/png2sprites.py')
-rwxr-xr-xtools/png2sprites.py138
1 files changed, 138 insertions, 0 deletions
diff --git a/tools/png2sprites.py b/tools/png2sprites.py
new file mode 100755
index 0000000..a554433
--- /dev/null
+++ b/tools/png2sprites.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2019 by Juan J. Martinez <jjm@usebox.net>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+
+from argparse import ArgumentParser
+from PIL import Image
+
+__version__ = "1.0"
+
+DEF_W = 16
+DEF_H = 16
+
+TRANS = (28, 28, 28)
+
+
+def to_hex_list_str(src):
+ out = ""
+ for i in range(0, len(src), 8):
+ out += ', '.join(["0x%02x" % b for b in src[i:i + 8]]) + ',\n'
+ return out
+
+
+def to_hex_list_str_asm(src):
+ out = ""
+ for i in range(0, len(src), 8):
+ out += '\tdb ' + ', '.join(["#%02x" % b for b in src[i:i + 8]])
+ out += '\n'
+ return out
+
+
+def main():
+
+ parser = ArgumentParser(description="PNG to MSX spites",
+ epilog="Copyright (C) 2019 Juan J Martinez <jjm@usebox.net>",
+ )
+
+ parser.add_argument(
+ "--version", action="version", version="%(prog)s " + __version__)
+ parser.add_argument("-i", "--id", dest="id", default="sprites", type=str,
+ help="variable name (default: sprites)")
+ parser.add_argument("-a", "--asm", dest="asm", action="store_true",
+ help="ASM output (default: C header)")
+
+ parser.add_argument("image", help="image to convert")
+
+ args = parser.parse_args()
+
+ try:
+ image = Image.open(args.image)
+ except IOError:
+ parser.error("failed to open the image")
+
+ if image.mode != "RGB":
+ parser.error("not a RGB image")
+
+ (w, h) = image.size
+
+ if w % DEF_W or h % DEF_H:
+ parser.error("%s size is not multiple of sprite size (%s, %s)" %
+ (args.image, DEF_W, DEF_H))
+
+ data = image.getdata()
+
+ out = []
+ for y in range(0, h, DEF_H):
+ for x in range(0, w, DEF_W):
+ tile = [data[x + i + ((y + j) * w)]
+ for j in range(DEF_H) for i in range(DEF_W)]
+ cols = set([c for c in tile if c != TRANS])
+
+ if not cols:
+ continue
+
+ for c in cols:
+ frame = []
+ for i, j in ((0, 0), (0, 8), (8, 0), (8, 8)):
+ for m in range(8):
+ byte = 0
+ p = 7
+ for k in range(8):
+ b = 1 if tile[i + (j + m) * 16 + k] == c else 0
+ byte |= b << p
+ p -= 1
+ frame.append(byte)
+ out.append(frame)
+
+ if args.asm:
+ print("%s_LEN = %d" % (args.id.upper(), len(out) * 32))
+ print("%s_FRAMES = %d\n" % (args.id.upper(), len(out)))
+ print("%s:\n" % args.id)
+
+ for i, frame in enumerate(out):
+ print("%s_frame%d:" % (args.id, i))
+ print(to_hex_list_str_asm(frame))
+ else:
+ print("#ifndef _%s_H" % args.id.upper())
+ print("#define _%s_H\n" % args.id.upper())
+ print("#define %s_LEN %d\n" % (args.id.upper(), len(out) * 32))
+ print("#define %s_FRAMES %d\n" % (args.id.upper(), len(out)))
+
+ data_out = ""
+ for i, frame in enumerate(out):
+ data_out += '{\n' + to_hex_list_str(frame) + '}'
+ if i + 1 < len(out):
+ data_out += ',\n'
+
+ print("#ifdef LOCAL")
+ print("const unsigned char %s[%d][%d] = {\n%s\n};\n" % (
+ args.id, len(out), len(out[0]), data_out))
+
+ print("#else\n")
+ print("extern const unsigned char %s[%d][%d];" %
+ (args.id, len(out), len(out[0])))
+ print("#endif // LOCAL\n")
+ print("#endif // _%s_H\n" % args.id.upper())
+
+
+if __name__ == "__main__":
+ main()