joeylib2/scripts/check-tilebank.sh
2026-10-13 14:01:46 -05:00

49 lines
2.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# Part of JoeyLib, Copyright (c) 2026 Scott Duensing, under the MIT License.
# See LICENSE.md for license information.
# SPDX-License-Identifier: MIT
#
# check-tilebank.sh - Host-cc gate for the baked tile-bank loaders
# (jlTileBankLoad / jlTileBankLoadToSurface in src/core/assetLoad.c), end to
# end: assetbake.py bakes tests/host/tileBank.png, the real loader reads it,
# the real generic tile paste draws it, and tests/host/tileBankHost.c checks
# every pixel against the PNG. Also checks the refusals (a bank baked for any
# other target, bad magic, short header, missing file), a truncated bank,
# maxTiles below the bank size, a bank without a palette, and a bank bigger
# than a surface.
#
# Built as a whole BLANK-port program (the check-blank.sh source set plus the
# harness). BLANK draws chunky 4bpp like DOS, and assetLoad.c expects the DOS
# target byte there, so the DOS bake is the bank that must load. Every other
# target assetbake knows is baked too and must be refused.
#
# tests/host/tileBankStage.py stages the banks and the expected pixels and
# palette (decoded from the PNG with PIL, independent of assetbake's
# encoders), exactly as make/<port>.mk stages them for examples/tilebank on
# the real ports. The harness prints the surface hash of its to-surface load;
# scripts/verify-<port>-tilebank.sh run this script and require each port's
# own bake to hash the same. Exits nonzero on any failed check.
set -euo pipefail
repo=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
cc=${CC:-cc}
work=$(mktemp -d -t joeylib-tilebank.XXXXXX)
trap 'rm -rf "$work"' EXIT
png="$repo/tests/host/tileBank.png"
hostTarget=dos
cd "$repo"
"$cc" -DJOEYLIB_PLATFORM_BLANK \
-Iinclude -Iinclude/joey -Isrc/core -Isrc/codegen -Wall \
src/core/*.c src/generic/*.c src/blank/blank.c tests/host/tileBankHost.c \
-o "$work/tileBankHost"
python3 "$repo/tests/host/tileBankStage.py" "$hostTarget" "$png" "$work/DATA"
refuse=()
for bank in "$work"/DATA/refuse*.tbk; do
refuse+=("$(basename "$bank")")
done
# Run from the temp dir: the harness reads and writes DATA/ there.
cd "$work"
"$work/tileBankHost" "${refuse[@]}"