Files
craft-libs/scripts/fetch-affinity-corpus.sh
Dylan M. Taylor 0984f412a6 craft-affinity: bounded reader for native Affinity documents, from VectorCraft and PhotoCraft (#914)
* craft-affinity: bounded reader for native Affinity documents, moved from VectorCraft

The reader of .af, .afdesign, .afphoto and .afpub files (archive, object stream and document
model) as it is in storytold/vectorcraft at 6e873b80 (crates/affinity), under a neutral name.
Its corpus tests read the pinned public documents scripts/fetch-affinity-corpus.sh fetches.

* craft-affinity: fold in what only PhotoCraft's copy of the reader had

From storytold/photocraft at 63b641b5 (crates/affinity), onto the VectorCraft copy:

- Special shapes: clouds, hearts, cogs, callouts, arrows, double stars, tears, crescents,
  diamonds and segments come in as their own outlines, not their bounding ellipse.
- Null slots of object lists are charged to the document's work before a list is scanned,
  on every visit of a shared object (children, attachments, effects, compound operands,
  page lists, paint lists, gradient colours, text blocks and runs, table cells, tile lists).
- A colour or gradient position record is decoded only as far as its components are read.
- 16-bit and 8-bit planes are interleaved through tables, not an f64 for each pixel.
- Limits::max_pixel_bytes: the caller sets what the pixel layers of one import may hold.
- Pixels::cmyka8_to_rgba8 for a caller without colour management.

The crate README and docs describe the model on its own terms.

* craft-affinity: a callout with a right-to-left box no longer panics; an oversized shape imports as its box

Ported from storytold/photocraft#10473 by DJHoltkamp. A callout rectangle clamped its tail
with clamp(x0, x1), which panics when the box is stored right to left. A box with finite
corners whose size overflows gave infinite or NaN outline points; it now imports as its box
with a warning. Also drops the inflated doc.dat once it is parsed.
2026-11-11 17:42:11 -05:00

21 lines
991 B
Bash
Executable File

#!/usr/bin/env bash
# Fetch the public Affinity documents craft-affinity's corpus tests read into DIR (default
# target/fixtures/affinity), each from its upstream repository at a pinned commit and checked
# against the SHA-256 in crates/affinity/tests/support/corpus.tsv. They are test data under
# CC0, MIT or Apache-2.0 (the licence of each is in that file), never committed.
#
# Run the tests on them with AFFINITY_CORPUS=DIR cargo test -p craft-affinity --all-features.
set -euo pipefail
cd "$(dirname "$0")/.."
DEST=${1:-target/fixtures/affinity}
mkdir -p "$DEST"
while IFS=$'\t' read -r sha name _licence url; do
out="$DEST/$name"
if ! echo "$sha $out" | sha256sum -c --status 2>/dev/null; then
curl -fsSL --proto '=https' --retry 3 -o "$out" "$url"
echo "$sha $out" | sha256sum -c --status || { rm -f "$out"; echo "$name: SHA-256 does not match" >&2; exit 1; }
fi
done < crates/affinity/tests/support/corpus.tsv
echo "Affinity corpus verified in $DEST"