111 lines
6.9 KiB
Markdown
111 lines
6.9 KiB
Markdown
# vector-conformance — vector graphics
|
||
|
||
Vectors for `wai.graphics.vector`
|
||
([`extensions/graphics-vector.md`](../extensions/graphics-vector.md)): the `WOS1`
|
||
outline set and the `WVG1` payload with the order in which a sink refuses them (§2),
|
||
the arithmetic a sink loads with: the clock, track evaluation, the load-time interval
|
||
check and the per-frame cost (§3.1–§3.4); and the raster stage family RS1–RS9 and the
|
||
frame procedure (§3.5–§3.10), as the SHA-256 of every frame's `RGBA8P`. The
|
||
capability is a Draft and is not registered; this corpus precedes its registration.
|
||
|
||
**Provenance.** Generated here by `wai-vector vectors gen` from formulas: every
|
||
payload, outline set and arithmetic input is integers and text written in this
|
||
repository, with no media and no font. The outline sets under `sets/` and inside the
|
||
payloads are drawn from formulas in `wai-vector/src/vectors/sets.rs`, and each set's
|
||
notes state that it was generated here and is licensed Apache-2.0. All text in the
|
||
blocks is written here.
|
||
|
||
**Equivalence.** A sink conforms on this corpus when, for every payload, it reports the
|
||
expected file's `code`: the first refusal §2.7 gives, or `accepted`; and for every
|
||
accepted payload it computes the same `SIZE` costs (§3.4(b)), the same `text_hash` and
|
||
block identities (§2.11), the same ticks per frame and frame range for each rate
|
||
(§3.1, §2.7), and, where the expected file lists frames, the same `RGBA8P` bytes for
|
||
every frame at every listed size and rate (overlay-equivalence, §1.3). An outline-set
|
||
parser conforms when it reports §2.1's first code for every `.wos1` vector.
|
||
|
||
## Layout
|
||
|
||
- `sets/<name>.wos1` — the outline sets the payloads hold as held sets. A held `SET`
|
||
record finds its set here by SHA-256; a digest none of these files has is not held.
|
||
- `vectors/<group>/<name>.wvg1` — a payload, with its JSON authoring form (§2.12) beside
|
||
it as `<name>.json`. The form has one member per field, zero fields included, and
|
||
converts back to the same bytes (`wai-vector pack`).
|
||
- `vectors/<group>/<name>.wos1` — an outline set checked on its own (§2.1).
|
||
- `vectors/arith/<name>.json` and `vectors/flatten/<name>.json` — an arithmetic input:
|
||
an operation and its cases.
|
||
- `vectors/<group>/index.json` — what each vector pins.
|
||
- `expected/<group>/<name>.json` — the result recomputed from the vector and `sets/`
|
||
alone, keys in ascending order, no whitespace:
|
||
- a refusal: `{"code": …}`;
|
||
- an accepted payload: `instr` (its SHA-256), `text_hash`, `blocks` (each block's
|
||
identity, in reading order), `sizes` (`[w, h, cost]`) and `rates`
|
||
(`[num, den, P, first frame, last frame]`; the range is empty when the first
|
||
exceeds the last);
|
||
- in the groups that render, `frames`: for each listed size and rate, every frame's
|
||
`[g, SHA-256 of RGBA8P]` and the clip digest, the SHA-256 of the frames' digests
|
||
concatenated in order of `g` (SPEC §7, *Digests*); in `composite`, also each
|
||
frame's `RGBA8S` digest (`rgba8s`);
|
||
- an arithmetic input: its results, or the SHA-256 of a whole table.
|
||
- `sha256.json` — the digest sidecar SPEC §7, *Digests*, asks of a corpus: each entry
|
||
names its buffer and states its SHA-256: the `div255` table, and for each rendering
|
||
vector at each listed size and rate, every frame's digest and the clip digest.
|
||
|
||
## Groups
|
||
|
||
- `arith` — `div255` over every input; both coverage quantisers over every `v` in
|
||
`[−2^18, 2^18]`; the straight-alpha channel over every `c ≤ A`; `R_rat` and
|
||
`R_half_up` at ties of both signs and at the driver's widths; track evaluation at
|
||
spans of `2^31 − 1` ticks, value steps of `2^23` and tables that are not monotone.
|
||
- `canonical` — accepted payloads of every structure, each of which writes back to its
|
||
own bytes, and one refusal per canonical rule (§2.5): first-reference order,
|
||
duplicates and unreferenced entries in each pool, group numbering and contiguity,
|
||
ruby links, clusters, and a decorative path alternative.
|
||
- `refusals` — a payload or outline set per code and per check of §2.7 and §2.1, and
|
||
pairs of faults whose code pins the order: steps in order, fields in offset order
|
||
within a record, the record pass before any cross-table check, each set's checks
|
||
before the next set's. Held sets come from `sets/`, through a resolver that refuses a
|
||
digest it does not hold and reads at most `length + 1` bytes.
|
||
- `geometry` — the interval check (§3.4(a)) accepted with an end at `2^22 − 1` and
|
||
refused at `2^22` on each axis, at a second listed size, for an item never active,
|
||
for a clip, for enclosing groups' translations and for a glyph with no points; and a
|
||
document whose true range fits and whose interval does not, refused.
|
||
- `cost` — a document whose cost is exactly `2^32 − 1` (accepted), one at `2^32`
|
||
(`too_large`), stated costs off by one (`payload_malformed`), a reused path counted
|
||
per use, windows that touch counted once, a group's cost, and three shapes that
|
||
exceed the ceiling by reusing a full-canvas path, a path of 16,381 points and a
|
||
full-canvas glyph.
|
||
|
||
- `flatten` — quadratics and cubics at the corners of the device range (levels 9 and
|
||
10), at each level boundary, degenerate, and at negative coordinates: each curve's
|
||
level and vertices (§3.5).
|
||
- `fills` — fills and the same fills with every contour reversed, whose frames are
|
||
equal (P1); random polygons; a self-intersecting star under both rules; slivers;
|
||
edges on pixel and subpixel boundaries; the left fold; squares at each canvas edge;
|
||
negative coordinates; A-F5's triangle; a comb of 16,382 points that attains
|
||
`D_r = 256·p`; a path of 16,383 points; the non-zero seam and the even-odd fringe of
|
||
§3.13.
|
||
- `runs` — glyphs that abut mid-pixel (no seam within a run, a seam across runs),
|
||
overlap, carry marks; a run of 4,096 glyphs; one glyph at all 256 subpixel phases.
|
||
The run set is drawn here (`vectors/raster.rs`) and carried inline.
|
||
- `composite` — opacity, isolated groups four deep, clips under both rules, the group
|
||
pop, and pixels on which the two candidate fill orders differ (§3.9).
|
||
- `motion` — a credit roll at an integer speed (frame `k` is frame 0 moved, P2) and at
|
||
a fractional one, a lower third that slides, holds and fades as a group, and each
|
||
easing mode.
|
||
- `clock` — one document at 1280 × 720, 1920 × 1080 and 3840 × 2160, and at 25,
|
||
30000/1001 and 60 fps.
|
||
- `slicing` — a document and three pieces cut from it; each piece's frames equal the
|
||
whole's at the same `g` (P7).
|
||
|
||
## Regenerating and verifying
|
||
|
||
```sh
|
||
cd wai/wai-vector
|
||
cargo run --release --features std --bin wai-vector -- vectors gen ..
|
||
cargo run --release --features std --bin wai-vector -- vectors verify ..
|
||
```
|
||
|
||
`vectors verify` regenerates every file and requires the committed bytes, then
|
||
recomputes every expected file from its vector and `sets/` alone, and converts every
|
||
payload's authoring form back to its bytes. `wai-vector/wasm/verify.mjs` recomputes the
|
||
expected files under a browser's WebAssembly engine with Node.
|