from json.decoder import JSONDecodeError from PIL import Image, ImageDraw from json import loads DEFAULT_MAPPING = [[0.0, 0.5, 0.0, 1.0, 1.0], [0.5, 1.0, 0.0, 1.0, 1.0]] COLORS = ("red", "orange", "yellow", "green", "blue", "indigo", "violet") def validate_mapping(data: list) -> bool: for x1, x2, y1, y2, w in data: if not all(0.0 <= v <= 1.0 for v in (x1, x2, y1, y2)): print("\n[Couple] Region range must be between 0.0 and 1.0...\n") return False if x2 <= x1 or y2 <= y1: print('\n[Couple] "to" value must be larger than "from" value...\n') return False return True def visualize_mapping(res: str, mapping: list) -> Image: w, h = res.split("x") p_WIDTH, p_HEIGHT = int(w), int(h) while p_WIDTH > 1024 or p_HEIGHT > 1024: p_WIDTH, p_HEIGHT = p_WIDTH // 2, p_HEIGHT // 2 while p_WIDTH < 512 and p_HEIGHT < 512: p_WIDTH, p_HEIGHT = p_WIDTH * 2, p_HEIGHT * 2 matt = Image.new("RGBA", (p_WIDTH, p_HEIGHT), (0, 0, 0, 64)) if not (validate_mapping(mapping)): return matt line_width = int(max(min(p_WIDTH, p_HEIGHT) / 128, 4.0)) draw = ImageDraw.Draw(matt) for tile_index, (x1, x2, y1, y2, w) in enumerate(mapping): color_index = tile_index % len(COLORS) x_from = int(p_WIDTH * x1) x_to = int(p_WIDTH * x2) y_from = int(p_HEIGHT * y1) y_to = int(p_HEIGHT * y2) draw.rectangle( ((x_from, y_from), (x_to, y_to)), outline=COLORS[color_index], width=line_width, ) return matt def on_entry(data: str) -> list: if ":" in data: print("\n[Couple] Old infotext is no longer supported...\n") return DEFAULT_MAPPING try: return loads(data) except JSONDecodeError: print("\n[Couple] Something went wrong while parsing advanced mapping...\n") return DEFAULT_MAPPING