Visual proofs — vocabulary-entry before/after gallery¶
Side-by-side renders of the synthetic ColorChecker chart and the synthetic grayscale ramp, before and after each vocabulary entry. For human visual validation: does each primitive visibly do what its description claims?
Renders use an empty-history baseline +
--apply-custom-presets falseso the chart passes through the darktable pipeline cleanly (input profile → output profile only, no scene-referred tone mapping). Each primitive is then applied in isolation — the only difference between baseline and per-entry renders is that primitive's effect. This lets you eyeball each primitive against the reference chart and verify it does what its description claims.Production raw renders use the full
_baseline_v1.xmpwith sigmoid + colorbalancergb defaults — that path is correct for raws. The empty-baseline trick is specifically for chart-input isolation testing; it would not be appropriate for editing real photographs.Masked columns: every non-mask-bound primitive renders additionally through a centered ellipse mask (
radius=0.2,border=0.05) so you can see the spatial shaping in action. The mask covers the middle 16% of the frame; anything outside it should remain at baseline. This visually demonstrates that any primitive can be applied through a mask — seemask-applicable-controls.mdfor the per-module compatibility matrix.Auto-generated. Regenerate via
uv run python scripts/generate-visual-proofs.pyafter vocabulary changes. Commit the regenerated images alongside any vocabulary commit so the gallery and the manifest stay in sync.Render size: 400x400, JPEG quality default. Inputs: synthetic targets from
tests/fixtures/reference-targets/.🚫 Real-raw fixture missing (#103). A small set of entries (currently HSL via
colorequal) need a real raw for visual proof — the synthetic chart pipeline produces degenerate output. Those entries currently show a documented placeholder row; drop a fixture file at the path defined byREAL_RAW_FIXTUREin this script (seetests/fixtures/raws/README.md) to enable real-raw rendering.
Baseline reference¶
These are the reference targets rendered through the baseline XMP with no primitive applied — the before state every row below compares against.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
starter pack (2 entries)¶
wb_warm_subtle¶
Warm white balance, subtle.
| ColorChecker (global) | Grayscale (global) |
|---|---|
![]() |
![]() |
🚫 Masked variant suppressed: see mask-applicable-controls for why drawn-mask binding doesn't render usefully for this module.
look_neutral¶
Neutral L2 look — exposure + warm-subtle WB baseline.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
expressive-baseline pack (112 entries)¶
grain_strength¶
Parameterized grain strength (RFC-021). Pass --value V; range [0.0, 100.0]. 8 = grain_fine-equivalent, 25 = grain_medium-equivalent, 50 = grain_heavy-equivalent. Replaces the v1.5.x discrete grain_fine / grain_medium / grain_heavy entries with a single continuous-magnitude primitive.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): grain texture is hard to see on flat chart patches — see the clipped-gradient row below for visible texture, or mask-applicable-controls)
(near-baseline diff in grayscale (global): grain texture is hard to see on flat chart patches — see the clipped-gradient row below for visible texture, or mask-applicable-controls)
(near-baseline diff in ColorChecker (masked): grain texture is hard to see on flat chart patches — see the clipped-gradient row below for visible texture, or mask-applicable-controls)
(near-baseline diff in grayscale (masked): grain texture is hard to see on flat chart patches — see the clipped-gradient row below for visible texture, or mask-applicable-controls)
On the clipped-gradient fixture (continuous tone + blown highlights — chart designed to show this module's effect; see reference-targets/README.md):
| Clipped gradient (global) | Clipped gradient (centered ellipse mask) |
|---|---|
![]() |
![]() |
Parameter sweep (grain_strength): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+8.00 |
+25.00 |
+50.00 |
+100.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
vignette¶
Parameterized vignette (RFC-021). Pass --value V (CLI) or value: V (MCP); range [-1.0, +1.0] (negative darkens corners; positive lifts). Replaces the v1.5.x discrete vignette_subtle / vignette_medium / vignette_heavy entries with a single continuous-magnitude primitive.
| ColorChecker (global) | Grayscale (global) |
|---|---|
![]() |
![]() |
🚫 Masked variant suppressed: see mask-applicable-controls for why drawn-mask binding doesn't render usefully for this module.
(near-baseline diff in ColorChecker (global): subtle vignette is small at the modest gallery render size; effect is concentrated at the very corners of the frame)
(near-baseline diff in grayscale (global): subtle vignette is small at the modest gallery render size; effect is concentrated at the very corners of the frame)
Parameter sweep (brightness): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.80 |
-0.50 |
-0.25 |
0.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
highlights_clip_threshold¶
Parameterized highlight-recovery clip threshold (RFC-021). Pass --value V; range [0.0, 2.0]: lower = more aggressive recovery (0.95 = subtle, 0.85 = strong, 0.5 = aggressive). Default 1.0 (darktable default; recovers only above 1.0). Replaces the v1.5.x discrete highlights_recovery_subtle / highlights_recovery_strong entries.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): this chart has no blown highlights to recover — see the clipped-gradient row below for the visible effect, or mask-applicable-controls)
(near-baseline diff in grayscale (global): this chart has no blown highlights to recover — see the clipped-gradient row below for the visible effect, or mask-applicable-controls)
(near-baseline diff in ColorChecker (masked): this chart has no blown highlights to recover — see the clipped-gradient row below for the visible effect, or mask-applicable-controls)
(near-baseline diff in grayscale (masked): this chart has no blown highlights to recover — see the clipped-gradient row below for the visible effect, or mask-applicable-controls)
On the clipped-gradient fixture (continuous tone + blown highlights — chart designed to show this module's effect; see reference-targets/README.md):
| Clipped gradient (global) | Clipped gradient (centered ellipse mask) |
|---|---|
![]() |
![]() |
Parameter sweep (clip_threshold): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.50 |
+0.85 |
+0.95 |
+1.00 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
sigmoid_contrast¶
Parameterized sigmoid tone-curve contrast (RFC-021). Pass --value V (CLI) or value: V (MCP); range [0.5, 5.0] (1.0 = mild s-curve, 1.5 = darktable default / no curve change, 2.5 = aggressive s-curve). Replaces the v1.5.x discrete contrast_low / contrast_high entries with a single continuous-magnitude primitive.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (contrast): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.50 |
+1.00 |
+1.50 |
+2.00 |
+2.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
blacks_lifted¶
Lift target black to 0.5.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
blacks_crushed¶
Crush blacks: target 0.001 + skew -0.3.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
whites_open¶
Open whites: target 300 (3x default).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
bw_sky_drama¶
B&W with sky-drama mix (red-emphasis: R 0.5 / G 0.4 / B 0.1). Lightens reds and darkens blues — classic 'red filter' landscape look that emphasizes clouds against sky. normalize_grey=true.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
bw_foliage¶
B&W with foliage mix (green-emphasis: R 0.1 / G 0.7 / B 0.2). Lightens greens — separates foliage from neighboring tones; useful for forest / botanical work where green is the dominant subject. normalize_grey=true.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
toneequalizer¶
Parameterized 9-band tone equalizer (RFC-022 Tier 2; most complex multi-parameter ship). Pass --param NODE=V for any of: noise, ultra_deep_blacks, deep_blacks, blacks, shadows, midtones, highlights, whites, speculars. Each in [-2.0, +2.0] EV; default 0.0. Algorithm fields preserved at darktable defaults.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
Parameter sweep (noise): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.50 |
-0.50 |
0.00 |
+0.50 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (ultra_deep_blacks): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.50 |
-0.50 |
0.00 |
+0.50 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (deep_blacks): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.50 |
-0.50 |
0.00 |
+0.50 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (blacks): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.50 |
-0.50 |
0.00 |
+0.50 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (shadows): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.50 |
-0.50 |
0.00 |
+0.50 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (midtones): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.50 |
-0.50 |
0.00 |
+0.50 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (highlights): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.50 |
-0.50 |
0.00 |
+0.50 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (whites): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.50 |
-0.50 |
0.00 |
+0.50 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (speculars): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.50 |
-0.50 |
0.00 |
+0.50 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
sharpen¶
Parameterized sharpening (RFC-022 Tier 2). Pass --value V; range [0.0, 2.0] (0.0 = no sharpen, 0.5 = subtle, 1.0 = strong, 2.0 = aggressive). Radius preserved at darktable default 2.0 px, threshold at 0.5.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (amount): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+0.50 |
+1.00 |
+1.50 |
+2.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
crop¶
Parameterized crop (RFC-022 Tier 2). Pass --param cx=V cy=V cw=V ch=V — each in [0.0, 1.0]. Default 0,0,1,1 (no crop). cx/cy = top-left margin, cw/ch = bottom-right margin (so crop region is [cx..cw] x [cy..ch] in normalized coords). First workflow-primitive parameterized entry; aspect-ratio constraint preserved at -1/-1 (free).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (cx): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+0.10 |
+0.20 |
+0.30 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (cy): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+0.10 |
+0.20 |
+0.30 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (cw): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.70 |
+0.80 |
+0.90 |
+1.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (ch): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.70 |
+0.80 |
+0.90 |
+1.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
bilat_clarity_strength¶
Parameterized clarity strength on bilat / local laplacian (RFC-021). Pass --value V; range [-1.0, 4.0]. 1.5 = clarity_strong-equivalent. clarity_painterly stays as a separate discrete entry — different kind, not strength.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (clarity_strength): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.50 |
+1.50 |
+2.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
clarity_painterly¶
Soft painterly local contrast (detail 0.4).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
clarity_etched¶
L3 discrete kind — etched / over-defined clarity (#110). bilat_clarity_strength=2.0 (high local-contrast bite).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
clarity_dreamy¶
L3 discrete kind — soft / dreamy clarity (#110). bilat_clarity_strength=-0.5 (negative bite — softens local contrast).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
sharpen_edge_only¶
L3 discrete kind — edge-only sharpening (#110). amount=0.6 with default radius (2.0 px) and threshold (0.5). Threshold gates sharpening to detected edges only.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
sharpen_overall¶
L3 discrete kind — whole-image sharpening with bite (#110). amount=1.2 (strong).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
vignette_subtle¶
L3 discrete kind — gentle peripheral darkening (#110). brightness=-0.15.
| ColorChecker (global) | Grayscale (global) |
|---|---|
![]() |
![]() |
🚫 Masked variant suppressed: see mask-applicable-controls for why drawn-mask binding doesn't render usefully for this module.
(near-baseline diff in ColorChecker (global): subtle vignette is small at the modest gallery render size; effect is concentrated at the very corners of the frame)
(near-baseline diff in grayscale (global): subtle vignette is small at the modest gallery render size; effect is concentrated at the very corners of the frame)
vignette_strong¶
L3 discrete kind — pronounced peripheral darkening (#110). brightness=-0.5.
| ColorChecker (global) | Grayscale (global) |
|---|---|
![]() |
![]() |
🚫 Masked variant suppressed: see mask-applicable-controls for why drawn-mask binding doesn't render usefully for this module.
exposure¶
Parameterized exposure compensation (RFC-021). Pass --value V (CLI) or value: V (MCP) in EV stops; range [-3.0, +3.0]. Replaces the v1.5.x discrete expo+0.3 / expo_+0.5 / expo_-0.3 / expo_-0.5 / shadows_global_± entries with a single continuous-magnitude primitive._
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (ev): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.00 |
-0.50 |
0.00 |
+0.50 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
transform¶
Parameterized perspective / transform (#101). Closes the Lightroom Transform panel parity gap via darktable's ashift module. 5 magnitude axes: --param transform_rotation=V (image rotation in degrees), --param transform_lensshift_v=V (vertical perspective / keystone), --param transform_lensshift_h=V (horizontal perspective), --param transform_shear=V, --param transform_aspect=V (post-transform aspect adjust; default 1.0). Axis names use transform prefix. Lens-tuning floats (focal length, crop factor, ortho-correction) and the user-drawn-lines storage are preserved verbatim — those are darktable-GUI-authored when needed._
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (transform_rotation): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-15.00 |
-5.00 |
0.00 |
+5.00 |
+15.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (transform_lensshift_v): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
-0.20 |
0.00 |
+0.20 |
+0.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (transform_lensshift_h): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
-0.20 |
0.00 |
+0.20 |
+0.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (transform_shear): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.30 |
0.00 |
+0.30 |
|---|---|---|
![]() |
![]() |
![]() |
Parameter sweep (transform_aspect): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.70 |
+0.90 |
+1.00 |
+1.20 |
+1.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
lens_correction¶
Parameterized lens correction (#95). 10 manual-override magnitude axes via darktable's lens module: --param lens_scale=V (output scaling), --param lens_tca_r=V / lens_tca_b=V (manual TCA shifts; 1.0 = no shift), --param lens_cor_distortion=V / lens_cor_vignette=V / lens_cor_ca_r=V / lens_cor_ca_b=V (per-correction-type strengths for embedded-metadata method), --param lens_v_strength=V / lens_v_radius=V / lens_v_steepness=V (manual vignette correction). NOTE: this entry's photographic effect requires lensfun identifier strings (camera/lens) and shooting metadata (focal/aperture/distance) to be populated. EXIF auto-binding for these is a follow-up; until then, the entry is most useful for overriding strength sliders on a darktable-GUI-authored baseline.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (lens_scale): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+1.00 |
+1.50 |
+2.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (lens_tca_r): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.98 |
+0.99 |
+1.00 |
+1.01 |
+1.02 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (lens_tca_b): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.98 |
+0.99 |
+1.00 |
+1.01 |
+1.02 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (lens_cor_distortion): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (lens_cor_vignette): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (lens_cor_ca_r): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.00 |
0.00 |
+1.00 |
|---|---|---|
![]() |
![]() |
![]() |
Parameter sweep (lens_cor_ca_b): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.00 |
0.00 |
+1.00 |
|---|---|---|
![]() |
![]() |
![]() |
Parameter sweep (lens_v_strength): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.50 |
+1.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (lens_v_radius): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.50 |
+1.00 |
+2.00 |
|---|---|---|
![]() |
![]() |
![]() |
Parameter sweep (lens_v_steepness): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.50 |
+1.00 |
+2.50 |
+5.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
denoise¶
Parameterized denoising via darktable's denoiseprofile module (#96). NLMEANS (non-local-means) mode with 4 magnitude axes: --param denoise_strength=V (primary noise slider; range [0.001, 1000.0]), --param denoise_shadows=V (preserve shadow noise vs detail; range [0.0, 1.8]), --param denoise_radius=V (patch size; range [0.0, 12.0]), --param denoise_scattering=V (search-zone spread; range [0.0, 20.0]). Axis names carry the denoise prefix to disambiguate from same-named axes on other modules (e.g. dehaze.strength). Per-channel noise calibration a[3]/b[3] auto-populated by darktable from camera+ISO database. WAVELETS mode would need an empirically-captured wavelet-curve baseline (tracked under #100 / task C); for now NLMEANS ships clean and lines up with Lightroom's patch-similarity Noise Reduction._
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (denoise_strength): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.50 |
+1.00 |
+2.00 |
+5.00 |
+20.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (denoise_shadows): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+0.50 |
+1.00 |
+1.40 |
+1.80 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (denoise_radius): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+1.00 |
+3.00 |
+6.00 |
+10.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (denoise_scattering): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+1.00 |
+5.00 |
+10.00 |
+20.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
filmic¶
Parameterized filmic v6 tone mapping (#97). Modern darktable tone-mapping; ships parallel to sigmoid (~80% of tone-mapping use cases). 8 magnitude axes: grey_point_source (default 18.45%), black_point_source (default -8.0 EV), white_point_source (default 4.0 EV), output_power (default 4.0 gamma), latitude (default 0.01), contrast (default 1.0), saturation (default 0.0), balance (default 0.0). Curve mode enums (shadows/highlights/preserve_color/version/spline_version) are pinned at darktable defaults; author discrete entries for non-default modes.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (grey_point_source): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+10.00 |
+18.45 |
+25.00 |
+35.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (black_point_source): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-12.00 |
-10.00 |
-8.00 |
-5.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (white_point_source): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+2.00 |
+4.00 |
+6.00 |
+8.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (output_power): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+1.00 |
+2.00 |
+4.00 |
+6.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (latitude): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+10.00 |
+25.00 |
+50.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (contrast): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.50 |
+1.00 |
+1.50 |
+2.00 |
+2.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (saturation): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-50.00 |
0.00 |
+25.00 |
+50.00 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (balance): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-25.00 |
-10.00 |
0.00 |
+10.00 |
+25.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
texture¶
Parameterized texture (#92 Bucket A.6). Lightroom-style Texture via darktable's diffuse-or-sharpen module. Three axes: --param first=V (finest detail scale, primary Texture axis; range [-1.0, 1.0]), --param second=V (next-up scale; range [-1.0, 1.0]), --param sharpness=V (global sharpening; range [-1.0, 1.0]). Negative values smooth, positive enhance. All default 0.0. Closes the Lightroom Texture parity gap.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (first): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
-0.20 |
0.00 |
+0.30 |
+0.70 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (second): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.30 |
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (sharpness): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
hsl_saturation¶
Parameterized HSL Saturation row (RFC-023). Lightroom HSL Color Mixer Saturation parity via darktable's colorequal module. 8 per-color axes (sat_red, sat_orange, sat_yellow, sat_green, sat_cyan, sat_blue, sat_lavender, sat_magenta); each range [-1.0, 1.0]; default 0.0. Negative desaturates that color zone (e.g. sat_orange=-0.3 → mute skin tones); positive boosts. Compose with hsl_hue and hsl_luminance for the full HSL Color Mixer.
🚫 Visual-proof rendering skipped. This entry's photographic effect requires real-raw input — its underlying darktable module produces degenerate output on the synthetic ColorChecker / grayscale fixtures (verified experimentally by varying the module's global tuning; chart pipeline doesn't recover). The byte-level apply path is verified by the 5-layer test coverage (per ADR-080). Visual proof on real raws is a v1.9.0+ work item — see
_SKIP_VISUAL_PROOF_ENTRIESin the gallery script for the list and reasoning. To enable real-raw rendering, drop a fixture file at the path defined byREAL_RAW_FIXTURE(seetests/fixtures/raws/README.md).
hsl_hue¶
Parameterized HSL Hue row (RFC-023). Lightroom HSL Color Mixer Hue parity via colorequal. 8 per-color hue-shift axes (hue_red, hue_orange, hue_yellow, hue_green, hue_cyan, hue_blue, hue_lavender, hue_magenta); each range [-180.0, 180.0] degrees; default 0.0. Shifts that color zone toward an adjacent hue (e.g. hue_green=15.0 → foliage warmer toward yellow).
🚫 Visual-proof rendering skipped. This entry's photographic effect requires real-raw input — its underlying darktable module produces degenerate output on the synthetic ColorChecker / grayscale fixtures (verified experimentally by varying the module's global tuning; chart pipeline doesn't recover). The byte-level apply path is verified by the 5-layer test coverage (per ADR-080). Visual proof on real raws is a v1.9.0+ work item — see
_SKIP_VISUAL_PROOF_ENTRIESin the gallery script for the list and reasoning. To enable real-raw rendering, drop a fixture file at the path defined byREAL_RAW_FIXTURE(seetests/fixtures/raws/README.md).
hsl_luminance¶
Parameterized HSL Luminance row (RFC-023). Lightroom HSL Color Mixer Luminance parity via colorequal. 8 per-color brightness axes (bright_red, bright_orange, bright_yellow, bright_green, bright_cyan, bright_blue, bright_lavender, bright_magenta); each range [-1.0, 1.0]; default 0.0. Negative darkens that color zone (e.g. bright_blue=-0.3 → deeper sky); positive lightens.
🚫 Visual-proof rendering skipped. This entry's photographic effect requires real-raw input — its underlying darktable module produces degenerate output on the synthetic ColorChecker / grayscale fixtures (verified experimentally by varying the module's global tuning; chart pipeline doesn't recover). The byte-level apply path is verified by the 5-layer test coverage (per ADR-080). Visual proof on real raws is a v1.9.0+ work item — see
_SKIP_VISUAL_PROOF_ENTRIESin the gallery script for the list and reasoning. To enable real-raw rendering, drop a fixture file at the path defined byREAL_RAW_FIXTURE(seetests/fixtures/raws/README.md).
dehaze¶
Parameterized dehaze (#90 Bucket A.2). Lightroom-style Dehaze via darktable's hazeremoval module. Two axes: --param strength=V (range [-1.0, 1.0]; positive removes haze, negative adds atmospheric fog) and --param distance=V (range [0.0, 1.0]; depth-falloff). Closes the Lightroom Dehaze parity gap.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (strength): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.40 |
0.00 |
+0.20 |
+0.60 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (distance): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+0.20 |
+0.50 |
+0.80 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
wb_kelvin_delta¶
WB Kelvin / tint UX wrapper (#102). Same temperature module as the temperature entry, but exposes photographic units instead of raw RGB coefficients. 2 axes: --param kelvin_delta=V (range [-3000, 3000]; positive = warmer) and --param tint_delta=V (range [-200, 200]; positive = magenta-shifted). Linear approximation: red_coeff = 1 + kelvin_delta * 0.0001, blue_coeff inverse, green_coeff = 1 + tint_delta * 0.0001. Daily-use accurate; not chromatic-adaptation-perfect. The temperature entry is preserved for users who want raw coefficient control. Note: kelvin_delta affects bytes 0 (red) AND 8 (blue); the manifest's field offset 0 is the primary-effect documentation; the decoder applies the inverse to blue automatically.
| ColorChecker (global) | Grayscale (global) |
|---|---|
![]() |
![]() |
🚫 Masked variant suppressed: see mask-applicable-controls for why drawn-mask binding doesn't render usefully for this module.
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
Parameter sweep (kelvin_delta): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-3000.00 |
-1500.00 |
0.00 |
+1500.00 |
+3000.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (tint_delta): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-200.00 |
-100.00 |
0.00 |
+100.00 |
+200.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
temperature¶
Parameterized white balance (RFC-021; first multi-parameter ship). Three axes: --param red_coeff=V (warmer image: red↑), --param green_coeff=V (Lightroom Tint axis: green↑ → magenta-shifted, green↓ → green-shifted), --param blue_coeff=V (cooler image: blue↑). Range [0.5, 4.0] each; all default 1.0 (no shift). Replaces the v1.5.x discrete wb_cool_subtle entry. green_coeff added in #90 Bucket A.3 to close the Lightroom Tint parity gap. Starter's wb_warm_subtle remains as a discrete teaching artifact; production use of WB shifts should prefer this parameterized entry.
| ColorChecker (global) | Grayscale (global) |
|---|---|
![]() |
![]() |
🚫 Masked variant suppressed: see mask-applicable-controls for why drawn-mask binding doesn't render usefully for this module.
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
Parameter sweep (red_coeff): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.50 |
+1.00 |
+1.50 |
+2.15 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Parameter sweep (green_coeff): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.85 |
+0.95 |
+1.00 |
+1.15 |
+1.30 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Parameter sweep (blue_coeff): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
+0.50 |
+1.00 |
+1.50 |
+2.14 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
saturation_global¶
Parameterized global saturation in colorbalancergb (RFC-021). Pass --value V (CLI) or value: V (MCP); range [-1.0, +1.0] (-1.0 = fully desaturated / monochrome; +0.5 = strong boost). Replaces the v1.5.x discrete sat_kill / sat_boost_moderate / sat_boost_strong entries with a single continuous-magnitude primitive.
| ColorChecker (global) | ColorChecker (centered ellipse mask) |
|---|---|
![]() |
![]() |
Grayscale column omitted: this primitive moves chroma only; gray patches have no chroma to affect.
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
Parameter sweep (saturation_global): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.00 |
-0.50 |
0.00 |
+0.25 |
+0.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
vibrance¶
Parameterized vibrance on colorbalancergb (RFC-022 Tier 2). Pass --value V; range [-1.0, +1.0]. 0.3 = vibrance+0.3-equivalent. Vibrance protects already-saturated pixels — gentler chroma push than saturation_global. Replaces v1.5.x vibrance_+0.3._
| ColorChecker (global) | ColorChecker (centered ellipse mask) |
|---|---|
![]() |
![]() |
Grayscale column omitted: this primitive moves chroma only; gray patches have no chroma to affect.
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
Parameter sweep (vibrance): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
chroma_global¶
Parameterized global chroma on colorbalancergb (RFC-022 Tier 2). Pass --value V; range [-1.0, +1.0]. Less saturated-pixel protection than vibrance, more aggressive than saturation_global at equal magnitudes.
| ColorChecker (global) | ColorChecker (centered ellipse mask) |
|---|---|
![]() |
![]() |
Grayscale column omitted: this primitive moves chroma only; gray patches have no chroma to affect.
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
Parameter sweep (chroma_global): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
hue_angle¶
Parameterized global hue rotation on colorbalancergb (RFC-022 Tier 2). Pass --value V in degrees; range [-180.0, +180.0]. Rotates every pixel's hue around the color wheel without changing saturation or luminance.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (hue_angle): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-90.00 |
-30.00 |
0.00 |
+30.00 |
+90.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
brilliance_global¶
Parameterized global brilliance on colorbalancergb (RFC-022 Tier 2 / #86). Pass --value V; range [-1.0, +1.0]. Brilliance shapes per-zone luminance — the global axis moves all zones together. Per-zone variants (highlights/midtones/shadows) target specific tonal ranges.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (brilliance_global): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
brilliance_highlights¶
Parameterized highlight-zone brilliance on colorbalancergb (RFC-022 Tier 2 / #86). Pass --value V; range [-1.0, +1.0]. Targets only the highlight tonal zone — useful for selectively brightening or compressing high-key areas without affecting shadows / midtones.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
Parameter sweep (brilliance_highlights): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
brilliance_midtones¶
Parameterized midtone-zone brilliance on colorbalancergb (RFC-022 Tier 2 / #86). Pass --value V; range [-1.0, +1.0]. Targets only the midtone tonal zone — selectively shapes the body of the tonal distribution.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
Parameter sweep (brilliance_midtones): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
brilliance_shadows¶
Parameterized shadow-zone brilliance on colorbalancergb (RFC-022 Tier 2 / #86). Pass --value V; range [-1.0, +1.0]. Targets only the shadow tonal zone — selectively lifts or deepens dark areas without affecting highlights / midtones.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
Parameter sweep (brilliance_shadows): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.60 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
hue_shadows¶
Parameterized per-zone hue rotation for shadows (#91 Bucket A.5; Lightroom Color Grading shadows wheel). Pass --value V; range [0.0, 360.0] degrees. Default 0.0.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (hue_shadows): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+90.00 |
+180.00 |
+270.00 |
+350.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
hue_midtones¶
Parameterized per-zone hue rotation for midtones (#91 Bucket A.5; Lightroom Color Grading midtones wheel). Pass --value V; range [0.0, 360.0] degrees. Default 0.0.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (hue_midtones): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+90.00 |
+180.00 |
+270.00 |
+350.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
hue_highlights¶
Parameterized per-zone hue rotation for highlights (#91 Bucket A.5; Lightroom Color Grading highlights wheel). Pass --value V; range [0.0, 360.0] degrees. Default 0.0.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (hue_highlights): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+90.00 |
+180.00 |
+270.00 |
+350.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
saturation_shadows¶
Parameterized per-zone saturation for shadows (#91 Bucket A.5; pairs with hue_shadows for full Lightroom shadow-zone color-grading control). Pass --value V; range [-1.0, +1.0].
| ColorChecker (global) | ColorChecker (centered ellipse mask) |
|---|---|
![]() |
![]() |
Grayscale column omitted: this primitive moves chroma only; gray patches have no chroma to affect.
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
Parameter sweep (saturation_shadows): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.50 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
saturation_midtones¶
Parameterized per-zone saturation for midtones (#91 Bucket A.5). Pass --value V; range [-1.0, +1.0].
| ColorChecker (global) | ColorChecker (centered ellipse mask) |
|---|---|
![]() |
![]() |
Grayscale column omitted: this primitive moves chroma only; gray patches have no chroma to affect.
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
Parameter sweep (saturation_midtones): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.50 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
saturation_highlights¶
Parameterized per-zone saturation for highlights (#91 Bucket A.5). Pass --value V; range [-1.0, +1.0].
| ColorChecker (global) | ColorChecker (centered ellipse mask) |
|---|---|
![]() |
![]() |
Grayscale column omitted: this primitive moves chroma only; gray patches have no chroma to affect.
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in ColorChecker (masked): below visible threshold on this chart input)
Parameter sweep (saturation_highlights): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.30 |
+0.50 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
shadows_weight¶
Parameterized shadow-zone falloff weight (#91 Bucket A.5; Lightroom Color Grading 'Blending' bottom). Pass --value V; range [0.0, 4.0]; default 1.0. Higher = more aggressive zone overlap.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
Parameter sweep (shadows_weight): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+0.50 |
+1.00 |
+2.00 |
+4.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
highlights_weight¶
Parameterized highlights-zone falloff weight (#91 Bucket A.5; Lightroom Color Grading 'Blending' top). Pass --value V; range [0.0, 4.0]; default 1.0.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (highlights_weight): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
0.00 |
+0.50 |
+1.00 |
+2.00 |
+4.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
white_fulcrum¶
Parameterized shadow/highlight balance point (#91 Bucket A.5; Lightroom Color Grading 'Balance' slider). Pass --value V; range [-2.0, 2.0]; default 0.0 (neutral midpoint). Negative shifts the split toward shadows; positive toward highlights.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (white_fulcrum): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-1.00 |
-0.50 |
0.00 |
+0.50 |
+1.00 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
grade_shadows_warm¶
Warm shadows (orange tint, hue 30 deg, chroma 0.3).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
grade_shadows_cool¶
Cool shadows (blue tint, hue 210 deg, chroma 0.3).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
grade_highlights_warm¶
Warm highlights (orange tint, hue 45 deg, chroma 0.2).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
grade_highlights_cool¶
Cool highlights (blue tint, hue 200 deg, chroma 0.2).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
grade_midtones_warm¶
Warm midtones (orange tint, hue 35 deg, chroma 0.25).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
grade_midtones_cool¶
Cool midtones (blue tint, hue 215 deg, chroma 0.25).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
grade_split_warm_cool¶
L3 discrete kind — classic split-toning composite (#110). Combines grade_shadows_cool (blue tint, hue 210 deg / chroma 0.3) with grade_highlights_warm (orange tint, hue 45 deg / chroma 0.2) in one entry. The signature 'cinematic' split-tone in a single primitive.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
chroma_boost_shadows¶
Boost shadow chroma +0.3.
| ColorChecker (global) | ColorChecker (centered ellipse mask) |
|---|---|
![]() |
![]() |
Grayscale column omitted: this primitive moves chroma only; gray patches have no chroma to affect.
chroma_boost_midtones¶
Boost mid-tone chroma +0.3.
| ColorChecker (global) | ColorChecker (centered ellipse mask) |
|---|---|
![]() |
![]() |
Grayscale column omitted: this primitive moves chroma only; gray patches have no chroma to affect.
chroma_boost_highlights¶
Boost highlight chroma +0.3.
| ColorChecker (global) | ColorChecker (centered ellipse mask) |
|---|---|
![]() |
![]() |
Grayscale column omitted: this primitive moves chroma only; gray patches have no chroma to affect.
gradient_top_dampen_highlights 🟦 mask-bound¶
Dampen top-half highlights via -0.5 EV through a top-bright gradient.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
gradient_bottom_lift_shadows 🟦 mask-bound¶
Lift bottom-half shadows via +0.4 EV through a bottom-bright gradient.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
radial_subject_lift 🟦 mask-bound¶
Lift +0.6 EV in a centered radial mask region (subject emphasis).
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
rectangle_subject_band_dim 🟦 mask-bound¶
Dim -0.3 EV in a horizontal mid-band rectangle (de-emphasize a horizon line).
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
look_portrait¶
L2 look — gentle skin-protective composition. exposure +0.2 EV, sigmoid_contrast 1.2 (soft s-curve), colorbalancergb saturation_global=-0.1 + vibrance=+0.2 (mild chroma push that protects saturated pixels). Targets portraiture; avoid stacking with aggressive contrast or clarity.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_landscape¶
L2 look — vibrant dramatic landscape composition. sigmoid_contrast 2.0 (strong s-curve), colorbalancergb saturation_global=+0.3 + vibrance=+0.2, bilat_clarity_strength 1.0 (definite local-contrast pop). Aggressive — pull back via sigmoid to ~1.5 if it feels harsh.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_vintage_film¶
L2 look — nostalgia / faded film aesthetic. sigmoid_contrast 1.2 (gentle s-curve), colorbalancergb saturation_global=-0.2 (slight desaturation), grain_strength 25 (medium film grain), temperature warm shift (red 2.148 / blue 1.209). Pairs well with grade_shadows_warm.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_cinematic_teal_orange¶
L2 look — Hollywood blockbuster teal-and-orange grade (#104). sigmoid_contrast 1.4 + colorbalancergb hue_shadows=210 deg / saturation_shadows=+0.3 (teal) + hue_highlights=30 deg / saturation_highlights=+0.2 (orange) + saturation_global=+0.1.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_film_kodachrome¶
L2 look — Kodachrome film simulation (#104). sigmoid_contrast 1.4 + temperature warm (red 2.148 / blue 1.209 = wb_warm_subtle) + saturation_global=+0.2 + grain_strength=8.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_film_portra¶
L2 look — Kodak Portra 400 portrait film (#104). sigmoid_contrast 0.9 (soft s-curve) + temperature subtle warm (red 1.5 / blue 1.3) + saturation_global=-0.1 + grain_strength=15. Compose with hsl_saturation --param sat_orange=+0.05 if you want the canonical Portra skin-warmth boost on real raws.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_high_key_portrait¶
L2 look — high-key portrait (Adler-style fashion / commercial). exposure +0.3 EV + sigmoid_contrast 0.8 (soft s-curve) + colorbalancergb brilliance_highlights=+0.2 + saturation_global=-0.05 (retains skin saturation while reducing global). For magazine / beauty work where bright skin tones drive the look. Compose with skin_uniformity for a complete editorial pass.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_low_key_portrait¶
L2 look — low-key portrait (Tucker / chiaroscuro voice). exposure -0.2 EV + sigmoid_contrast 1.8 (strong s-curve) + colorbalancergb brilliance_shadows=-0.3 + saturation_global=-0.10. For dramatic editorial / character portraits where deep shadows carry the mood. Compose with look_portrait_split_tone_moody for a more cinematic grade.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_moody_dramatic¶
L2 look — moody / dramatic editorial (#104). sigmoid_contrast 2.0 (strong s-curve) + colorbalancergb saturation_global=-0.3 + vibrance=+0.1 + grain_strength=25.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_70s_film¶
L2 look — 1970s film aesthetic (#104). temperature warm (red 2.0 / blue 1.4) + sigmoid_contrast 1.1 (gentle s-curve) + saturation_global=-0.1 + grain_strength=35 (medium grain).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_90s_grain¶
L2 look — 1990s film aesthetic (#104). sigmoid_contrast 1.6 + temperature subtle cool (red 1.2 / blue 2.0) + grain_strength=50 (heavy grain).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_2000s_digital¶
L2 look — early-2000s digital camera aesthetic (#104). sigmoid_contrast 1.3 + temperature subtle cool (red 1.1 / blue 1.6) + saturation_global=+0.4 (oversaturated digital signature).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_subject_lift_dark_only 🟦 mask-bound¶
L2 look — lift only the dark pixels in a centered subject region. Drawn ellipse around the subject + luminance shadows filter. Composes RFC-029 drawn mask + RFC-024 range_filter. The user's mental model: 'in this drawn mask, only affect the dark pixels.'
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
look_sky_blue_deepen 🟦 mask-bound¶
L2 look — deepen sky blues in the upper half. Drawn gradient (top half) + color_h filter on cyan-blue range. Composes RFC-029 + RFC-024. Real-world workflow: dramatic sky without affecting foreground or non-blue elements above the horizon.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
look_horizon_warm_glow 🟦 mask-bound¶
L2 look — lift warm tones near the horizon. Horizontal gradient anchored at midline + color_h filter on warm tones (orange/red). Sunset / golden-hour enhancement without affecting cool tones.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
look_subject_brighten_highlights 🟦 mask-bound¶
L2 look — brighten only the bright pixels in the subject region. Drawn ellipse + luminance highlights filter. Catchlights, skin highlights, sparkle without blowing out midtones.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
look_dark_pixels_global_lift 🟦 mask-bound¶
L2 look — lift dark pixels globally (no spatial mask). Pure parametric range_filter — luminance shadows. Useful when the intent is purely tonal: 'open up all the dark areas in the image, regardless of where they are.' Demonstrates the parametric-only path of RFC-024 / ADR-085.
| ColorChecker | Grayscale ramp |
|---|---|
skin_smooth_painterly 🟦 mask-bound¶
Approximate frequency separation for skin smoothing (Portrait Gap #4, cheap variant). Reduces local contrast (texture-band frequency) within the skin region — the color band stays untouched. Pass --value V or --param clarity_strength=V; range [-1.0, 4.0], typical -0.3 to -0.7 for natural smoothing. -0.5 default. Pre-baked with mask_skin_region. Not Photoshop's true frequency separation (band decomposition); approximation via bilat softening on a hue-masked region. Compose orthogonally with skin_uniformity (color-band uniformity) for the full skin-uniformity-plus-smoothing move. For sharper precision, override mask_spec via render_preview + LLM-vision (see docs/guides/llm-vision-for-masks.md Pattern 7).
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
Parameter sweep (clarity_strength): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.50 |
0.00 |
+0.50 |
+1.50 |
+2.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
skin_uniformity 🟦 mask-bound¶
Skin-tone uniformity (RFC-033). Compresses skin-band saturation variance toward uniform appearance — Capture One's Skin Tone Uniformity equivalent for chemigram. Pre-baked with mask_skin_region so the move is scoped automatically. Pass --value V or --param sat_orange=V; range [-1.0, 0.0]. -0.3 is moderate uniformity; -0.6 is strong (typical Woloszynowicz/Adler/Nordqvist range); -1.0 fully desaturates the skin band; 0.0 is no-op. Override mask_spec for per-image manual mask if mask_skin_region's hue-range fallback leaks (Phase-1 LLM-vision fallback per RFC-032). Frequency-separation texture work composes orthogonally; this primitive is color-band uniformity only.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
look_portrait_natural_skin¶
Restraint-first portrait foundation — Tucker/Marino-aligned. Slight warm temperature (+0.03 red), exposure +0.1 EV, sigmoid contrast 1.2 (gentle s-curve), saturation_global -0.05 + vibrance +0.1 (mild chroma shaping that protects skin tones). The starting point for portrait work that doesn't push contrast or saturation as a stylistic choice.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_portrait_editorial¶
Magazine / fashion editorial grade. Punchier sigmoid contrast (1.6), global saturation pull-back (-0.10) — counterintuitive but the move Adler/Woloszynowicz reach for; reduced overall sat lets the split-tone read. Cool-shadows + warm-highlights split (hue_shadows=210, hue_highlights=45). Compose with skin_uniformity if skin patches fight the grade.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_portrait_skin_warm_lift 🟦 mask-bound¶
Subject-region warm + brighten. Slight warm temperature (+0.04 red) + exposure +0.2 EV. Pre-baked with mask_skin_region so the lift scopes to skin without affecting clothing or background. Pairs with skin_uniformity for a complete portrait skin pass.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
look_portrait_background_dim 🟦 mask-bound¶
Dim and de-saturate the background to push the subject forward. Exposure -0.4 EV + saturation_global -0.15. Pre-baked with mask_subject + invert: true (RFC-034) — the photographer doesn't have to construct an inverse-subject mask manually. The parametric fallback for mask_subject is coarse (midtone luminance + center-bias); for clean subject vs. background separation override the mask_spec at apply time with a manually-drawn inverted ellipse, or escalate via render_preview + LLM-vision construction (llm-vision-for-masks.md Pattern 7) for a path-form subject mask.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
look_portrait_split_tone_moody¶
Cinematic split-tone portrait — cool blue shadows (hue 210, sat 0.30) + warm orange highlights (hue 45, sat 0.20), sigmoid contrast 1.4. Stronger split than look_portrait_editorial; some photographers (Adler) consider this 'fashion-only' rather than a general portrait move. Borderline survey candidate — ships, but exercise judgment.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_landscape_grand_vista¶
Heaton/PureRAW-style grand vista. Sigmoid contrast 1.4, mildly warm shadows (hue 30, sat 0.10), vibrance +0.10, bilat clarity_strength 0.5. The chemigram shape of LR's adaptive sky + foreground lift workflow rendered globally; for sky-specific work compose with look_landscape_sky_enhance instead.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_landscape_intimate_quiet¶
Marino-style intimate / small-scene restraint. Very gentle sigmoid contrast (1.05), saturation pulled back (-0.10), bilat softened (clarity_strength -0.3 — opposite of clarity boost). The defining stylistic choice for forest interiors, abstract details, and any scene where drama would betray the subject. Applies LESS than the baseline does, deliberately.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_landscape_golden_hour¶
Sunset / sunrise mood. Warm temperature shift (+0.07 red), sigmoid contrast 1.3, warm shadows (hue 30, sat 0.20) + amber highlights (hue 50, sat 0.15), vibrance +0.10. Pushes the warmth that golden-hour light almost has and amplifies it without breaking color credibility. For scenes already on the warm side, apply at lower strength via opacity — not authored as parametric (look-not-primitive).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_landscape_blue_hour_cool¶
Twilight / pre-dawn / blue-hour mood. Cool temperature shift (+0.07 blue), sigmoid contrast 1.3, cool shadows (hue 210, sat 0.20) + neutral-cool highlights (hue 200, sat 0.10), saturation_global -0.05. Opposite mood from golden_hour; equally valid genre signature. Composes with sigmoid_contrast for stronger drama if needed.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_landscape_atmospheric_haze¶
Misty / hazy / fog-as-subject mood. Hazeremoval strength 0.5 (lift visibility while preserving the moody atmosphere), bilat clarity 0.3, warm shadows (hue 30, sat 0.10) + vibrance +0.05. The trick: lift JUST enough to read details, not enough to flatten the atmosphere. Strong hazeremoval values (>1.0) produce 'no atmosphere' results that defeat the intent — keep restrained.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_landscape_dramatic_moody¶
Page/Adamus-style dramatic atmospheric. Sigmoid contrast 1.7 (strong), cool shadows (hue 210, sat 0.20) + warm highlights (hue 30, sat 0.15), bilat clarity_strength 0.6. The dramatic counterpart to intimate_quiet — for stormy skies, rugged terrain, and weather drama. Pair with mask_luminosity_brightest_quartile darkening for stormy-cloud emphasis.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_landscape_autumn_pop¶
Autumn foliage / fall color. Slight warm temperature (+0.04 red), colorequal sat_orange +0.30 + sat_red +0.20 (lift autumn colors) + sat_blue -0.10 (compensating to keep skies natural — without this, skies turn cartoonish). Bilat clarity_strength 0.4 for foliage definition. A targeted seasonal grade; not for non-foliage scenes.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_landscape_sky_enhance 🟦 mask-bound¶
Sky-targeted enhancement (Heaton 'adaptive sky' shape). Cool-tone highlights shift (hue 200, sat 0.15) + slight vibrance (+0.05). Pre-baked with mask_sky (RFC-032) so the move scopes to the sky region automatically. Compose, don't replace — this is a focused enhancement to stack on top of any landscape look. For complex skies (sunsets, partial clouds, trees protruding into sky), override mask_spec with a constructed path mask via render_preview + LLM-vision (llm-vision-for-masks.md Pattern 7).
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
look_landscape_water_silk 🟦 mask-bound¶
Water surfaces — silky water in long-exposure work, glassy lakes. Bilat clarity_strength -0.4 (smooths the texture, OPPOSITE of clarity), cool-tone shadows (hue 200, sat 0.10), vibrance +0.05. Pre-baked with mask_water_blue_cyan so the smoothing scopes to water without affecting rocks, foliage, or sky. Reduces clarity selectively to enhance the smoothness photographers spent shutter-time creating.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
bw_convert¶
B&W conversion (RFC-033 follow-up; survey Gap #1). Single colorequal plugin with all 8 sat axes set to -1.0 (full saturation kill = grayscale). Exposes 8 bright_X parameters emulating Adams-school color-filter strength: bright_red +0.3 lightens skin / red flowers / darkens skies in B&W; bright_blue -0.2 darkens skies; bright_green +0.3 lightens foliage; etc. The chemigram analog of Photoshop Channel Mixer (Monochrome) and Silver Efex Color Filters. Universal Step 1 of any B&W workflow per the photographer survey (6/6 photographers reach for color-filter-driven conversion as their foundational B&W move).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
Parameter sweep (bright_blue): rendered at multiple values via the parameterized apply path (--value V / --param NAME=V); other parameterized axes (if any) held at their dtstyle defaults.
-0.60 |
-0.30 |
0.00 |
+0.20 |
+0.50 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
look_bw_classic_neutral¶
Classic B&W foundation — neutral channel weighting (no filter), mid contrast (sigmoid 1.3), mild structure (clarity 0.3). The starting point for any B&W work; compose with split-tone or chiaroscuro variants for stylistic direction. Per RFC-033 / survey Gap #1.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_bw_high_contrast_chiaroscuro¶
Tucker/Thompson-style chiaroscuro B&W — strong sigmoid contrast (1.7), deep shadow brilliance (-0.20), lifted highlight brilliance (+0.10). For street/portrait B&W where dramatic light-shadow interplay defines the image. Compose with mask_subject for directional facial sculpting (Tucker portrait discipline).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_bw_landscape_dramatic¶
Page/Adamus dramatic B&W landscape — red-filter-emulated conversion (bright_red +0.20 lightens land; bright_blue -0.30 darkens skies — the classic Adams-school red filter for storm-cloud drama). Sigmoid contrast 1.6 + clarity 0.5. For stormy skies, rugged terrain, weather drama. The B&W counterpart of look_landscape_dramatic_moody.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_bw_split_tone_warm_shadows¶
Subtle warm-shadows toned B&W — sepia / selenium print evocation. Neutral B&W conversion + mid-strong sigmoid contrast (1.35) + warm-tone shadows (hue 30, sat 0.05) + cool-tone highlights (hue 210, sat 0.03). The split-tone tinting reads as 'toned print' rather than pure neutral B&W.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_bw_silver_efex_zone_balanced¶
Whalley/Boutwell zone-system-aware balanced B&W — the restraint discipline applied to monochrome. Neutral conversion + gentle sigmoid contrast (1.15) + subtle clarity (0.15). The defining stylistic position for B&W work that doesn't push contrast or structure as a dramatic move; reads as 'measured tonal development' (Adams-school).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_wildlife_subject_sharpen 🟦 mask-bound¶
Subject-isolated wildlife sharpening — feather / fur / scale detail lifted ON THE SUBJECT only via mask_subject (RFC-032). Sharpen amount 2.0 + bilat clarity 0.3. The chemigram realization of LR's Subject-mask + Sharpening + selective Texture pattern (Sweileh, Matiash, Dale, Gardner all reach for this). Compose with mask_subject in the manifest; pair with look_wildlife_background_blur for compositional subject emphasis.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
look_wildlife_background_blur 🟦 mask-bound¶
Background softening for wildlife — bilat clarity_strength -0.5 (the softening direction; opposite of clarity boost). Pre-baked with mask_subject + invert: true (RFC-034) so the softening scopes to everything-except-subject. Mimics longer-lens / shallower-DOF rendering at edit time. Pair with look_wildlife_subject_sharpen for complete subject emphasis. Marc/Bushcrafter darktable-discipline made portable.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
look_wildlife_eye_lift 🟦 mask-bound¶
Catchlight emphasis on the wildlife subject's eye — exposure +0.3 EV + sharpen amount 1.5, scoped to mask_eye_region (RFC-032). The eye becomes the brightest, sharpest point in the frame; gives the bird / animal its 'life.' Cross-genre echo of Portrait Move 7 (eye-detail lift). For close-up wildlife where the subject's gaze is the picture.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
look_wildlife_high_iso_recovery¶
High-ISO wildlife recovery (low-light dance-floor, late dusk owl, early-dawn bird-burst). Manual denoiseprofile (nbhood 7, strength 1.2, scattering 2.0) + gentle sigmoid 1.25 + subtle clarity 0.2. Note: for ISO ≥ 1600 most surveyed wildlife photographers ROUTE THROUGH a sibling AI-NR tool (Topaz DeNoise / DxO PureRAW / LR AI Denoise) BEFORE this look applies; document the BYOA pattern in vocabulary-patterns.md. This look is the chemigram-only manual fallback when sibling tooling isn't configured.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_wildlife_natural_warm¶
Warm golden-hour wildlife default — temperature +0.05 red shift + sigmoid 1.25 + vibrance +0.10 with slight saturation_global pull (-0.03 to keep the warmth credible, not cartoonish). The starting point for early-morning / late-afternoon wildlife where natural warmth IS the subject. Compose with look_wildlife_subject_sharpen for full effect.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_food_appetizing_warm¶
Default food editorial — warm WB (+0.04 red), gentle sigmoid 1.25, vibrance +0.15 + lifted midtone brilliance +0.08. Lauren C. Short / Darina Kopcok / Joanie Simon's foundational starting point for food blog and editorial work. Pre-WB-foundation (gray card recommended); downstream HSL color shaping per look_food_orange_pop / look_food_green_natural compose orthogonally.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
look_food_orange_pop¶
Lift the orange / red food band — tomato, carrot, salmon, paprika, peach. Colorequal sat_orange +0.30 + sat_red +0.20 (saturation lift on warm food colors) + slight brightness lifts. The HSL-per-color discipline that food photographers use INSTEAD of global saturation (which would destroy whites and greens). Compose on top of look_food_appetizing_warm.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
look_food_green_natural¶
Lift greens — fresh herbs, salad, parsley, basil — without crossing into the cartoonish lime-green that over-edited food photography shows. Colorequal sat_green +0.20 + sat_yellow +0.10 + bright_green +0.05. The restraint discipline applied to color shaping (Tucker / Marino voice in food work). Compose on top of look_food_appetizing_warm.
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (masked): below visible threshold on this chart input)
look_food_texture_subtle 🟦 mask-bound¶
Subtle texture lift for food — bread crust, pastry layers, meat fibers, fruit skin texture. Bilat clarity_strength +0.20 — explicit ceiling matching the food-photography-academy 'never overdone' discipline (Kopcok: 'overdoing clarity makes food look dry and unappealing'). Pre-baked with mask_subject so the texture lift scopes to the food, not the table / plate. Compose with look_food_appetizing_warm.
| ColorChecker | Grayscale ramp |
|---|---|
![]() |
![]() |
(near-baseline diff in ColorChecker (global): below visible threshold on this chart input)
(near-baseline diff in grayscale (global): below visible threshold on this chart input)
look_product_packshot_clean¶
Commercial packshot baseline — gentle sigmoid 1.10 (avoids the punch-the-product look), subtle vignette -0.10 (-10% brightness edges; pulls the eye to the centered product). Karl Taylor / Zoe Noble's commercial-product clean-on-white starting point. Assumes WB has been gray-card-corrected (use wb_from_gray_card MCP tool / CLI before this look applies).
| ColorChecker (global) | Grayscale (global) | ColorChecker (centered ellipse mask) | Grayscale (centered ellipse mask) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Notes¶
-
Inputs are sRGB PNGs, not raw files. darktable processes them through its non-raw path — input color profile applies, demosaic does not. Some primitives (e.g., raw-aware white-balance moves) behave differently from how they would on a real raw. The gallery is for visual response validation, not pipeline calibration; for raw-pipeline direction-of-change validation see the e2e suite in
tests/e2e/. -
Mask-bound entries (gradient/ellipse/rectangle, marked 🟦 above) route through the drawn-mask apply path per ADR-076. The mask geometry encodes into the XMP's
masks_history; you see the spatial shaping in the rendered chart. -
Out-of-gamut patches on the ColorChecker (notably patch #18 Cyan) clip to nearest in-gamut sRGB; that clipping is in the input, not the primitive. See
reference-targets/README.md.





























































































































































































































































































































































































































































































































































































































































































































































