168 lines
3.4 KiB
Python
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]
|
|
|
|
|
|
|
|
|