From c1b33c04bd6ac474b8080f55636b32cc447b87c4 Mon Sep 17 00:00:00 2001 From: Mango Date: Tue, 30 Jan 2024 12:20:18 +0800 Subject: [PATCH 1/2] optimization code --- tooltip.py | 100 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 34 deletions(-) diff --git a/tooltip.py b/tooltip.py index a9f05ac..f57db2e 100644 --- a/tooltip.py +++ b/tooltip.py @@ -2,48 +2,80 @@ import argparse from PIL import Image -class vec: + +class Vec: axis = "xyzw" + def __init__(self, *args): - if type(args[0]) in (list, tuple): args = args[0] + if type(args[0]) in (list, tuple): + args = args[0] self.points = list(args) + def __getattr__(self, attr): if attr in self.axis: return self.points[self.axis.find(attr)] return super().getattr(self, attr) -def tohex(color): - color = (color[0] << 24) + (color[1] << 16) + (color[2] << 8) + (color[3]) - return hex(color) + 'u' -def encode(image, a, b): - return ','.join([tohex(image.getpixel((x,y))) for y in range(b[0], b[1]) for x in range(a[0], a[1])]) - -def tooltip(image, corner, pad): - size = vec(image.size) - file = open("tooltip.glsl", "w") - file.write("//generated for tooltip shader by Godlander\n") - file.write("vec2 pad = vec2(" + str(pad[0]) + "," + str(pad[1]) + ");\n") - file.write("ivec3 sizes = ivec3(" + str(size.x-corner*2) +"," + str(size.y-corner*2) + "," + str(corner) + ");\n") - file.write("uint base = " + tohex(image.getpixel((corner, corner))) + ";\n") - file.write("uint[] tl = uint[](" + encode(image, (0, corner), (0, corner)) + ");\n") - file.write("uint[] tr = uint[](" + encode(image, (size.x-corner, size.x), (0, corner)) + ");\n") - file.write("uint[] bl = uint[](" + encode(image, (0, corner), (size.y-corner, size.y)) + ");\n") - file.write("uint[] br = uint[](" + encode(image, (size.x-corner, size.x), (size.y-corner, size.y)) + ");\n") - file.write("uint[] t = uint[](" + encode(image, (corner, size.x-corner), (0, corner)) + ");\n") - file.write("uint[] l = uint[](" + encode(image, (0, corner), (corner, size.y-corner)) + ");\n") - file.write("uint[] r = uint[](" + encode(image, (size.x-corner, size.x), (corner, size.y-corner)) + ");\n") - file.write("uint[] b = uint[](" + encode(image, (corner, size.x-corner), (size.y-corner, size.y)) + ");\n") - file.close() - -path = os.getcwd() -class ArgumentParserError(Exception): pass + +class ArgumentParserError(Exception): + pass + + class ThrowingArgumentParser(argparse.ArgumentParser): def error(self, message): raise ArgumentParserError(message) -parser = ThrowingArgumentParser(description="python script to generate a tooltip shader from image") -parser.add_argument("--file", type=str, help="Tooltip image file", default='') -parser.add_argument("--corner", type=int, help="Tooltip corner size", default=3) -parser.add_argument("--pad", type=int, nargs=2, help="Tooltip horizontal/vertical padding", default=(0,0)) -args = parser.parse_args() -image = Image.open(args.file).convert("RGBA") -tooltip(image, args.corner, args.pad) \ No newline at end of file + + +def toHex(color) -> str: + color = (color[0] << 24) + (color[1] << 16) + (color[2] << 8) + (color[3]) + return hex(color) + "u" + + +def encode(image: Image, a: tuple[int, int], b: tuple[int, int]) -> str: + return ",".join( + [ + toHex(image.getpixel((x, y))) + for y in range(b[0], b[1]) + for x in range(a[0], a[1]) + ] + ) + + +def tooltip(image: Image, corner: int, pad: int): + size = Vec(image.size) + lines = [ + "//generated for tooltip shader by Godlander", + f"vec2 pad = vec2({pad[0]},{pad[1]});", + f"ivec3 sizes = ivec3({size.x-corner*2},{size.y-corner*2},{corner});", + f"uint base = {toHex(image.getpixel((corner, corner)))};", + f"uint[] tl = uint[]({encode(image, (0, corner), (0, corner)) });", + f"uint[] tr = uint[]({encode(image, (size.x-corner, size.x), (0, corner)) });", + f"uint[] bl = uint[]({encode(image, (0, corner), (size.y-corner, size.y))});", + f"uint[] br = uint[]({encode(image, (size.x-corner, size.x), (size.y-corner, size.y))});", + f"uint[] t = uint[]({ encode(image, (corner, size.x-corner), (0, corner)) });", + f"uint[] l = uint[]({ encode(image, (0, corner), (corner, size.y-corner))});", + f"uint[] r = uint[]({ encode(image, (size.x-corner, size.x), (corner, size.y-corner))});", + f"uint[] b = uint[]({ encode(image, (corner, size.x-corner), (size.y-corner, size.y))});", + ] + with open("tooltip.glsl", "w") as file: + file.write("\n".join(lines)) + + +if __name__ == "__main__": + parser = ThrowingArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + description="python script to generate a tooltip shader from image", + ) + parser.add_argument("--file", type=str, help="Tooltip image file", default="") + parser.add_argument("--corner", type=int, help="Tooltip corner size", default=3) + parser.add_argument( + "--pad", + type=int, + nargs=2, + help="Tooltip horizontal/vertical padding", + default=(0, 0), + ) + args = parser.parse_args() + with Image.open(args.file) as img: + img = img.convert("RGBA") + tooltip(img, args.corner, args.pad) From d614e569632275b7b6636eb1ba9ea50727698613 Mon Sep 17 00:00:00 2001 From: Mango Date: Tue, 30 Jan 2024 12:41:35 +0800 Subject: [PATCH 2/2] add path feature --- tooltip.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tooltip.py b/tooltip.py index f57db2e..08ec979 100644 --- a/tooltip.py +++ b/tooltip.py @@ -1,7 +1,9 @@ -import os +from pathlib import Path import argparse from PIL import Image +CURRENT_FILE = Path(__file__).parent + class Vec: axis = "xyzw" @@ -57,7 +59,7 @@ def tooltip(image: Image, corner: int, pad: int): f"uint[] r = uint[]({ encode(image, (size.x-corner, size.x), (corner, size.y-corner))});", f"uint[] b = uint[]({ encode(image, (corner, size.x-corner), (size.y-corner, size.y))});", ] - with open("tooltip.glsl", "w") as file: + with open(CURRENT_FILE / "tooltip.glsl", "w") as file: file.write("\n".join(lines)) @@ -76,6 +78,6 @@ def tooltip(image: Image, corner: int, pad: int): default=(0, 0), ) args = parser.parse_args() - with Image.open(args.file) as img: + with Image.open(CURRENT_FILE / args.file) as img: img = img.convert("RGBA") tooltip(img, args.corner, args.pad)