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