DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

res2c.py (3839B)


      1 #!/usr/bin/env python3
      2 # -*- coding: utf-8 -*-
      3 
      4 # DISTRHO Plugin Framework (DPF)
      5 # Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com>
      6 #
      7 # Permission to use, copy, modify, and/or distribute this software for any purpose with
      8 # or without fee is hereby granted, provided that the above copyright notice and this
      9 # permission notice appear in all copies.
     10 #
     11 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
     12 # TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
     13 # NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
     14 # DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
     15 # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     16 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     17 
     18 import os, sys
     19 
     20 # -----------------------------------------------------
     21 
     22 def res2c(namespace, filenames):
     23 
     24     fdH = open("%s.hpp" % namespace, "w")
     25     fdH.write("/* (Auto-generated binary data file). */\n")
     26     fdH.write("\n")
     27     fdH.write("#ifndef BINARY_%s_HPP\n" % namespace.upper())
     28     fdH.write("#define BINARY_%s_HPP\n" % namespace.upper())
     29     fdH.write("\n")
     30     fdH.write("namespace %s\n" % namespace)
     31     fdH.write("{\n")
     32 
     33     fdC = open("%s.cpp" % namespace, "w")
     34     fdC.write("/* (Auto-generated binary data file). */\n")
     35     fdC.write("\n")
     36     fdC.write("#include \"%s.hpp\"\n" % namespace)
     37     fdC.write("\n")
     38 
     39     tempIndex = 1
     40 
     41     for filename in filenames:
     42         shortFilename = filename.rsplit(os.sep, 1)[-1].split(".", 1)[0]
     43         shortFilename = shortFilename.replace("-", "_").replace("@","_")
     44 
     45         resData = open(filename, 'rb').read()
     46 
     47         print("Generating data for \"%s\"" % (filename))
     48 
     49         fdH.write("    extern const unsigned char* %sData;\n" % shortFilename)
     50         fdH.write("    const unsigned int %sDataSize = %i;\n" % (shortFilename, len(resData)))
     51 
     52         if tempIndex != len(filenames):
     53             fdH.write("\n")
     54 
     55         fdC.write("static const unsigned char temp_%s_%i[] = {\n" % (shortFilename, tempIndex))
     56 
     57         curColumn = 1
     58         fdC.write(" ")
     59 
     60         for data in resData:
     61             if curColumn == 0:
     62                 fdC.write(" ")
     63 
     64             fdC.write(" %3u," % data)
     65 
     66             if curColumn > 20:
     67                 fdC.write("\n ")
     68                 curColumn = 1
     69             else:
     70                 curColumn += 1
     71 
     72         fdC.write("};\n")
     73         fdC.write("const unsigned char* %s::%sData = (const unsigned char*)temp_%s_%i;\n" % (namespace, shortFilename, shortFilename, tempIndex))
     74 
     75         if tempIndex != len(filenames):
     76             fdC.write("\n")
     77 
     78         tempIndex += 1
     79 
     80     fdH.write("}\n")
     81     fdH.write("\n")
     82     fdH.write("#endif // BINARY_%s_HPP\n" % namespace.upper())
     83     fdH.write("\n")
     84     fdH.close()
     85 
     86     fdC.write("\n")
     87     fdC.close()
     88 
     89 # -----------------------------------------------------
     90 
     91 if __name__ == '__main__':
     92     if len(sys.argv) not in (3, 4):
     93         print("Usage: %s <namespace> <resource-folder> [output-folder=$CWD]" % sys.argv[0])
     94         quit()
     95 
     96     namespace = sys.argv[1].replace("-","_")
     97     resFolder = sys.argv[2]
     98     outFolder = sys.argv[3] if len(sys.argv) == 4 else None
     99 
    100     if not os.path.exists(resFolder):
    101         print("Folder '%s' does not exist" % resFolder)
    102         quit()
    103 
    104     if outFolder is not None and not os.path.exists(outFolder):
    105         print("Output folder '%s' does not exist" % outFolder)
    106         quit()
    107 
    108     # find resource files
    109     resFiles = []
    110 
    111     for root, dirs, files in os.walk(resFolder):
    112         for name in files:
    113             resFiles.append(os.path.abspath(os.path.join(root, name)))
    114 
    115     resFiles.sort()
    116 
    117     if outFolder is not None:
    118         os.chdir(outFolder)
    119 
    120     # create code now
    121     res2c(namespace, resFiles)