1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
#!/usr/bin/python
import sys
import Image
def enc_backbuffer(backbuffer):
compdata = []
if len(backbuffer) == 0:
return compdata
while len(backbuffer) > 128:
compdata.append(127)
compdata.extend(backbuffer[0:128])
backbuffer = backbuffer[128:]
compdata.append(len(backbuffer)-1)
compdata.extend(backbuffer)
return compdata
def packbits(rawdata):
compdata = []
backbuffer = []
while len(rawdata) >= 3:
c = rawdata[0]
if rawdata[1] == c and rawdata[2] == c:
runlength = 3
while runlength < 130 and len(rawdata) > runlength:
if rawdata[runlength] == c:
runlength = runlength + 1
else:
break
compdata.extend(enc_backbuffer(backbuffer))
backbuffer = []
compdata.append(runlength + 125)
compdata.append(c)
rawdata = rawdata[runlength:]
else:
backbuffer.append(c)
rawdata = rawdata[1:]
backbuffer.extend(rawdata)
compdata.extend(enc_backbuffer(backbuffer))
return compdata
for filename in sys.argv[1:]:
origimage = Image.open(filename)
(width, height) = origimage.size
mode = origimage.mode
data = origimage.getdata()
print "%s: %d x %d %s" % (filename, width, height, mode)
basename = filename[:-4]
identname = basename.replace("-", "_")
planecount = 1
imgmode = 0
rawdata = []
if mode == "RGB" or mode == "RGBA":
planes = [ [], [], [] ]
for pixcount in range(0, width*height):
pixeldata = data[pixcount]
planes[0].append(pixeldata[2])
planes[1].append(pixeldata[1])
planes[2].append(pixeldata[0])
if planes[0] == planes[1] and planes[0] == planes[2]:
print " encoding as greyscale"
planecount = 1
rawdata.extend(planes[0])
if basename[0:4] == "font":
print " font detected, using alpha-only mode"
imgmode = 1
# invert all values
rawdata = map(lambda x: 255-x, rawdata)
else:
print " encoding as true color"
planecount = 3
rawdata.extend(planes[0])
rawdata.extend(planes[1])
rawdata.extend(planes[2])
else:
print " Mode not supported!"
continue
rawlen = len(rawdata)
compdata = packbits(rawdata)
complen = len(compdata)
print " compressed %d to %d" % (rawlen, complen)
output = """static UINT8 image_%s_compdata[] = {
""" % identname
for i in range(0, len(compdata)):
output = output + " 0x%02x," % compdata[i]
if (i % 12) == 11:
output = output + "\n"
output = output + """
};
static BUILTIN_IMAGE image_%s = { NULL, %d, %d, %d, %d, image_%s_compdata, %d };
""" % (identname, width, height, imgmode, planecount, identname, len(compdata))
f = file("image_%s.h" % identname, "w")
f.write(output)
f.close()
print "Done!"
|