Skin template system, separate prev sprite, reorganize device scripts
Add tools/gen_skin_template.py to generate a labeled 642x420 PNG template for creating custom spritesheets. Move rg35xx device scripts from tools/ to device/rg35xx/. Point prev_sprite at its own cell (bottom-center) so Prev and Next can have distinct icons. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
96
tools/gen_skin_template.py
Normal file
96
tools/gen_skin_template.py
Normal file
@@ -0,0 +1,96 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user