quickdev16/snes/ascii/bmp2col.py
2009-04-05 18:47:38 +02:00

181 lines
3.1 KiB
Python

import os
import re
import string
import sys
import binascii
import math
class color:
def __init__(self,r,g,b):
self.r = r >> 3
self.g = g >> 3
self.b = b >> 3
self.snes = "$%04x" % (( self.b << 10 ) | (self.g << 5) | self.r )
def get(self):
return self.snes
def __str__(self):
return "r=0x%02x g=0x%02x b=0x%02x snes=%s" % ( self.r,self.g,self.b,self.snes)
def openfile(filename):
return open(filename)
def mk_sint(s):
a = ord(s[1])
b = ord(s[0])
return (a<<8) + b
def mk_int(s):
a = ord(s[3])
b = ord(s[2])
c = ord(s[1])
d = ord(s[0])
return (a<<32) + (b<<16) + (c<<8) + d
def main():
file = sys.argv[1]
asmfile = string.replace(file,".bmp",".s")
basename = string.replace(file,".bmp","")
if len(sys.argv) >= 3 and sys.argv[2] =='list' :
do_list = 1
else:
do_list = 0
if len(sys.argv) >= 4 and sys.argv[3] =='compress':
do_compress = 1
else:
do_compress = 0
fp =openfile(file)
header_offset = 14 + 40
data = fp.read()
fp.close()
type = mk_sint(data[0:2])
size = mk_int(data[2:6])
width = mk_int(data[18:22])
height = mk_int(data[22:26])
bits_per_pixel = mk_int(data[28:32])
num_of_colors = mk_int(data[46:50])
bytes_per_line = width / 8
bytes_per_line_padded = bytes_per_line + (4-(bytes_per_line % 4))
header = data[0:header_offset]
colors = data[header_offset: header_offset + (num_of_colors * 4)]
data = data[header_offset + (num_of_colors * 4):]
raw = []
for i in data:
raw.append(ord(i))
raw_len = len(raw)
palette = []
for i in range(0,len(colors),4):
palette.append(color(ord(colors[i+2]),ord(colors[i+1]),ord(colors[i])))
print "file:\t\t%s" % file
print "basename:\t%s" % asmfile
print "header info"
print "type: \t\t%04X " % type
print "size: \t\t%i bytes" % size
print "width: \t\t%i pixel" % width
print "height: \t%i pixel" % height
print "bit per pixel:\t%i" % bits_per_pixel
print "num of colors:\t%i" % num_of_colors
print "imagedata: \t%s bytes" % raw_len
print "per line: \t%i bytes" % bytes_per_line
print "per line pad: \t%i bytes" % bytes_per_line_padded
out='';
fp = open(asmfile,'w')
tile_cnt = 0
color_list = str()
value_list = str()
color_list="\n\n\n%s_color_list:\n\n" % (basename)
value_list ="\n\n\n%s_color_values:\n\n" % (basename)
out = " .db "
cnt=0
last = "";
repeat = 1;
for i in range(raw_len-1,-1,-width):
idx = raw[i]
col = palette[idx].get()
if col == last and do_compress:
repeat += 1
continue
else:
#print palette[idx]
last = col
if do_list:
value_list += " .db $%02x\n" % repeat
value_list += " .dw %s ;line=0x%02x\n" % (col, (height - (i/width)) )
out += "$%02x,$00," % repeat
repeat = 1
cnt +=1
if cnt == width/20:
cnt=0
out = out[:-1]
out +="\n"
color_list += out
out = " .db "
value_list += " .db 0\n"
color_list += " .db 0\n"
if do_list:
fp.write(color_list)
fp.write(value_list)
fp.close()
if __name__ == '__main__':
if len(sys.argv)>= 2:
main()
else:
print "usage: %s in [list] [compress]" % sys.argv[0]