burrow/Scripts/check-brand-icon-lowres.sh
Conrad Kramer 60cc48a4b7
Some checks failed
Build: Android / Android Rust Core Stub (push) Failing after 25s
Build Rust / Cargo Test (push) Successful in 4m2s
Build Site / Next.js Build (push) Failing after 4s
Lint Governance / BEP Metadata (push) Successful in 2s
Add raster panel icon family
2026-06-08 00:20:25 -07:00

92 lines
2.8 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$repo_root"
output_dir_arg="${1:-design/brand/low-res}"
if [[ "$output_dir_arg" = /* ]]; then
output_dir="$output_dir_arg"
else
output_dir="$repo_root/$output_dir_arg"
fi
master="$output_dir/burrow-icon-1024.png"
checked_in_master="$repo_root/design/brand/burrow-owl-icon-master.png"
source_master="$checked_in_master"
sizes=(16 20 24 29 32 40 48 64 80 128 256)
require_tool() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "error: required tool not found: $1" >&2
exit 127
fi
}
require_tool magick
require_tool awk
mkdir -p "$output_dir"
magick "$checked_in_master" -colorspace sRGB -strip "PNG32:$master"
printf "size,colors,gray_stddev,status\n" >"$output_dir/report.csv"
for size in "${sizes[@]}"; do
image="$output_dir/burrow-icon-${size}.png"
magick "$source_master" -colorspace sRGB -resize "${size}x${size}!" -strip "PNG32:$image"
actual="$(magick "$image" -format "%wx%h" info:)"
if [[ "$actual" != "${size}x${size}" ]]; then
echo "error: $image rendered as $actual, expected ${size}x${size}" >&2
exit 1
fi
colors="$(magick "$image" -format "%k" info:)"
stddev="$(magick "$image" -colorspace Gray -format "%[fx:standard_deviation]" info:)"
min_colors=$((size * 4))
if (( min_colors < 48 )); then
min_colors=48
fi
if (( min_colors > 900 )); then
min_colors=900
fi
awk -v size="$size" -v colors="$colors" -v min_colors="$min_colors" -v stddev="$stddev" '
BEGIN {
if (colors < min_colors) {
printf "error: %dpx icon has only %d colors; expected at least %d\n", size, colors, min_colors > "/dev/stderr";
exit 1;
}
if (stddev < 0.08) {
printf "error: %dpx icon grayscale stddev is %.6f; expected at least 0.08\n", size, stddev > "/dev/stderr";
exit 1;
}
}
'
printf "%s,%s,%s,ok\n" "$size" "$colors" "$stddev" >>"$output_dir/report.csv"
done
preview_inputs=()
pixel_preview_inputs=()
for size in 256 128 80 64 48 40 32 29 24 20 16; do
preview="$output_dir/preview-${size}.png"
if (( size <= 32 )); then
filter=Point
else
filter=Lanczos
fi
magick "$output_dir/burrow-icon-${size}.png" -filter "$filter" -resize 128x128 "$preview"
preview_inputs+=("$preview")
if (( size <= 32 )); then
pixel_preview="$output_dir/pixel-preview-${size}.png"
magick "$output_dir/burrow-icon-${size}.png" -filter Point -resize 128x128 "$pixel_preview"
pixel_preview_inputs+=("$pixel_preview")
fi
done
magick -background "#202020" -gravity center "${preview_inputs[@]}" +append "$output_dir/preview-strip.png"
magick -background "#202020" -gravity center "${pixel_preview_inputs[@]}" +append "$output_dir/pixel-preview-strip.png"
echo "low-res icon exports written to $output_dir"