2 # Script that compiles a set of resources into a single C++ source file. The C++ file
3 # offers an initResources() function, which registers the resources with the resource
4 # manager (class ResourceMgr)
6 # Copyright (C) 1997-2015 by Dimitri van Heesch.
8 # Permission to use, copy, modify, and distribute this software and its
9 # documentation under the terms of the GNU General Public License is hereby
10 # granted. No representations are made about the suitability of this software
11 # for any purpose. It is provided "as is" without express or implied warranty.
12 # See the GNU General Public License for more details.
14 # Documents produced by Doxygen are derivative works derived from the
15 # input used in their production; they are not affected by this license.
17 from __future__ import print_function
18 from os import listdir, stat, walk
19 from os.path import isfile, join, splitext
23 def __init__(self,directory,subdir,fileName,mode):
24 self.directory = directory
26 self.fileName = fileName
27 filePath = join(directory,subdir,fileName)
28 self.fileSize = stat(filePath).st_size
29 self.bareName = fileName.replace('.','_')
30 self.inputFile = open(filePath,mode)
32 def formatByte(self,byte):
33 if isinstance(byte,int):
36 return format(ord(byte),'02x')
38 def writeBytes(self,data,outputFile):
40 print("static const unsigned char %s_data[] = " % self.bareName,file=outputFile)
41 print("{",file=outputFile)
42 lines = [data[x:x+bytes_per_line] for x in range(0,len(data),bytes_per_line)]
43 linesAsString = ',\n '.join([', '.join(['0x'+self.formatByte(byte) for byte in line]) for line in lines])
44 print(' %s' % linesAsString,file=outputFile)
45 print("};",file=outputFile)
46 print("const int %s_len = %d;\n" % (self.bareName,len(data)),file=outputFile)
48 def convertToBytes(self,outputFile):
49 lines = [x for x in self.inputFile.readlines() if not x.startswith('#')]
50 w,h = (int(x) for x in lines[0].split())
51 data = "".join(map(chr,[int(w>>8),int(w&0xFF),int(h>>8),int(h&0xFF)]+
52 [int(x) for line in lines[1:] for x in line.split()]))
53 self.writeBytes(data,outputFile)
56 def factory(directory,subdir,fname):
57 ext = splitext(fname)[1]
58 if ext=='.lum': return LumFile(directory,subdir,fname)
59 if ext=='.luma': return LumaFile(directory,subdir,fname)
60 if ext=='.css': return CSSFile(directory,subdir,fname)
61 return VerbatimFile(directory,subdir,fname)
63 class VerbatimFile(File):
64 def __init__(self,directory,subdir,fileName):
65 File.__init__(self,directory,subdir,fileName,"rb")
66 def writeContents(self,outputFile):
67 self.writeBytes(self.inputFile.read(),outputFile)
68 def writeDirEntry(self,outputFile):
69 print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Verbatim }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
72 def __init__(self,directory,subdir,fileName):
73 File.__init__(self,directory,subdir,fileName,"r")
74 def writeContents(self,outputFile):
75 self.writeBytes(self.inputFile.read(),outputFile)
76 def writeDirEntry(self,outputFile):
77 print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::CSS }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
80 def __init__(self,directory,subdir,fileName):
81 File.__init__(self,directory,subdir,fileName,"r")
82 def writeContents(self,outputFile):
83 self.convertToBytes(outputFile)
84 def writeDirEntry(self,outputFile):
85 print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Luminance }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
88 def __init__(self,directory,subdir,fileName):
89 File.__init__(self,directory,subdir,fileName,"r")
90 def writeContents(self,outputFile):
91 self.convertToBytes(outputFile)
92 def writeDirEntry(self,outputFile):
93 print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::LumAlpha }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
97 sys.exit('Usage: %s directory output_file.cpp' % sys.argv[0])
98 directory = sys.argv[1]
100 for dirName, subdirList, fileList in walk(directory):
101 for fname in sorted(fileList):
102 subdir = dirName[len(directory)+1:] if dirName.startswith(directory) else dirName
104 files.append(File.factory(directory,subdir,fname))
105 outputFile = open(sys.argv[2],"w")
106 print("#include \"resourcemgr.h\"\n",file=outputFile)
108 f.writeContents(outputFile)
109 print("static Resource resourceDir[] =",file=outputFile)
110 print("{",file=outputFile)
112 f.writeDirEntry(outputFile)
113 print("};",file=outputFile)
114 print("static int resourceDir_len = %s;" % len(files), file=outputFile)
115 print("void initResources() { ResourceMgr::instance().registerResources(resourceDir,resourceDir_len); }",file=outputFile)
117 if __name__ == '__main__':