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