# A hand-written node. `rust:` names the type in `crate::ops` that implements # `Operation`; everything else about it — its descriptor, its parameters, its # WGSL — comes from that type rather than from this file. # # It appears here anyway so that `ops/` lists the whole pipeline in order. # A chain half-declared here and half-ordered in Rust would be worse than # either alone: the order is the one thing a reader comes to this directory # to learn. id: tone_curve order: 60 # Both, and this is the case the plural exists for: the RGB curve is # tonal and the per-channel curves are chromatic. Filing it under one # would hide it from half the people looking for it. rust: ToneCurve why_rust: | Four curves — master, red, green, blue — of five control points each, presented as one widget, with an interpolator and a monotonicity guarantee behind them. Its neutral is a *relationship* between parameters rather than a set of values — the identity diagonal, on every channel — which is not something the declarative `active:` rule can express; its `presentation()` spans forty parameters rather than describing one; and its fragment is *assembled* rather than written, because each curve reaches the shader only when it has been moved off the diagonal. A declared node's `wgsl:` is one fixed block of text, which is the right shape for nearly everything here and the wrong one for a node whose cost has to follow what the photographer actually touched. placement: | After the fixed-weight region controls, so the curve is the final word on tone: a photographer reaches for it to fix what those controls could not place exactly. Within the node, the master curve runs before the per-channel ones. Both orders are visibly different images and the reasons for this one are written out in `src/ops/curve.rs`: the master is tonal and hue-preserving, the per-channel curves are the chromatic grade over the tones it produced, and a point placed on a channel curve should act on the tone the photographer can see rather than on the one the master is about to move.