65816-llvm-mos/scripts/updateScreenshots.sh
2026-05-25 21:00:32 -05:00

96 lines
3.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# updateScreenshots.sh - regenerate all demo screenshots and save them
# at 704x462 (double the native 704x231 to give a proper aspect ratio).
#
# For each demo:
# 1. Run snapDemo.sh to capture multiple frames during the run
# 2. Pick the last snapshot (most settled state)
# 3. Resize to 704x462 (height doubled)
# 4. Save to screenshots/<demo>.png
set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
OUT_DIR="$PROJECT_ROOT/screenshots"
# Demos with visible (or expected-empty-desktop) output.
DEMOS="helloBeep helloText helloWindow qdProbe orcaFrame frame minicad reversi heavyRelocs"
# Per-demo snap frame list. Most are fine with defaults; reversi/
# minicad/frame can use slightly later frames to capture more drawn
# content.
declare -A FRAMES
FRAMES[helloBeep]="6500"
FRAMES[helloText]="6500"
FRAMES[helloWindow]="6500"
FRAMES[qdProbe]="6500"
FRAMES[orcaFrame]="6500"
FRAMES[frame]="6000"
FRAMES[minicad]="6000"
FRAMES[reversi]="6500,7000,7500"
FRAMES[heavyRelocs]="6500"
for demo in $DEMOS; do
omf="$PROJECT_ROOT/demos/${demo}.omf"
[ -f "$omf" ] || { echo "skip $demo (no OMF — run demos/build.sh $demo)"; continue; }
echo "=== $demo ==="
frame_list="${FRAMES[$demo]:-6500}"
snap_out=$(PARK_MOUSE=1 bash "$SCRIPT_DIR/snapDemo.sh" "$demo" "$frame_list" 2>&1) || {
echo " snapDemo.sh failed for $demo (exit=$?); skipping"
continue
}
snap_dir=$(echo "$snap_out" | grep "snaps in:" | sed 's|snaps in: ||')
[ -d "$snap_dir/apple2gs" ] || { echo " no snaps for $demo (dir: $snap_dir)"; continue; }
# Pick the LAST .png (most settled state).
last_png=$(ls -1 "$snap_dir/apple2gs"/*.png 2>/dev/null | sort | tail -1)
[ -n "$last_png" ] || { echo " no png files in $snap_dir"; continue; }
# Resize to 704x462 (double height) and copy.
convert "$last_png" -resize 704x462\! "$OUT_DIR/${demo}.png"
# Mask the cursor artifact. Demos with active event loops (reversi)
# had their cursor moved off-screen by PARK_MOUSE; demos that stop
# processing events leave the cursor's XOR pattern frozen at its
# last position (around x=52-76, y=63-87 in 704x462 coords). Each
# demo needs a slightly different mask shape/color to avoid
# overpainting the menu bar divider line, window borders, or text.
case "$demo" in
helloText)
# white content area, menu bar divider at y=57-60 — skip
convert "$OUT_DIR/${demo}.png" \
-fill white -draw "rectangle 52,63 76,87" \
"$OUT_DIR/${demo}.png" ;;
minicad|orcaFrame)
# window top border at y=80 in doubled — mask above it only
convert "$OUT_DIR/${demo}.png" \
-fill white -draw "rectangle 52,62 76,79" \
"$OUT_DIR/${demo}.png" ;;
frame)
# frame's window border is lower; full cursor extent visible
convert "$OUT_DIR/${demo}.png" \
-fill white -draw "rectangle 52,62 76,86" \
"$OUT_DIR/${demo}.png" ;;
helloWindow)
# cursor sits on the window's black title bar — paint black
convert "$OUT_DIR/${demo}.png" \
-fill black -draw "rectangle 52,58 76,88" \
"$OUT_DIR/${demo}.png" ;;
reversi)
# cursor remnant in white area between window border and
# the title bar's black background; avoid title bar at
# x>=72 / y>=71.
convert "$OUT_DIR/${demo}.png" \
-fill white -draw "rectangle 54,63 71,70" \
"$OUT_DIR/${demo}.png" ;;
esac
echo " wrote $OUT_DIR/${demo}.png ($(identify -format '%wx%h' "$OUT_DIR/${demo}.png"))"
# Cleanup
rm -rf "$snap_dir"
done
echo ""
echo "All screenshots updated:"
identify "$OUT_DIR"/*.png | column -t