diff --git a/icons/icon128.png b/icons/icon128.png index a599bd2..6b84581 100644 Binary files a/icons/icon128.png and b/icons/icon128.png differ diff --git a/icons/icon16.png b/icons/icon16.png index 09f0c04..e2bb08c 100644 Binary files a/icons/icon16.png and b/icons/icon16.png differ diff --git a/icons/icon48.png b/icons/icon48.png index f07eff6..b2b141d 100644 Binary files a/icons/icon48.png and b/icons/icon48.png differ diff --git a/scripts/rasterize-icons.sh b/scripts/rasterize-icons.sh new file mode 100755 index 0000000..2a90a78 --- /dev/null +++ b/scripts/rasterize-icons.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +# +# scripts/rasterize-icons.sh — Plan 01-12 Wave 2 Task 1. +# +# One-off icon rasterization recipe. +# +# Reads src/shared/brand/mokosh-mark.svg (the Loom 2×2 weave intersection +# brand mark; D-01) and emits icons/icon{16,48,128}.png via rsvg-convert. +# +# Verified locally (RESEARCH §3): output is 8-bit/color RGBA, non- +# interlaced PNG at the requested dimensions. Sizes clear assets-spec.md +# Chrome imageUtil floors (16≥200B, 48≥500B, 128≥1024B): +# 16 → ~406 B +# 48 → ~784 B +# 128 → ~1952 B +# +# This script is NOT wired into prebuild (per RESEARCH §3 anti-pattern: +# regenerating icons at every build is wasteful + masks regressions in +# the source SVG). PNGs are committed as static artifacts; re-run this +# script when src/shared/brand/mokosh-mark.svg changes. +# +# Replaces the Bug A Plan 01-09 Path A placeholder icons (16-bit/color +# RGB dark-square + green-dot at 574 B / 1153 B / 2615 B) with the +# rasterized Loom mark. +# +# References: +# - librsvg rsvg-convert(1) manpage +# - assets-spec.md Chrome imageUtil silent-rejection floors +# - Plan 01-12 RESEARCH §3 (rsvg-convert default output format) +# +# Google bash style applies; see https://google.github.io/styleguide/shellguide.html + +set -euo pipefail + +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" +readonly MARK_SVG="${REPO_ROOT}/src/shared/brand/mokosh-mark.svg" +readonly ICONS_DIR="${REPO_ROOT}/icons" + +# Per assets-spec.md silent-rejection floors. Indexed by size for clear logs. +declare -rA FLOORS=( + [16]=200 + [48]=500 + [128]=1024 +) + +main() { + if [[ ! -f "${MARK_SVG}" ]]; then + echo "ERROR: ${MARK_SVG} not found" >&2 + return 1 + fi + if ! command -v rsvg-convert >/dev/null 2>&1; then + echo "ERROR: rsvg-convert not found on PATH (install librsvg)" >&2 + return 1 + fi + + mkdir -p "${ICONS_DIR}" + + local size + for size in 16 48 128; do + local out="${ICONS_DIR}/icon${size}.png" + rsvg-convert -w "${size}" -h "${size}" "${MARK_SVG}" -o "${out}" + + local bytes + bytes="$(stat -c%s "${out}")" + local floor="${FLOORS[${size}]}" + + if (( bytes < floor )); then + echo "FAIL: ${out} (${bytes} bytes) is below Chrome imageUtil floor ${floor} B" >&2 + return 1 + fi + echo " rasterized: ${out} (${bytes} bytes; floor ${floor} B)" + done + + echo + echo "==> Done. PNGs are at ${ICONS_DIR}/icon{16,48,128}.png." +} + +main "$@"