#!/usr/bin/env python import os import re import struct from collections import defaultdict from PIL import Image def makedef(indir, outdir): infiles = defaultdict(list) sig = None fnames = set() # sanity checks and fill infiles dict for f in os.listdir(indir): m = re.match('(\d+)_([A-Za-z0-9_]+)_(\d\d)_(\d\d)_([A-Za-z0-9_]+)_(\d+)x(\d+)_(\d+)x(\d+).png', f) if not m: continue t,p,bid,j,fn,fw,fh,lm,tm = m.groups() t,bid,j,fw,fh,lm,tm = int(t),int(bid),int(j),int(fw),int(fh),int(lm),int(tm) im = Image.open(os.sep.join([indir,f])) w,h = im.size if im.mode != 'P': print "input images must have a palette" return False cursig =(t,p,fw,fh,im.getpalette()) if not sig: sig = cursig else: if sig != cursig: print "sigs must match - got:" print sig print cursig return False if fn in fnames: print "duplicate filename: %s"%fn return False if w%16 != 0: print "width must be divisible by 16" return False if len(fn) > 9: print "filename can't be longer than 9 bytes" return False fnames.add(fn) infiles[bid].append((im,t,p,j,fn,fw,fh,lm,tm)) # check if j values for all bids are correct and sort them in j order in the process for bid in infiles: infiles[bid].sort(key=lambda t: t[3]) for k,(_,_,bid,j,_,_,_,_,_) in enumerate(infiles[bid]): if k != j: print "incorrect j value %d for bid %d should be %d"%(j,bid,k) t,p,fw,fh,pal = cursig outf = open(outdir+"/"+p+".def", "w+") # write the header outf.write(struct.pack("