Ship a Vivid section of presets

Five looks for "more colourful than the default": Vivid, Vivid strong,
Vivid landscape, Vivid warm and Vivid portrait. They lean on vibrance,
which lifts muted colours most and holds skin back, and use saturation
sparingly on top; landscape and portrait work the colour mixer's bands
so foliage and sky get richer while skin does not. A sixth, Stronger
camera look, pushes the camera profile's look table to 175 %, about the
step from Adobe Standard to Adobe Vivid, and only moves vibrance where
a photograph has no profile.

All change only what they name, so they keep a corrected exposure or
white balance, and the shipped-preset tests bound every key and value.
This commit is contained in:
2026-10-02 22:38:07 -04:00
parent eae720ce75
commit cb7ad0bbe7
3 changed files with 78 additions and 2 deletions
+75
View File
@@ -0,0 +1,75 @@
drpl 1
# Vivid: more colour than the default rendering, for the photographer used
# to Lightroom's richer starting point (camera-profiles.md §9).
#
# Most of that difference is the camera profile's look table, which D20 now
# applies where a profile exists. These go further, and work on every
# photograph — a JPEG, a body with no profile — because they lean on
# vibrance before saturation: vibrance lifts muted colours most and holds
# skin back, so a frame gets richer before anything in it looks painted.
# Saturation, which moves every colour alike, is used sparingly on top.
#
# Each changes only what it names (FR-DEV-6), so a corrected exposure or
# white balance survives applying one.
[preset Vivid]
contrast.contrast = 10
saturation.saturation = 8
vibrance.vibrance = 30
[preset Vivid, strong]
blacks_whites.blacks = -10
clarity.amount = 8
contrast.contrast = 18
saturation.saturation = 15
vibrance.vibrance = 45
# Foliage and sky: green and chartreuse for leaves and grass, azure and blue
# for sky and water, a little yellow for dry grass and stone. The skin bands
# — red and orange — are left where they are, so a figure in a landscape
# keeps a human complexion.
[preset Vivid landscape]
clarity.amount = 10
colour_mixer.azure_lum = -10
colour_mixer.azure_sat = 20
colour_mixer.blue_lum = -10
colour_mixer.blue_sat = 15
colour_mixer.chartreuse_sat = 15
colour_mixer.green_sat = 20
colour_mixer.yellow_sat = 10
contrast.contrast = 12
saturation.saturation = 5
vibrance.vibrance = 25
# Golden hour: oranges and yellows up and a warm cast laid over the
# highlights only, so shadows stay clean rather than muddy.
[preset Vivid warm]
colour_grading.highlight_hue = 45
colour_grading.highlight_strength = 12
colour_mixer.orange_sat = 15
colour_mixer.red_sat = 8
colour_mixer.yellow_sat = 15
contrast.contrast = 8
vibrance.vibrance = 25
# People: everything around the subject gets richer while skin does not.
# Vibrance already protects skin; the orange and red bands are then held a
# little below where they started, because a face is the one colour every
# viewer knows the right value of.
[preset Vivid portrait]
colour_mixer.azure_sat = 10
colour_mixer.blue_sat = 12
colour_mixer.green_sat = 12
colour_mixer.orange_sat = -10
colour_mixer.red_sat = -5
contrast.contrast = 6
saturation.saturation = -5
vibrance.vibrance = 25
# The camera profile's own look, pushed: Adobe Standard's look table at
# 175 % is close to the jump from Adobe Standard to Adobe Vivid. Where the
# photograph has no profile, only the vibrance moves.
[preset Stronger camera look]
camera_profile.look = 175
vibrance.vibrance = 10
+1
View File
@@ -65,6 +65,7 @@ const SECTIONS: &[(&str, &str, &str)] = &[
include_str!("../presets/essentials.drpl"),
),
("skies", "Skies", include_str!("../presets/skies.drpl")),
("vivid", "Vivid", include_str!("../presets/vivid.drpl")),
(
"colour_film",
"Film/Colour",
+2 -2
View File
@@ -1823,7 +1823,7 @@ mod tests {
let rows = presets.rows();
assert!(rows.iter().all(|r| r.folder && r.depth == 0), "{rows:?}");
let labels: Vec<_> = rows.iter().map(|r| r.label.to_string()).collect();
assert_eq!(labels, ["Essentials", "Skies", "Film"]);
assert_eq!(labels, ["Essentials", "Skies", "Vivid", "Film"]);
presets.toggle("shipped/Film");
let film: Vec<_> = presets
@@ -1835,7 +1835,7 @@ mod tests {
assert_eq!(film, ["Colour", "Cinema", "Black and white"]);
presets.toggle("shipped/Film");
assert_eq!(presets.rows().len(), 3);
assert_eq!(presets.rows().len(), 4);
}
#[test]