File: imgprepare.py

package info (click to toggle)
refit 0.14-2
  • links: PTS
  • area: main
  • in suites: squeeze, wheezy
  • size: 2,840 kB
  • ctags: 3,282
  • sloc: ansic: 13,877; python: 631; objc: 319; makefile: 92; perl: 45; sh: 16
file content (114 lines) | stat: -rwxr-xr-x 3,104 bytes parent folder | download | duplicates (7)
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!"