text: #!/usr/bin/env python3
  # -*- coding: utf-8 -*-
  
  # DISTRHO Plugin Framework (DPF)
  # Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com>
  #
  # Permission to use, copy, modify, and/or distribute this software for any purpose with
  # or without fee is hereby granted, provided that the above copyright notice and this
  # permission notice appear in all copies.
  #
  # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  # TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  # NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  # DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  
  import os, numpy, sys
  try:
      import Image
  except:
      from PIL import Image
  
  # -----------------------------------------------------
  
  formats = {
      2: "GL_LUMINANCE",
      3: "GL_BGR",
      4: "GL_BGRA"
  }
  
  def png2rgba(namespace, filenames):
  
      fdH = open("%s.hpp" % namespace, "w")
      fdH.write("/* (Auto-generated binary data file). */\n")
      fdH.write("\n")
      fdH.write("#ifndef BINARY_%s_HPP\n" % namespace.upper())
      fdH.write("#define BINARY_%s_HPP\n" % namespace.upper())
      fdH.write("\n")
      fdH.write("namespace %s\n" % namespace)
      fdH.write("{\n")
  
      fdC = open("%s.cpp" % namespace, "w")
      fdC.write("/* (Auto-generated binary data file). */\n")
      fdC.write("\n")
      fdC.write("#include \"%s.hpp\"\n" % namespace)
      fdC.write("\n")
  
      tempIndex = 1
  
      for filename in filenames:
          shortFilename = filename.rsplit(os.sep, 1)[-1].split(".", 1)[0]
          shortFilename = shortFilename.replace("-", "_")
  
          png = Image.open(filename)
          if png.getpalette():
              png = png.convert()
  
          pngNumpy = numpy.array(png)
          pngData  = pngNumpy.tolist()
          #pngData.reverse()
  
          height = len(pngData)
          for dataBlock in pngData:
              width = len(dataBlock)
              if isinstance(dataBlock[0], int):
                  channels = 2
              else:
                  channels = len(dataBlock[0])
              break
          else:
              print("Invalid image found, cannot continue!")
              quit()
  
          if channels not in formats.keys():
              print("Invalid image channel count, cannot continue!")
              quit()
  
          print("Generating data for \"%s\" using '%s' type" % (filename, formats[channels]))
          #print("  Width:    %i" % width)
          #print("  Height:   %i" % height)
          #print("  DataSize: %i" % (width * height * channels))
  
          fdH.write("    extern const char* %sData;\n" % shortFilename)
          fdH.write("    const unsigned int %sDataSize = %i;\n" % (shortFilename, width * height * channels))
          fdH.write("    const unsigned int %sWidth    = %i;\n" % (shortFilename, width))
          fdH.write("    const unsigned int %sHeight   = %i;\n" % (shortFilename, height))
  
          if tempIndex != len(filenames):
              fdH.write("\n")
  
          fdC.write("static const unsigned char temp_%s_%i[] = {\n" % (shortFilename, tempIndex))
  
          curColumn = 1
          fdC.write(" ")
  
          for dataBlock in pngData:
              if curColumn == 0:
                  fdC.write(" ")
  
              for data in dataBlock:
                  if channels == 2:
                      fdC.write(" %3u," % data)
  
                  elif channels == 3:
                      r, g, b = data
                      fdC.write(" %3u, %3u, %3u," % (b, g, r))
  
                  else:
                      r, g, b, a = data
  
                      if filename in ("artwork/claw1.png",
                                      "artwork/claw2.png",
                                      "artwork/run1.png",
                                      "artwork/run2.png",
                                      "artwork/run3.png",
                                      "artwork/run4.png",
                                      "artwork/scratch1.png",
                                      "artwork/scratch2.png",
                                      "artwork/sit.png",
                                      "artwork/tail.png"):
                          if r == 255:
                              a -= 38
                              if a < 0: a = 0
                              #a = 0
                          #else:
                              #r = g = b = 255
  
                      fdC.write(" %3u, %3u, %3u, %3u," % (b, g, r, a))
  
                  if curColumn > 20:
                      fdC.write("\n ")
                      curColumn = 1
                  else:
                      curColumn += 1
  
          fdC.write("};\n")
          fdC.write("const char* %s::%sData = (const char*)temp_%s_%i;\n" % (namespace, shortFilename, shortFilename, tempIndex))
  
          if tempIndex != len(filenames):
              fdC.write("\n")
  
          tempIndex += 1
  
      fdH.write("}\n")
      fdH.write("\n")
      fdH.write("#endif // BINARY_%s_HPP\n" % namespace.upper())
      fdH.write("\n")
      fdH.close()
  
      fdC.write("\n")
      fdC.close()
  
  # -----------------------------------------------------
  
  if __name__ == '__main__':
      if len(sys.argv) != 3:
          print("Usage: %s <namespace> <artwork-folder>" % sys.argv[0])
          quit()
  
      namespace = sys.argv[1].replace("-","_")
      artFolder = sys.argv[2]
  
      if not os.path.exists(artFolder):
          print("Folder '%s' does not exist" % artFolder)
          quit()
  
      # find png files
      pngFiles = []
  
      for root, dirs, files in os.walk(artFolder):
          for name in [name for name in files if name.lower().endswith(".png")]:
              pngFiles.append(os.path.join(root, name))
  
      pngFiles.sort()
  
      # create code now
      png2rgba(namespace, pngFiles)
  