|
Packit |
1c1d7e |
#!/usr/bin/python
|
|
Packit |
1c1d7e |
# Script that compiles a set of resources into a single C++ source file. The C++ file
|
|
Packit |
1c1d7e |
# offers an initResources() function, which registers the resources with the resource
|
|
Packit |
1c1d7e |
# manager (class ResourceMgr)
|
|
Packit |
1c1d7e |
#
|
|
Packit |
1c1d7e |
# Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
#
|
|
Packit |
1c1d7e |
# Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
# documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
# granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
# for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
# See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
#
|
|
Packit |
1c1d7e |
# Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
# input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
#
|
|
Packit |
1c1d7e |
from __future__ import print_function
|
|
Packit |
1c1d7e |
from os import listdir, stat, walk
|
|
Packit |
1c1d7e |
from os.path import isfile, join, splitext
|
|
Packit |
1c1d7e |
import sys
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class File(object):
|
|
Packit |
1c1d7e |
def __init__(self,directory,subdir,fileName,mode):
|
|
Packit |
1c1d7e |
self.directory = directory
|
|
Packit |
1c1d7e |
self.subdir = subdir
|
|
Packit |
1c1d7e |
self.fileName = fileName
|
|
Packit |
1c1d7e |
filePath = join(directory,subdir,fileName)
|
|
Packit |
1c1d7e |
self.fileSize = stat(filePath).st_size
|
|
Packit |
1c1d7e |
self.bareName = fileName.replace('.','_')
|
|
Packit |
1c1d7e |
self.inputFile = open(filePath,mode)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
def formatByte(self,byte):
|
|
Packit |
1c1d7e |
if isinstance(byte,int):
|
|
Packit |
1c1d7e |
return "%02x" % byte
|
|
Packit |
1c1d7e |
else:
|
|
Packit |
1c1d7e |
return format(ord(byte),'02x')
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
def writeBytes(self,data,outputFile):
|
|
Packit |
1c1d7e |
bytes_per_line=16
|
|
Packit |
1c1d7e |
print("static const unsigned char %s_data[] = " % self.bareName,file=outputFile)
|
|
Packit |
1c1d7e |
print("{",file=outputFile)
|
|
Packit |
1c1d7e |
lines = [data[x:x+bytes_per_line] for x in range(0,len(data),bytes_per_line)]
|
|
Packit |
1c1d7e |
linesAsString = ',\n '.join([', '.join(['0x'+self.formatByte(byte) for byte in line]) for line in lines])
|
|
Packit |
1c1d7e |
print(' %s' % linesAsString,file=outputFile)
|
|
Packit |
1c1d7e |
print("};",file=outputFile)
|
|
Packit |
1c1d7e |
print("const int %s_len = %d;\n" % (self.bareName,len(data)),file=outputFile)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
def convertToBytes(self,outputFile):
|
|
Packit |
1c1d7e |
lines = [x for x in self.inputFile.readlines() if not x.startswith('#')]
|
|
Packit |
1c1d7e |
w,h = (int(x) for x in lines[0].split())
|
|
Packit |
1c1d7e |
data = "".join(map(chr,[int(w>>8),int(w&0xFF),int(h>>8),int(h&0xFF)]+
|
|
Packit |
1c1d7e |
[int(x) for line in lines[1:] for x in line.split()]))
|
|
Packit |
1c1d7e |
self.writeBytes(data,outputFile)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
@staticmethod
|
|
Packit |
1c1d7e |
def factory(directory,subdir,fname):
|
|
Packit |
1c1d7e |
ext = splitext(fname)[1]
|
|
Packit |
1c1d7e |
if ext=='.lum': return LumFile(directory,subdir,fname)
|
|
Packit |
1c1d7e |
if ext=='.luma': return LumaFile(directory,subdir,fname)
|
|
Packit |
1c1d7e |
if ext=='.css': return CSSFile(directory,subdir,fname)
|
|
Packit |
1c1d7e |
return VerbatimFile(directory,subdir,fname)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class VerbatimFile(File):
|
|
Packit |
1c1d7e |
def __init__(self,directory,subdir,fileName):
|
|
Packit |
1c1d7e |
File.__init__(self,directory,subdir,fileName,"rb")
|
|
Packit |
1c1d7e |
def writeContents(self,outputFile):
|
|
Packit |
1c1d7e |
self.writeBytes(self.inputFile.read(),outputFile)
|
|
Packit |
1c1d7e |
def writeDirEntry(self,outputFile):
|
|
Packit |
1c1d7e |
print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Verbatim }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class CSSFile(File):
|
|
Packit |
1c1d7e |
def __init__(self,directory,subdir,fileName):
|
|
Packit |
1c1d7e |
File.__init__(self,directory,subdir,fileName,"r")
|
|
Packit |
1c1d7e |
def writeContents(self,outputFile):
|
|
Packit |
1c1d7e |
self.writeBytes(self.inputFile.read(),outputFile)
|
|
Packit |
1c1d7e |
def writeDirEntry(self,outputFile):
|
|
Packit |
1c1d7e |
print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::CSS }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class LumFile(File):
|
|
Packit |
1c1d7e |
def __init__(self,directory,subdir,fileName):
|
|
Packit |
1c1d7e |
File.__init__(self,directory,subdir,fileName,"r")
|
|
Packit |
1c1d7e |
def writeContents(self,outputFile):
|
|
Packit |
1c1d7e |
self.convertToBytes(outputFile)
|
|
Packit |
1c1d7e |
def writeDirEntry(self,outputFile):
|
|
Packit |
1c1d7e |
print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Luminance }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class LumaFile(File):
|
|
Packit |
1c1d7e |
def __init__(self,directory,subdir,fileName):
|
|
Packit |
1c1d7e |
File.__init__(self,directory,subdir,fileName,"r")
|
|
Packit |
1c1d7e |
def writeContents(self,outputFile):
|
|
Packit |
1c1d7e |
self.convertToBytes(outputFile)
|
|
Packit |
1c1d7e |
def writeDirEntry(self,outputFile):
|
|
Packit |
1c1d7e |
print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::LumAlpha }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
def main():
|
|
Packit |
1c1d7e |
if len(sys.argv)<3:
|
|
Packit |
1c1d7e |
sys.exit('Usage: %s directory output_file.cpp' % sys.argv[0])
|
|
Packit |
1c1d7e |
directory = sys.argv[1]
|
|
Packit |
1c1d7e |
files = []
|
|
Packit |
1c1d7e |
for dirName, subdirList, fileList in walk(directory):
|
|
Packit |
1c1d7e |
for fname in sorted(fileList):
|
|
Packit |
1c1d7e |
subdir = dirName[len(directory)+1:] if dirName.startswith(directory) else dirName
|
|
Packit |
1c1d7e |
if subdir:
|
|
Packit |
1c1d7e |
files.append(File.factory(directory,subdir,fname))
|
|
Packit |
1c1d7e |
outputFile = open(sys.argv[2],"w")
|
|
Packit |
1c1d7e |
print("#include \"resourcemgr.h\"\n",file=outputFile)
|
|
Packit |
1c1d7e |
for f in files:
|
|
Packit |
1c1d7e |
f.writeContents(outputFile)
|
|
Packit |
1c1d7e |
print("static Resource resourceDir[] =",file=outputFile)
|
|
Packit |
1c1d7e |
print("{",file=outputFile)
|
|
Packit |
1c1d7e |
for f in files:
|
|
Packit |
1c1d7e |
f.writeDirEntry(outputFile)
|
|
Packit |
1c1d7e |
print("};",file=outputFile)
|
|
Packit |
1c1d7e |
print("static int resourceDir_len = %s;" % len(files), file=outputFile)
|
|
Packit |
1c1d7e |
print("void initResources() { ResourceMgr::instance().registerResources(resourceDir,resourceDir_len); }",file=outputFile)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if __name__ == '__main__':
|
|
Packit |
1c1d7e |
main()
|