DISTRHO Plugin Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
5.7KB

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # DISTRHO Plugin Framework (DPF)
  4. # Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com>
  5. #
  6. # Permission to use, copy, modify, and/or distribute this software for any purpose with
  7. # or without fee is hereby granted, provided that the above copyright notice and this
  8. # permission notice appear in all copies.
  9. #
  10. # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  11. # TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  12. # NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. # DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  14. # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  15. # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16. import os, numpy, sys
  17. try:
  18. import Image
  19. except:
  20. from PIL import Image
  21. # -----------------------------------------------------
  22. formats = {
  23. 2: "GL_LUMINANCE",
  24. 3: "GL_BGR",
  25. 4: "GL_BGRA"
  26. }
  27. def png2rgba(namespace, filenames):
  28. fdH = open("%s.hpp" % namespace, "w")
  29. fdH.write("/* (Auto-generated binary data file). */\n")
  30. fdH.write("\n")
  31. fdH.write("#ifndef BINARY_%s_HPP\n" % namespace.upper())
  32. fdH.write("#define BINARY_%s_HPP\n" % namespace.upper())
  33. fdH.write("\n")
  34. fdH.write("namespace %s\n" % namespace)
  35. fdH.write("{\n")
  36. fdC = open("%s.cpp" % namespace, "w")
  37. fdC.write("/* (Auto-generated binary data file). */\n")
  38. fdC.write("\n")
  39. fdC.write("#include \"%s.hpp\"\n" % namespace)
  40. fdC.write("\n")
  41. tempIndex = 1
  42. for filename in filenames:
  43. shortFilename = filename.rsplit(os.sep, 1)[-1].split(".", 1)[0]
  44. shortFilename = shortFilename.replace("-", "_")
  45. png = Image.open(filename)
  46. if png.getpalette():
  47. png = png.convert()
  48. pngNumpy = numpy.array(png)
  49. pngData = pngNumpy.tolist()
  50. #pngData.reverse()
  51. height = len(pngData)
  52. for dataBlock in pngData:
  53. width = len(dataBlock)
  54. if isinstance(dataBlock[0], int):
  55. channels = 2
  56. else:
  57. channels = len(dataBlock[0])
  58. break
  59. else:
  60. print("Invalid image found, cannot continue!")
  61. quit()
  62. if channels not in formats.keys():
  63. print("Invalid image channel count, cannot continue!")
  64. quit()
  65. print("Generating data for \"%s\" using '%s' type" % (filename, formats[channels]))
  66. #print(" Width: %i" % width)
  67. #print(" Height: %i" % height)
  68. #print(" DataSize: %i" % (width * height * channels))
  69. fdH.write(" extern const char* %sData;\n" % shortFilename)
  70. fdH.write(" const unsigned int %sDataSize = %i;\n" % (shortFilename, width * height * channels))
  71. fdH.write(" const unsigned int %sWidth = %i;\n" % (shortFilename, width))
  72. fdH.write(" const unsigned int %sHeight = %i;\n" % (shortFilename, height))
  73. if tempIndex != len(filenames):
  74. fdH.write("\n")
  75. fdC.write("static const unsigned char temp_%s_%i[] = {\n" % (shortFilename, tempIndex))
  76. curColumn = 1
  77. fdC.write(" ")
  78. for dataBlock in pngData:
  79. if curColumn == 0:
  80. fdC.write(" ")
  81. for data in dataBlock:
  82. if channels == 2:
  83. fdC.write(" %3u," % data)
  84. elif channels == 3:
  85. r, g, b = data
  86. fdC.write(" %3u, %3u, %3u," % (b, g, r))
  87. else:
  88. r, g, b, a = data
  89. if filename in ("artwork/claw1.png",
  90. "artwork/claw2.png",
  91. "artwork/run1.png",
  92. "artwork/run2.png",
  93. "artwork/run3.png",
  94. "artwork/run4.png",
  95. "artwork/scratch1.png",
  96. "artwork/scratch2.png",
  97. "artwork/sit.png",
  98. "artwork/tail.png"):
  99. if r == 255:
  100. a -= 38
  101. if a < 0: a = 0
  102. #a = 0
  103. #else:
  104. #r = g = b = 255
  105. fdC.write(" %3u, %3u, %3u, %3u," % (b, g, r, a))
  106. if curColumn > 20:
  107. fdC.write("\n ")
  108. curColumn = 1
  109. else:
  110. curColumn += 1
  111. fdC.write("};\n")
  112. fdC.write("const char* %s::%sData = (const char*)temp_%s_%i;\n" % (namespace, shortFilename, shortFilename, tempIndex))
  113. if tempIndex != len(filenames):
  114. fdC.write("\n")
  115. tempIndex += 1
  116. fdH.write("}\n")
  117. fdH.write("\n")
  118. fdH.write("#endif // BINARY_%s_HPP\n" % namespace.upper())
  119. fdH.write("\n")
  120. fdH.close()
  121. fdC.write("\n")
  122. fdC.close()
  123. # -----------------------------------------------------
  124. if __name__ == '__main__':
  125. if len(sys.argv) != 3:
  126. print("Usage: %s <namespace> <artwork-folder>" % sys.argv[0])
  127. quit()
  128. namespace = sys.argv[1].replace("-","_")
  129. artFolder = sys.argv[2]
  130. if not os.path.exists(artFolder):
  131. print("Folder '%s' does not exist" % artFolder)
  132. quit()
  133. # find png files
  134. pngFiles = []
  135. for root, dirs, files in os.walk(artFolder):
  136. for name in [name for name in files if name.lower().endswith(".png")]:
  137. pngFiles.append(os.path.join(root, name))
  138. pngFiles.sort()
  139. # create code now
  140. png2rgba(namespace, pngFiles)