]> code.delx.au - refind/blobdiff - images/imgprepare.py
Added raw images directory for those who might want to change &
[refind] / images / imgprepare.py
diff --git a/images/imgprepare.py b/images/imgprepare.py
new file mode 100755 (executable)
index 0000000..306f3cc
--- /dev/null
@@ -0,0 +1,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!"