Call the reference curve what it is, and drop wording that reads as copying
The view transform's second curve is the DNG SDK's published reference
rendering — the ACR3 default curve applied by RefBaselineRGBTone — so
it is the "DNG Reference" curve in the panel, D21 and the code, not a
name borrowed from another product. Comments and docs that justified a
choice by another editor doing it ("as their Amount", "so a
photographer arriving from it finds the name") now give the actual
reason. The Vivid presets no longer describe themselves as reaching
for another editor's look; they are DarkRoom's own.
Factual mentions stay: which program wrote the library's DNGs, what
was measured against, and preset import. camera-profiles.md gains §15,
on starting a photograph from the edit it already carries.
This commit is contained in:
+35
-14
@@ -95,7 +95,7 @@ Two departures, both forced by D19's unbounded scene-linear values (the SDK runs
|
||||
both tables, which is where the second reason matters:
|
||||
- **The look sees exposure.** The SDK applies `LookTable` after its exposure ramp, so a look that
|
||||
desaturates highlights finds the highlights the photographer chose. At 25 it does too. Contrast,
|
||||
tone and the colour controls come after it, as they do in Camera Raw.
|
||||
tone and the colour controls come after it, as they do in the DNG SDK's reference rendering.
|
||||
|
||||
**Tables are per source, like the matrix.** They are decoded with the raw, interpolated once at
|
||||
decode (the HueSatMap blend uses the as-shot neutral, as the matrix does) and carried on
|
||||
@@ -151,7 +151,7 @@ reads a buffer no declaration can name:
|
||||
| Parameter | Kind | Default | Meaning |
|
||||
|---|---|---|---|
|
||||
| `apply` | Bool | on | Use the profile's tables, or the matrix alone |
|
||||
| `look` | Scalar 0–200 | 100 | Strength of the `LookTable`, as Lightroom's *Amount* |
|
||||
| `look` | Scalar 0–200 | 100 | Strength of the `LookTable` |
|
||||
|
||||
`look` scales the look's deltas: `hueShift · a`, `1 + (satScale − 1)·a`, `1 + (valScale − 1)·a`,
|
||||
with `a = look/100`, scales floored at 0. At 200 the look is twice as strong, which is the
|
||||
@@ -277,14 +277,14 @@ correction to it. The DNG SDK's total is their sum, and so is this one's.
|
||||
baseline, and matches a copied `.dcp` counts the baseline twice. Every Adobe-written DNG embeds
|
||||
its profile, so that DNG is a hand-made one.
|
||||
|
||||
## 12. Camera Raw tone (D21)
|
||||
## 12. DNG reference tone (D21)
|
||||
|
||||
Lightroom's richer colour is its tone curve (§1). Camera Raw renders a raw through the profile's
|
||||
The DNG SDK's reference rendering runs a raw through the profile's
|
||||
`ProfileToneCurve`, or, for a profile that has none — Adobe Standard among them — through the
|
||||
*ACR3 default curve*, a 1025-point table published in the DNG SDK and carried by RawTherapee
|
||||
(GPLv3) as `adobe_camera_raw_default_curve`.
|
||||
|
||||
**How it is applied** is half of what it does. Camera Raw does not run the curve on each channel:
|
||||
**How it is applied** is half of what it does. The reference does not run the curve on each channel:
|
||||
`RefBaselineRGBTone` runs it on the largest and smallest channel and places the middle one at the
|
||||
same fraction between them as before. Hue is kept; saturation rises where the curve is steep —
|
||||
the shadows and midtones — which is exactly where Adobe Standard's look table desaturated to
|
||||
@@ -296,25 +296,25 @@ that rendering, chosen by a new parameter on `view_transform`:
|
||||
| `curve` | What it is | Default for |
|
||||
|---|---|---|
|
||||
| Sigmoid | D19's log-logistic curve | every raw, for now |
|
||||
| Camera Raw | the profile's curve, else ACR3, via RGBTone in ProPhoto | — (D21: the default is open) |
|
||||
| DNG reference | the profile's curve, else ACR3, via RGBTone in ProPhoto | — (D21: the default is open) |
|
||||
|
||||
*Amended 2026-10-03:* Camera Raw was the default in the first draft. The measurement it rested on
|
||||
*Amended 2026-10-03:* the DNG reference was the default in the first draft. The measurement it rested on
|
||||
compared against Lightroom renders of *edited* photographs; see D21. The default is decided by
|
||||
measuring against Lightroom exports of unedited ones.
|
||||
|
||||
A JPEG is still not rendered again (FR-DEV-3j). Film simulation still replaces the view transform
|
||||
when a stock is chosen.
|
||||
|
||||
**The two sliders keep meaning something** under Camera Raw:
|
||||
**The two sliders keep meaning something** under the DNG reference curve:
|
||||
|
||||
- `white` (stops above grey at which the scene reaches display white) sets the input scale:
|
||||
`2^(4 − white)`. At its default of 4 the scale is 1 — sensor white is display white, as in
|
||||
Camera Raw.
|
||||
the SDK's reference.
|
||||
- `contrast` bends the input about middle grey before the curve, as a power of
|
||||
`contrast / 1.4`: 1 at its default, so the curve is Camera Raw's untouched.
|
||||
`contrast / 1.4`: 1 at its default, so the curve is the reference's untouched.
|
||||
|
||||
**What the ACR curve gives up** is D19's shoulder. Values above display white clip, as they do
|
||||
in Camera Raw; highlight recovery is the highlights slider's job before it. Sigmoid stays one
|
||||
in the SDK's reference; highlight recovery is the highlights slider's job before it. Sigmoid stays one
|
||||
click away for a photograph that wants the shoulder.
|
||||
|
||||
**A profile's own curve** is a list of `(x, y)` pairs. It is resampled at decode onto the same
|
||||
@@ -323,7 +323,7 @@ identity is treated as absent, as RawTherapee does.
|
||||
|
||||
**On the GPU** the curve rides in the profile buffer (`@binding(8)`) after the tables: a third
|
||||
header entry gives its length, then the samples. The placeholder bound for a source without a
|
||||
profile carries the ACR3 curve, so a CR2 with no `.dcp` still renders through Camera Raw's tone.
|
||||
profile carries the ACR3 curve, so a CR2 with no `.dcp` renders through the reference tone when that curve is chosen.
|
||||
|
||||
## 13. Profiles sync
|
||||
|
||||
@@ -355,8 +355,8 @@ its parent, as it excludes the trash.
|
||||
- RGBTone: grey goes through the curve unchanged in hue; a colour keeps its hue (the middle
|
||||
channel's fraction between the outer two is unchanged); a curve that is the identity changes
|
||||
nothing; the shader agrees with the CPU reference on a device.
|
||||
- Camera Raw is the default curve for a raw; Sigmoid at the defaults renders to the bit what 0.20.0
|
||||
rendered without baseline exposure.
|
||||
- Sigmoid is the default curve; at its defaults it renders to the bit what 0.20.0 rendered,
|
||||
apart from baseline exposure.
|
||||
- A DNG with `BaselineExposure` +0.25 renders a flat grey 0.25 EV brighter than the same pixels
|
||||
with none; a `.dcp` copied from it carries `BaselineExposureOffset` 0.25 and gives a CR2 the same
|
||||
total.
|
||||
@@ -365,3 +365,24 @@ its parent, as it excludes the trash.
|
||||
parsed and matched on the next decode; a file of the same name and size is left alone.
|
||||
- Measured again on `_MG_9080`: mean saturation at defaults closer to Lightroom's 0.49 than 0.20.0's
|
||||
0.35.
|
||||
|
||||
## 15. The photographer's earlier edit
|
||||
|
||||
What §1 and D21 first took for a difference in rendering is an edit. Every DNG in the library
|
||||
carries, in its embedded XMP, the develop settings it was given before it came to DarkRoom — a
|
||||
consistent house style: per-colour saturation (blue +58, aqua +50, yellow and purple +23, orange
|
||||
+13, green +10), highlights −40, blacks −20, with a second variant (vibrance −10, blue +31). Those
|
||||
settings, not the profile and not the tone curve, are why the same photographs looked richer
|
||||
before.
|
||||
|
||||
- **Translated on open** (`dr_preset_xmp::read_embedded`), the HSL bands onto the colour mixer —
|
||||
aqua to cyan and purple to violet, the nearest of its twelve by hue — and the rest as the preset
|
||||
importer already did.
|
||||
- **Applied only to a photograph DarkRoom has no edit of**, and only on positive evidence: no
|
||||
sidecar beside a local file, or a server that answered "no such file" with nothing cached
|
||||
(`FetchedSidecar::absent`). An edit that failed to arrive is not an absent one, and this would
|
||||
otherwise be saved over it.
|
||||
- **One undoable step, "Earlier Edit"**, then an ordinary edit, saved with the photograph. Export
|
||||
applies it the same way, so a photograph never opened exports as opening it would show.
|
||||
- **The translation is one for one for now.** Measurement against the earlier exports (the
|
||||
`lr-fit` work) may scale individual bands.
|
||||
|
||||
Reference in New Issue
Block a user