#!/usr/bin/env bash
# Cross-backend parity check: renders each milestone example with the vello
# (GPU) and tiny-skia (software) backends under quibble, screenshots both at
# two output sizes, and compares each pair with the cross-renderer tolerance.
#
# Requires: quibble + quibblectl on PATH. Exits nonzero on any mismatch.
set -euo pipefail
cd "$(dirname "$0")/.."
EXAMPLES=(m0_scene m1_widgets m2_counter m3_counter m4_themed m5_dev m6_form m8_echo m9_scroll m10_panel m16_demo m18_demo)
for example in "${EXAMPLES[@]}"; do
cargo build -p guiduck --example "$example"
done
cargo build -p guiduck-render-tinyskia --bin png-diff
workdir=$(mktemp -d)
declare -a socks=()
cleanup() {
for sock in "${socks[@]}"; do
quibblectl --socket "$sock" quit >/dev/null 2>&1 || true
done
if [ -n "${PARITY_KEEP:-}" ]; then echo "images kept in $workdir" >&2; else rm -rf "$workdir"; fi
}
trap cleanup EXIT
status=0
for example in "${EXAMPLES[@]}"; do
for backend in vello software; do
sock="$workdir/$example-$backend.sock"
socks+=("$sock")
GUIDUCK_BACKEND=$backend quibble --socket "$sock" \
"target/debug/examples/$example" \
>"$workdir/$example-$backend.out" 2>"$workdir/$example-$backend.err" &
for _ in $(seq 1 50); do
quibblectl --socket "$sock" ping >/dev/null 2>&1 && break
sleep 0.2
done
quibblectl --socket "$sock" wait-window --timeout-ms 30000 >/dev/null
done
for size in "1280 800" "700 500"; do
read -r w h <<<"$size"
for backend in vello software; do
quibblectl --socket "$workdir/$example-$backend.sock" \
set-output "$w" "$h" >/dev/null
done
# Give both apps a moment to repaint at the new size.
sleep 1
for backend in vello software; do
quibblectl --socket "$workdir/$example-$backend.sock" \
screenshot -o "$workdir/$example-$backend-${w}x${h}.png" >/dev/null
done
echo "== $example ${w}x${h} =="
if ! target/debug/png-diff \
"$workdir/$example-vello-${w}x${h}.png" \
"$workdir/$example-software-${w}x${h}.png"; then
status=1
keep="target/parity-failures"
mkdir -p "$keep"
cp "$workdir/$example-vello-${w}x${h}.png" \
"$workdir/$example-software-${w}x${h}.png" "$keep/"
echo "MISMATCH: $example at ${w}x${h}; screenshots kept in $keep/" >&2
fi
done
for backend in vello software; do
quibblectl --socket "$workdir/$example-$backend.sock" quit >/dev/null 2>&1 || true
done
done
exit $status