diff --git a/src/common/windows/c-logo.sh b/src/common/windows/c-logo.sh index e4d7863cc..cea8824c7 100755 --- a/src/common/windows/c-logo.sh +++ b/src/common/windows/c-logo.sh @@ -1,10 +1,34 @@ #!/bin/sh -# Convert logo.svg to logo.ico -rsvg-convert -w 16 -h 16 logo.svg > logo16.png -rsvg-convert -w 32 -h 32 logo.svg > logo32.png -rsvg-convert -w 48 -h 48 logo.svg > logo48.png -rsvg-convert -w 64 -h 64 logo.svg > logo64.png -rsvg-convert -w 128 -h 128 logo.svg > logo128.png -rsvg-convert -w 256 -h 256 logo.svg > logo256.png -convert logo16.png logo32.png logo48.png logo64.png logo128.png logo256.png logo.ico +# Convert logo.svg to logo.ico. +# +# Every frame is stored as PNG. ImageMagick's ICO writer only uses PNG for frames that are +# 256x256 or larger and falls back to an uncompressed DIB for everything smaller, which +# inflates the icon from ~19 KB to ~108 KB (and to ~370 KB on ImageMagick 7, which also +# stores 256x256 as a DIB). Packing the frames here keeps the icon small and predictable. +set -e + +cd "$(dirname "$0")" + +for size in 16 32 48 64 128 256; do + rsvg-convert -w "$size" -h "$size" ../../logo/logo.svg > "logo$size.png" +done + +python3 - <<'PY' +import struct + +sizes = [16, 32, 48, 64, 128, 256] +frames = [open(f"logo{s}.png", "rb").read() for s in sizes] + +header = struct.pack("