46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Generate PWA icons from OrthodoxCross.svg using rsvg-convert + Pillow."""
|
|
|
|
import os
|
|
import subprocess
|
|
import tempfile
|
|
from PIL import Image
|
|
|
|
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
PROJECT_DIR = os.path.join(SCRIPT_DIR, '..')
|
|
SVG_PATH = os.path.join(PROJECT_DIR, 'static', 'OrthodoxCross.svg')
|
|
ICONS_DIR = os.path.join(PROJECT_DIR, 'static', 'icons')
|
|
os.makedirs(ICONS_DIR, exist_ok=True)
|
|
|
|
GOLD = (0xC5, 0xA5, 0x5A)
|
|
NAVY = (0x1A, 0x1A, 0x2E)
|
|
RENDER_SIZE = 2048
|
|
|
|
def generate_icon(size):
|
|
with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
|
|
tmp_path = tmp.name
|
|
try:
|
|
subprocess.run([
|
|
'rsvg-convert',
|
|
'-w', str(RENDER_SIZE),
|
|
'-h', str(RENDER_SIZE),
|
|
SVG_PATH,
|
|
'-o', tmp_path,
|
|
], check=True)
|
|
img = Image.open(tmp_path).convert('RGBA')
|
|
result = Image.new('RGBA', (size, size), NAVY + (255,))
|
|
cross = img.resize((size, size), Image.LANCZOS)
|
|
gold_layer = Image.new('RGBA', (size, size), GOLD + (255,))
|
|
result.paste(gold_layer, mask=cross.split()[3])
|
|
return result
|
|
finally:
|
|
os.unlink(tmp_path)
|
|
|
|
for size in [192, 512]:
|
|
icon = generate_icon(size)
|
|
out = os.path.join(ICONS_DIR, f'icon-{size}.png')
|
|
icon.save(out, 'PNG')
|
|
print(f'Saved {out} ({size}x{size})')
|
|
|
|
print('Icons generated.')
|