123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- 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]
|