diff DPF-Prymula-audioplugins/dpf/utils/png2rgba.py @ 3:84e66ea83026

DPF-Prymula-audioplugins-0.231015-2
author prymula <prymula76@outlook.com>
date Mon, 16 Oct 2023 21:53:34 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DPF-Prymula-audioplugins/dpf/utils/png2rgba.py	Mon Oct 16 21:53:34 2023 +0200
@@ -0,0 +1,178 @@
+#!/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)