Newer
Older
gnexus-tasks / tools / rasterize_icons.sh
#!/usr/bin/env bash
# Иконки gntodo растрируются из единственного источника — frontend/public/logo.svg
# (знак «стек входящих» на холсте 64×64 со скруглёнными краями, приём gnexus-creds).
#
#   frontend/public/icons/icon-192.png, icon-512.png   purpose "any" — они же
#                                                      иконка системного уведомления (sw.ts)
#   frontend/public/icons/apple-touch-icon.png         «на экран Домой» в iOS
#   frontend/public/icons/maskable-512.png             purpose "maskable"
#   extension/public/icons/icon-{16,32,48,128}.png     иконки расширения
#
# Сюда же копируется само лого в public/ расширения (попап показывает его из
# своего public — у упакованного расширения свой корень, симлинк не переживёт
# сборку ZIP): копия обновляется этим же скриптом, чтобы не отстать от лого.
#
# Нужен ImageMagick с rsvg (проверка: magick -list format | grep SVG → RSVG).
#
# Углы. Скругление логотипа (rx 10 = 15% стороны) видно, только пока за холстом
# прозрачность: с впечатанным фоном оно сливается с заливкой холста, и иконка
# читается квадратом с острыми углами. Поэтому углы прозрачны у всех иконок без
# исключения (решение владельца 2026-10-10): у PWA «any», apple-touch-icon и иконок
# расширения знак идёт во весь кадр, у maskable — в safe zone 80% (иначе Android
# срежет знак при обрезке по кругу), а кадр и там скруглён во всю иконку. iOS
# прозрачность рисует чёрным, но свою маску он накладывает поверх и углы срезает —
# а показывать иконку без маски (лаунчер, магазин) лучше скруглённой, чем квадратом.
# После правки логотипа: ./tools/rasterize_icons.sh
set -euo pipefail
cd "$(dirname "$0")/.."

LOGO=frontend/public/logo.svg
PAGE='#16161E'   # заливка холста логотипа — ею же залит кадр иконок с полями
SAFE=80          # maskable: знак = 80% кадра (safe zone адаптивных иконок Android)
APPLE=180        # apple-touch-icon: рекомендованный iOS размер

raster_rounded() { # <размер> <файл> — знак во весь кадр, углы прозрачны
  local size=$1 out=$2
  magick -background none -density $((96 * size / 64)) "$LOGO" \
    -resize "${size}x${size}" -depth 8 -strip "$out"
}

raster_maskable() { # <размер> <файл> — кадр во всю иконку, знак в safe zone (80%)
  local size=$1 out=$2
  local inner=$((size * SAFE / 100))
  local r=$((size * 10 / 64))   # то же скругление, что у холста логотипа
  magick -size "${size}x${size}" xc:none -fill "$PAGE" \
    -draw "roundrectangle 0,0,$((size - 1)),$((size - 1)),$r,$r" \
    \( -background none -density $((96 * inner / 64)) "$LOGO" -resize "${inner}x${inner}" \) \
    -gravity center -composite -depth 8 -strip "$out"
}

raster_rounded 192 frontend/public/icons/icon-192.png
raster_rounded 512 frontend/public/icons/icon-512.png
raster_rounded "$APPLE" frontend/public/icons/apple-touch-icon.png
raster_maskable 512 frontend/public/icons/maskable-512.png
for s in 16 32 48 128; do raster_rounded "$s" "extension/public/icons/icon-$s.png"; done

# лого попапа расширения — копия источника (см. шапку скрипта)
cp "$LOGO" extension/public/logo.svg

command ls -l frontend/public/icons/*.png extension/public/icons/*.png extension/public/logo.svg