app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

build_icon.sh (2213B)


      1 #!/usr/bin/env bash
      2 set -euo pipefail
      3 
      4 script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
      5 platform_root="$(cd "${script_dir}/.." && pwd -P)"
      6 source_artwork="${platform_root}/App/Resources/AppIconSource.png"
      7 color_profile="/System/Library/ColorSync/Profiles/sRGB Profile.icc"
      8 output_path="${1:-}"
      9 
     10 require_command() {
     11   if command -v "$1" >/dev/null 2>&1; then
     12     return
     13   fi
     14   echo "missing required command: $1" >&2
     15   exit 1
     16 }
     17 
     18 require_command sips
     19 require_command iconutil
     20 
     21 if [[ -z "${output_path}" ]]; then
     22   echo "usage: $0 <output-icns-path>" >&2
     23   exit 1
     24 fi
     25 
     26 if [[ ! -f "${source_artwork}" ]]; then
     27   echo "missing source artwork: ${source_artwork}" >&2
     28   exit 1
     29 fi
     30 
     31 if [[ ! -f "${color_profile}" ]]; then
     32   echo "missing macos icon color profile: ${color_profile}" >&2
     33   exit 1
     34 fi
     35 
     36 tmp_dir="$(mktemp -d)"
     37 cleanup() {
     38   rm -rf "${tmp_dir}"
     39 }
     40 trap cleanup EXIT
     41 
     42 normalized_png="${tmp_dir}/source.normalized.png"
     43 iconset_dir="${tmp_dir}/AppIcon.iconset"
     44 
     45 mkdir -p "${iconset_dir}" "$(dirname "${output_path}")"
     46 sips -s format png -m "${color_profile}" "${source_artwork}" --out "${normalized_png}" >/dev/null
     47 
     48 source_width="$(
     49   sips -g pixelWidth "${normalized_png}" | awk '/pixelWidth/ {print $2}'
     50 )"
     51 source_height="$(
     52   sips -g pixelHeight "${normalized_png}" | awk '/pixelHeight/ {print $2}'
     53 )"
     54 
     55 if [[ "${source_width}" != "${source_height}" ]]; then
     56   echo "macos icon source must be square: ${source_width}x${source_height}" >&2
     57   exit 1
     58 fi
     59 
     60 if [[ "${source_width}" -lt 1024 ]]; then
     61   echo "macos icon source must be at least 1024x1024: ${source_width}x${source_height}" >&2
     62   exit 1
     63 fi
     64 
     65 generate_icon() {
     66   local filename="$1"
     67   local size_px="$2"
     68   sips -z "${size_px}" "${size_px}" "${normalized_png}" \
     69     --out "${iconset_dir}/${filename}" >/dev/null
     70 }
     71 
     72 generate_icon "icon_16x16.png" 16
     73 generate_icon "icon_16x16@2x.png" 32
     74 generate_icon "icon_32x32.png" 32
     75 generate_icon "icon_32x32@2x.png" 64
     76 generate_icon "icon_128x128.png" 128
     77 generate_icon "icon_128x128@2x.png" 256
     78 generate_icon "icon_256x256.png" 256
     79 generate_icon "icon_256x256@2x.png" 512
     80 generate_icon "icon_512x512.png" 512
     81 generate_icon "icon_512x512@2x.png" 1024
     82 
     83 iconutil -c icns "${iconset_dir}" -o "${output_path}"