porygon.py: Add palette map support.

current
Kiyoshi Aman 2017-12-08 16:53:34 -06:00
parent eaadbbd4d1
commit d197c0af06
1 changed files with 32 additions and 8 deletions

View File

@ -18,7 +18,7 @@ import os.path as op
from PyQt5.QtGui import QImage, QPixmap, QPainter, QGuiApplication from PyQt5.QtGui import QImage, QPixmap, QPainter, QGuiApplication
def linear1(tile): def linear1(tile, *args):
data = bytearray() data = bytearray()
for y in range(8): for y in range(8):
@ -32,7 +32,7 @@ def linear1(tile):
return bytes(data) return bytes(data)
def linear2(tile): def linear2(tile, palette):
data = bytearray() data = bytearray()
for y in range(8): for y in range(8):
@ -41,6 +41,8 @@ def linear2(tile):
for x in range(8): for x in range(8):
pixel = tile.pixelIndex(x, y) pixel = tile.pixelIndex(x, y)
if palette is not None:
pixel = palette[pixel]
a = pixel & 0x1 a = pixel & 0x1
b = pixel & 0x2 b = pixel & 0x2
@ -53,7 +55,7 @@ def linear2(tile):
return bytes(data) return bytes(data)
def planar2(tile): def planar2(tile, palette):
data = bytearray() data = bytearray()
for y in range(8): for y in range(8):
@ -62,6 +64,8 @@ def planar2(tile):
for x in range(4): for x in range(4):
pixel = tile.pixelIndex(x, y) pixel = tile.pixelIndex(x, y)
if palette is not None:
pixel = palette[pixel]
pixel &= 0x3 pixel &= 0x3
byte = byte + (pixel << x * 2) byte = byte + (pixel << x * 2)
@ -78,7 +82,7 @@ def planar2(tile):
return bytes(data) return bytes(data)
def linear4(tile): def linear4(tile, palette):
data = bytearray() data = bytearray()
for y in range(8): for y in range(8):
@ -89,6 +93,8 @@ def linear4(tile):
for x in range(8): for x in range(8):
pixel = tile.pixelIndex(x, y) pixel = tile.pixelIndex(x, y)
if palette is not None:
pixel = palette[pixel]
a = pixel & 0x1 a = pixel & 0x1
b = pixel & 0x2 b = pixel & 0x2
@ -128,7 +134,8 @@ def main():
print( print(
'''Usage: porygon.py image format '''Usage: porygon.py image format
image is an image file in PNG. image is an image file in PNG. The base filename is also used to find a
mapper in order to force palette modifications.
format is one of the supported formats:''' format is one of the supported formats:'''
) )
@ -139,6 +146,7 @@ format is one of the supported formats:'''
(image, format) = sys.argv[1:3] (image, format) = sys.argv[1:3]
(image_base, ext) = op.splitext(image) (image_base, ext) = op.splitext(image)
output = '{}.bin'.format(image_base) output = '{}.bin'.format(image_base)
mapper = image_base + '.txt'
if not op.exists('output/'): if not op.exists('output/'):
import os import os
@ -158,8 +166,24 @@ format is one of the supported formats:'''
height = data.height() height = data.height()
rows = int(height / 8) rows = int(height / 8)
columns = int(width / 8) columns = int(width / 8)
print(' {} rows'.format(rows))
print(' {} columns'.format(columns)) palette = {}
if op.exists(mapper):
print('Palette found. Loading...')
with open(mapper, mode='r') as f:
text = f.read().split('\n')
for line in text:
if line == '':
continue
a = line.split('=')
key = int(a[0])
value = int(a[1])
palette[key] = value
else:
print('No palette found.')
palette = None
print('Converting to {}'.format(format)) print('Converting to {}'.format(format))
counter = 0 counter = 0
@ -167,7 +191,7 @@ format is one of the supported formats:'''
for row in range(rows): for row in range(rows):
for column in range(columns): for column in range(columns):
tile = data.copy(column * 8, row * 8, 8, 8) tile = data.copy(column * 8, row * 8, 8, 8)
f.write(formats[format](tile)) f.write(formats[format](tile, palette))
counter += 1 counter += 1
if __name__ == '__main__': if __name__ == '__main__':