Skip to content

Commit

Permalink
Add tools/palfix.py, and make Python tools executable
Browse files Browse the repository at this point in the history
  • Loading branch information
Rangi42 committed Mar 15, 2021
1 parent ec1fe07 commit ee36bd9
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 0 deletions.
Empty file modified tools/free_space.py
100644 → 100755
Empty file.
Empty file modified tools/gfx.py
100644 → 100755
Empty file.
62 changes: 62 additions & 0 deletions tools/palfix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function

import sys
from pokemontools import png

def rgb8_to_rgb5(c):
r, g, b = c
return (r // 8, g // 8, b // 8)

def rgb5_to_rgb8(c):
r, g, b = c
return ((r * 8) | (r // 4), (g * 8) | (g // 4), (b * 8) | (b // 4))

def invert(c):
r, g, b = c
return (31 - r, 31 - g, 31 - b)

def luminance(c):
r, g, b = c
return (0.299 * r**2 + 0.587 * g**2 + 0.114 * b**2)**0.5

def rgb5_pixels(row):
for x in range(0, len(row), 4):
yield rgb8_to_rgb5(row[x:x+3])

def fix_pal(filename):
with open(filename, 'rb') as file:
width, height, data = png.Reader(file).asRGBA8()[:3]
data = list(data)
b_and_w = {(0, 0, 0), (31, 31, 31)}
colors = set(c for row in data for c in rgb5_pixels(row)) - b_and_w
if not colors:
colors = {(20, 20, 20), (10, 10, 10)}
elif len(colors) == 1:
c = colors.pop()
colors = {c, invert(c)}
elif len(colors) != 2:
return False
palette = tuple(sorted(colors | b_and_w, key=luminance, reverse=True))
assert len(palette) == 4
data = [list(map(palette.index, rgb5_pixels(row))) for row in data]
palette = tuple(map(rgb5_to_rgb8, palette))
writer = png.Writer(width, height, palette=palette, compression=9)
with open(filename, 'wb') as file:
writer.write(file, data)
return True

def main():
if len(sys.argv) < 2:
print('Usage: %s pic.png' % sys.argv[0], file=sys.stderr)
sys.exit(1)
for filename in sys.argv[1:]:
if not filename.lower().endswith('.png'):
print(filename, 'is not a .png file!', file=sys.stderr)
elif not fix_pal(filename):
print(filename, 'has too many colors!', file=sys.stderr)

if __name__ == '__main__':
main()
Empty file modified tools/sym_comments.py
100644 → 100755
Empty file.
Empty file modified tools/used_space.py
100644 → 100755
Empty file.

0 comments on commit ee36bd9

Please sign in to comment.