Let the tone curve continue past 1.0, and test that nothing clips

The tone curve clamped its input to [0, 1] and its output back to 1.0
around a 2.2 gamma, mid-chain — master and per-channel both. So any
edit with a curve made every scene value above 1.0 the same number
before the view transform ever saw it: D19's fourth finding. Beyond its
last point the curve now continues along its last span, whose secant
is the tangent the spline already gives that point, so the join is
smooth and an identity curve stays the identity to any height. The only
clamp left is the floor at zero, where there is no light to curve.

FR-DEV-2's acceptance test is how the rule stays true.
`scene_referred_until_the_view` wraps every point operation, at
non-neutral settings, between a gain of sixteen and one of a
sixty-fourth, with an identity in the view transform's place, and
renders a ramp from 0.4 to 15.2 times sensor saturation through it. The
output must still increase with the input and still separate the top of
the ramp. Run against the previous commit's tone curve it fails with
[21, 29, 33, 33, 33, 33, 33, 33]; every other operation already passed.
It renders on a device because dr-pipeline has none, and the spec's
pointer to it says so.
This commit is contained in:
2026-09-27 16:52:55 -04:00
parent 657f8f19ff
commit 0682d05f95
5 changed files with 265 additions and 30 deletions
+3 -3
View File
@@ -1272,9 +1272,9 @@ and unbounded, and no operation clamps above 1.0, applies a transfer function or
gamut. The view transform (FR-DEV-3j) is the one stage that does, and the output transform after
it clips and encodes. This is the constraint the base curve broke and ARCH §5.2 had drawn all
along: a display-referred curve in the middle of the chain throws away what every later stage,
the neighbourhood ones above all, needs. A test (`scene_referred_until_the_view`) runs every point
operation over a ramp to 16.0 so that a fragment that clips fails the build rather than the
photograph.
the neighbourhood ones above all, needs. A test (`scene_referred_until_the_view`, in `dr-gpu`)
runs every point operation over a ramp to 16.0 so that a fragment that clips fails the build rather
than the photograph.
---
+4 -2
View File
@@ -316,8 +316,10 @@ the operations measure hue against; moving the primaries to Rec.2020 is deferred
*Acceptance:* every point operation at non-neutral settings, handed a ramp to 16.0, returns values
that are still monotone in the ramp and still above 1.0 where the ramp is, before the view
transform (`scene_referred_until_the_view` in `dr-pipeline`). The view transform itself and film
simulation are excluded, because clipping into a display range is their job.
transform (`scene_referred_until_the_view`, `core/dr-gpu/tests/scene_referred.rs`, rendered on a
device: `dr-pipeline` has none). The view transform itself and film simulation are excluded,
because clipping into a display range is their job, and so is the detail stage, which a flat frame
cannot exercise.
**FR-DEV-3 — Adjustment set (v1).**
File diff suppressed because one or more lines are too long