#!/usr/bin/python import gameduino2 as gd2 import os import array import Image import wave import audioop def cname(s): """ make name s C-friendly """ for c in "-+.": s = s.replace(c, "_") return s.upper() class GD2Assets(gd2.prep.AssetBin): def __init__(self, opts, args): self.opts = opts self.args = args gd2.prep.AssetBin.__init__(self) self.header = opts.get('-o', 'default_assets.h') if '-f' in opts: self.asset_file = opts['-f'] if '-3' in opts: self.target_810() self.handlers = { 'png' : (self.image, "PNG image file (options: format)"), 'jpg' : (self.image, "JPEG image file (options: format)"), 'bmp' : (self.image, "BMP image file (options: format)"), 'gif' : (self.image, "GIF image file (options: format)"), 'ttf' : (self.ttf, "TrueType font file (options: format, size)"), 'wav' : (self.sample, "Audio sample, mono 16-bit (no options)"), } def parse_format(self, format): formats = ('ARGB1555', 'L1', 'L2', 'L4', 'L8', 'RGB332', 'ARGB2', 'ARGB4', 'RGB565') if format not in formats: print 'ERROR: unknown format "%s"' % format print print 'Formats are: %s' % " ".join(formats) sys.exit(1) return eval("gd2." + format) def image(self, suffix, ff, format = 'ARGB4'): name = cname(os.path.basename(ff[0])[:-1 - len(suffix)]) self.load_handle(name, [Image.open(f) for f in ff], self.parse_format(format)) def ttf(self, suffix, f, size = '12', format = 'L4'): name = cname(os.path.basename(f[0])[:-1 - len(suffix)]) self.load_ttf(name, f[0], int(size), self.parse_format(format)) def sample(self, suffix, f): name = os.path.basename(f[0])[:-1 - len(suffix)].upper() f = wave.open(f[0], "rb") if f.getnchannels() != 1: print "Sorry - .wav file must be mono" sys.exit(1) if f.getsampwidth() != 2: print "Sorry - .wav file must be 16-bit" sys.exit(1) freq = f.getframerate() pcm16 = f.readframes(f.getnframes()) (adpcm, _) = audioop.lin2adpcm(pcm16, f.getsampwidth(), (0,0)) adpcm = adpcm[:len(adpcm) & ~7] da = array.array('B', [((ord(c) >> 4) | ((15 & ord(c)) << 4)) for c in adpcm]) self.align(8) self.add(name, da.tostring()) self.define(name + "_LENGTH", len(da)) self.define(name + "_FREQ", freq) def error(self, suffix, f, **_): print 'ERROR: cannot identify type of file "%s"' % f print print 'recognized file types are:' for suffix,(_, doc) in sorted(self.handlers.items()): print ' %s %s' % (suffix, doc) sys.exit(1) def addall(self): for a in self.args: a = a.split(',') f = [] vars = {} for part in a: if '=' in part: varval = part.split('=') if len(varval) != 2: print 'ERROR: syntax error in asset specification "%s"' % setting sys.exit(1) (var, val) = varval vars[var] = val else: f.append(part) suffix = f[0].split('.')[-1].lower() (handler, _) = self.handlers.get(suffix, (self.error, '')) handler(suffix, f, **vars) if __name__ == '__main__': import sys, getopt try: optlist, args = getopt.getopt(sys.argv[1:], "o:f:3") except getopt.GetoptError: print 'usage: gd2asset ' print print ' -o output header file' print ' -f output asset file (default is header file)' print ' -3 target GD3 (FT810 series)' print print 'If no output header file is given, then "default_assets.h" is used' print print 'Each asset is a filename, optionally followed by some var=val' print 'assignments. For example:' print ' pic1.png image, format ARGB4' print ' pic2.jpg,format=L8 image, format L8' print ' serif.ttf,size=16 font, 16 pixels high' print print 'The assets are compiled into flash, or if the "-f" option is given' print 'into a file. In this case the file should be copied to the' print 'microSD card.' print 'In either case, calling LOAD_ASSETS() from the program loads all' print 'assets.' sys.exit(1) optdict = dict(optlist) if 'gd3' in sys.argv[0].lower(): optdict['-3'] = '' GD2Assets(optdict, args).make()