]> git.tdb.fi Git - libs/gl.git/blobdiff - scripts/maketex.py
Use more efficient methods to manipulate and store texture data
[libs/gl.git] / scripts / maketex.py
index 57380c0b7a5ef11b1fa4c3883bc594a38cddc6f9..72ff49acb7a1173e536a72721bed4844bd7f5065 100755 (executable)
@@ -13,8 +13,21 @@ def escape(str):
                        result += c
        return result
 
+def values(data, size):
+       for y in range(size[1]-1, -1, -1):
+               for x in range(size[0]):
+                       yield data[x+y*size[0]]
+
+def values_multi(data, size):
+       for y in range(size[1]-1, -1, -1):
+               for x in range(size[0]):
+                       for c in data[x+y*size[0]]:
+                               yield c
+
 def make_tex(fn, mipmap=False, srgb=False):
        from PIL import Image
+       import base64
+       import codecs
 
        img = Image.open(fn)
 
@@ -30,15 +43,12 @@ def make_tex(fn, mipmap=False, srgb=False):
        result = "storage {} {} {};\n".format(fmt, img.size[0], img.size[1])
        if mipmap:
                result += "generate_mipmap true;\n"
-       result += "raw_data \""
-       data = list(img.getdata())
-       for y in range(img.size[1]):
-               i = (img.size[1]-1-y)*img.size[0]
-               if len(img.getbands())==1:
-                       result += escape("".join([chr(v) for v in data[i:i+img.size[0]]]))
-               else:
-                       result += escape("".join(["".join([chr(v) for v in p]) for p in data[i:i+img.size[0]]]))
-       result += "\";\n"
+
+       if len(img.getbands())==1:
+               pixels = values(img.getdata(), img.size)
+       else:
+               pixels = values_multi(img.getdata(), img.size)
+       result += "raw_data ={}=;\n".format(codecs.decode(base64.b64encode(bytes(pixels)), "ascii"))
 
        return result