assertions missed
`Rasteriser::register_xobject` takes a form's recorded commands from a
caller that can resolve the page dictionary, so Phase 7's last golden-corpus
criterion is met with pixels instead of with a request recorded by name.
The first golden of that page showed the form drawn at the **page origin**,
ignoring the `1 0 0 1 20 20 cm` that placed it. The recorded commands'
`SetTransform`s are absolute in form space, and replaying them overwrote the
page's CTM rather than composing with it. Nested lists now compose against
the CTM in force at the `Do`.
The colour assertions written next to that golden all passed while the bug
was live — a red square two pixels from where it belongs is still a red
square somewhere. That is the argument for pixel goldens in one sentence,
and it is why the golden is compared after the assertions and not instead
of them. The offset now has its own assertion too.
The new fixture's form deliberately overflows its own /BBox, so the clip is
visible in the golden as an absence rather than being taken on trust.
Phase 7's golden-corpus exit criterion is now met in full. The `ui.rs` smoke
tests remain blocked on the Makepad headless backend, as they have been
since Phase 1, and are still not claimed as done.
1426 tests pass.
`transparency.rs` implemented all sixteen blend modes and unit-tested them
against the specification's formulas. Nothing ever called them with a
backdrop. The Makepad renderer's `SetBlendMode` pushed a
`TransparencyError::Unsupported` and then painted the source colour, so a
/Multiply highlight and a /Normal one produced byte-identical output and
every test passed — because every test asked "was the right command
issued", not "does the page look right".
Overprint had no code at all. /OP, /op and /OPM were not parsed, so an
overprinting object knocked out the inks under it. That is not a missing
feature, it is the inverse of the instruction: on a press it is the
difference between a colour and a hole.
- `composite.rs`: a straight-alpha RGBA `Canvas` implementing §11.3.6's
union formula, weighted by backdrop alpha so a Multiply over transparency
is the source rather than black. Constant alpha and per-pixel soft masks.
Transparency groups composite as a unit; knockout groups are refused by
name rather than silently treated as non-knockout.
- Overprint as `composite_cmyk`, separate from the RGB path rather than a
flag on it: overprint is a statement about inks and RGB has none. /op
defaults to /OP per table 58 — defaulting it to false makes the common
`<< /OP true >>` knock out every fill. §10.7.5's "no effect on an RGB
device" is asserted, so our doing nothing there is the spec rather than
an omission.
- `raster.rs`: a CPU rasteriser that replays a command list onto a canvas.
Not on the display path, no anti-aliasing, no fonts; it exists so
compositing has a verifiable output. In pdf-graphics and not pdf-makepad
because a test that needs a GPU is a test that does not run.
- Golden **pixels** for shading, mesh, blend and overprint pages — Phase
7's exit criterion, which the Phase 2 command-text goldens cannot meet.
ASCII grids with a colour legend, quantised to quarter steps; each test
asserts its exact colours before comparing, so a wrong-but-stable render
cannot be blessed by an UPDATE_GOLDEN run.
Six mutations, all killed, including the two that describe the old
behaviour: discarding the blend result, and ignoring the overprint flag.
1364 tests pass. ADR 0030.