"""Render assets/icon.svg to assets/icon.ico (PNG-compressed entries at the usual Windows sizes). Run with: uv run python packaging/make_icon.py """ import struct import sys from pathlib import Path from PySide6.QtCore import QBuffer, QByteArray, QIODevice, Qt from PySide6.QtGui import QGuiApplication, QImage, QPainter from PySide6.QtSvg import QSvgRenderer SIZES = [16, 24, 32, 48, 64, 128, 256] ROOT = Path(__file__).resolve().parent.parent def render_png(renderer: QSvgRenderer, size: int) -> bytes: img = QImage(size, size, QImage.Format.Format_ARGB32) img.fill(Qt.GlobalColor.transparent) painter = QPainter(img) painter.setRenderHint(QPainter.RenderHint.Antialiasing) renderer.render(painter) painter.end() data = QByteArray() buf = QBuffer(data) buf.open(QIODevice.OpenModeFlag.WriteOnly) img.save(buf, "PNG") return bytes(data) def main() -> None: QGuiApplication(sys.argv[:1]) renderer = QSvgRenderer(str(ROOT / "assets/icon.svg")) pngs = [(size, render_png(renderer, size)) for size in SIZES] # ICONDIR header, then one ICONDIRENTRY per image, then the PNG data. out = struct.pack("= 256 else size # 0 means 256 out += struct.pack("