#!/usr/bin/env python3 """ gen_skin_template.py — Generate a skin template PNG for sdlamp2. Creates a 642x420 PNG showing the sprite grid layout with labeled gutters. Each 200x200 cell is blank white (ready to draw on). The 20px gutters between cells are gray with small text labels identifying adjacent cells. Grid layout: Col 0 (0-199) Col 1 (220-419) Col 2 (440-639) Row 0: REWIND PLAY FF ----gutter y=200-219 with labels---- Row 1: STOP PREV NEXT Two extra pixels on the right (640-641) are gutter fill to reach 642px width, matching the spritesheet dimensions. Usage: python3 tools/gen_skin_template.py [output.png] Requires Pillow. """ import sys from PIL import Image, ImageDraw, ImageFont CELL = 200 GAP = 20 COLS = 3 ROWS = 2 WIDTH = COLS * CELL + (COLS - 1) * GAP + 2 # 642 HEIGHT = ROWS * CELL + (ROWS - 1) * GAP # 420 CELL_COLOR = (255, 255, 255) GUTTER_COLOR = (180, 180, 180) TEXT_COLOR = (80, 80, 80) LABELS = [ ["REWIND", "PLAY", "FF"], ["STOP", "PREV", "NEXT"], ] def cell_x(col): return col * (CELL + GAP) def cell_y(row): return row * (CELL + GAP) def main(): output_path = sys.argv[1] if len(sys.argv) > 1 else "skin_template.png" img = Image.new("RGB", (WIDTH, HEIGHT), GUTTER_COLOR) draw = ImageDraw.Draw(img) # Try to load a small font for labels try: font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 11) except OSError: try: font = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", 11) except OSError: font = ImageFont.load_default() # Draw white cells for row in range(ROWS): for col in range(COLS): x = cell_x(col) y = cell_y(row) draw.rectangle([x, y, x + CELL - 1, y + CELL - 1], fill=CELL_COLOR) # Label the horizontal gutter (y = 200..219) gutter_y = CELL # 200 for col in range(COLS): cx = cell_x(col) + CELL // 2 # Row 0 label above center of gutter label_0 = LABELS[0][col] bbox = draw.textbbox((0, 0), label_0, font=font) tw = bbox[2] - bbox[0] draw.text((cx - tw // 2, gutter_y + 1), label_0, fill=TEXT_COLOR, font=font) # Row 1 label below center of gutter label_1 = LABELS[1][col] bbox = draw.textbbox((0, 0), label_1, font=font) tw = bbox[2] - bbox[0] th = bbox[3] - bbox[1] draw.text((cx - tw // 2, gutter_y + GAP - th - 2), label_1, fill=TEXT_COLOR, font=font) img.save(output_path) print(f"Skin template saved to {output_path} ({WIDTH}x{HEIGHT})") if __name__ == "__main__": main()