Keep the sigmoid as the default curve; Camera Raw's tone is a choice

The Camera Raw default rested on comparing against Lightroom previews
of photographs that carry the user's Lightroom edits — HSL saturation
Blue +58, Aqua +50 and more, Highlights -40, Blacks -20, in every
DNG's XMP — so it measured the house look, not Camera Raw's base
rendering. Under the ACR3 curve _MG_9080 renders brighter than its
Lightroom preview (mean 0.39 against 0.31).

So the curve choice's first variant, the default, is the sigmoid again
and every raw renders as in 0.20.0 apart from baseline exposure. D21
and camera-profiles.md §12 now say the default is open, to be decided
by measuring against Lightroom exports of unedited photographs. Tests
that are about Camera Raw's tone choose it explicitly.
This commit is contained in:
2026-10-03 14:22:48 -04:00
parent 0730ef1016
commit 1e8594724e
7 changed files with 48 additions and 25 deletions
+11 -9
View File
@@ -34,13 +34,15 @@ pub const ID: OpId = OpId("view_transform");
pub const CONTRAST: ParamId = ParamId("contrast");
pub const WHITE: ParamId = ParamId("white");
/// TRACES: FR-DEV-3j
/// Which curve renders: Camera Raw's (index 0, the default — D21) or D19's
/// sigmoid.
/// Which curve renders: D19's sigmoid (index 0, the default) or Camera
/// Raw's (D21). Which of the two should be the default is open — the
/// Lightroom-matching work decides it — so the default is what 0.20.0
/// rendered.
pub const CURVE: ParamId = ParamId("curve");
/// [`CURVE`]'s values, in the order of its variants.
pub const CAMERA_RAW: f32 = 0.0;
pub const SIGMOID: f32 = 1.0;
pub const SIGMOID: f32 = 0.0;
pub const CAMERA_RAW: f32 = 1.0;
static HELPERS: LazyLock<[Helper; 3]> = LazyLock::new(|| {
[
@@ -88,8 +90,8 @@ static DESCRIPTOR: LazyLock<Arc<OpDescriptor>> = LazyLock::new(|| {
"curve",
"param.view_transform.curve",
vec![
LocalizedKey("param.view_transform.curve.camera_raw"),
LocalizedKey("param.view_transform.curve.sigmoid"),
LocalizedKey("param.view_transform.curve.camera_raw"),
],
),
],
@@ -108,7 +110,7 @@ impl Default for ViewTransform {
Self {
contrast: DEFAULT_CONTRAST,
white: DEFAULT_WHITE,
curve: CAMERA_RAW,
curve: SIGMOID,
}
}
}
@@ -148,7 +150,7 @@ impl Operation for ViewTransform {
}
fn is_active(&self) -> bool {
self.contrast != DEFAULT_CONTRAST || self.white != DEFAULT_WHITE || self.curve != CAMERA_RAW
self.contrast != DEFAULT_CONTRAST || self.white != DEFAULT_WHITE || self.curve != SIGMOID
}
fn stage(&self) -> Stage {
@@ -159,9 +161,9 @@ impl Operation for ViewTransform {
"\
// Skipped for an already-rendered source: a JPEG is a display rendering
// already, and rendering it again would compress it twice.
// Camera Raw's tone by default (D21), D19's sigmoid by choice.
// D19's sigmoid by default, Camera Raw's tone by choice (D21).
if (!non_linear) {
if (mode < 0.5) {
if (mode > 0.5) {
c = camera_raw_tone(c, cr_scale, cr_power, cr_grey);
} else {
c = view_sigmoid(c, slope, inv_k, peak);