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

168 lines
3.4 KiB
Python

import os
import re
import string
import sys
import binascii
import math
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","")
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)
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
bitplane={}
for bit in range(0,bits_per_pixel):
bitplane[bit] = []
bytes = [0,0,0,0]
bit_cnt =0
cnt=0
last_progress = 0
for byte in raw:
cnt+=1
progress = cnt / (raw_len/100)
if (progress%10)==0:
if (progress>last_progress):
print "converting bmp to bitplane buffers %i%% done" % (progress)
last_progress = progress
if bits_per_pixel == 4 :
hi_nibble = (byte >> 4)
lo_nibble = byte & 16
hi_nibble_bin = ''
for nibble in (hi_nibble,lo_nibble):
for plane in range(bits_per_pixel-1,-1,-1):
if (nibble & (1 << plane)):
bytes[plane] |= 1 << bit_cnt
bit_cnt += 1
if (bit_cnt==8):
for i in range(0,bits_per_pixel):
bitplane[i].append(bytes[i])
bytes=[0,0,0,0]
bit_cnt =0
if bits_per_pixel == 1 :
bitplane[0] = raw
break
out='';
for plane in range(0,bits_per_pixel):
print "bitplane %i has %i bytes " % (plane,len(bitplane[plane]))
x_tiles = width / 8
y_tiles = height / 8
cnt=0
last_progress=0
fp = open(asmfile,'w')
tile_cnt = 0
out ="\n\n\n%s:\n\n" % (basename)
fp.write(out)
#for yt in range(0,y_tiles):
for yt in range(y_tiles-1,-1,-1): # needed for h flip
out ="; ### row %02x ### \n" % yt
fp.write(out)
progress = cnt / (raw_len/100)
if(progress%5)==0:
print "building asm include %i%% done" % (progress)
#last_progress = progress
for xt in range(0,x_tiles):
for plane in range(0,bits_per_pixel):
out = ' .db '
for y in range(((yt+1)*8)-1,(yt*8)-1,-1): # needed for h flip
#for y in range(yt*8,(yt+1)*8):
out += "$%02x," % bitplane[plane][(y*x_tiles)+xt]
cnt+=1
out = out[:-1]
out += ' ; tile=%02x plane=%02x row=%02x col=%02x \n' % (tile_cnt,plane,yt,xt)
fp.write(out)
tile_cnt+=1
fp.close()
if __name__ == '__main__':
if len(sys.argv) is 2:
main()
else:
print "usage: %s in out" % sys.argv[0]