Blame src/res2cc_cmd.py

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