-#!/usr/bin/python
+#!/usr/bin/python3
def escape(str):
result = ""
elif c=='\\':
result += '\\\\'
elif ord(c)<0x20:
- result += "\\%03o"%ord(c)
+ result += "\\{:03o}".format(ord(c))
else:
result += c
- return result;
+ 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, filter="LINEAR", anisotropy=0, wrap=None, srgb=False):
- import Image
+def make_tex(fn, mipmap=False, srgb=False):
+ from PIL import Image
+ import base64
+ import codecs
img = Image.open(fn)
fmt = "".join(img.getbands())
if fmt=="LA":
- fmt = "LUMINANCE_ALPHA"
+ fmt = "LUMINANCE8_ALPHA8"
elif fmt=="L":
- fmt = "LUMINANCE"
+ fmt = "LUMINANCE8"
if srgb:
fmt = "S"+fmt
- result = "storage %s %d %d;\n"%(fmt, img.size[0], img.size[1])
- result += "filter %s;\n"%filter
- if "MIPMAP" in filter:
+ result = "storage {} {} {};\n".format(fmt, img.size[0], img.size[1])
+ if mipmap:
result += "generate_mipmap true;\n"
- if anisotropy:
- result += "max_anisotropy %d;\n"%anisotropy
- if wrap:
- result += "wrap %s;\n"%wrap
- result += "raw_data \""
- data = list(img.getdata())
- for y in range(img.size[1]):
- i = (img.size[1]-1-y)*img.size[0]
- 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
parser = argparse.ArgumentParser()
parser.add_argument("-o", "--output", metavar="FILE", help="Output filename")
- parser.add_argument("-f", "--filter", choices=["NEAREST", "LINEAR", "MIPMAP"], default="LINEAR", help="Filtering mode")
- parser.add_argument("-a", "--anisotropy", metavar="NUMBER", help="Maximum anisotropy, 0 = disable")
- parser.add_argument("-w", "--wrap", choices=["REPEAT", "CLAMP_TO_EDGE", "MIRRORED_REPEAT"], help="Wrapping mode")
+ parser.add_argument("-m", "--mipmap", action="store_true", help="Enable mipmaps")
parser.add_argument("--srgb", action="store_const", const=True, help="Use sRGB color space")
parser.add_argument("image")
args = parser.parse_args()
- filter = args.filter
- if filter=="MIPMAP":
- filter = "LINEAR_MIPMAP_LINEAR"
-
out_fn = args.output
if not out_fn:
out_fn = os.path.splitext(args.image)[0]+".tex2d"
- out = file(out_fn, "w")
- out.write(make_tex(args.image, filter, args.anisotropy, args.wrap, args.srgb))
+ out = open(out_fn, "w")
+ out.write(make_tex(args.image, args.mipmap, args.srgb))