diff --git a/core/dr-pipeline/presets/vivid.drpl b/core/dr-pipeline/presets/vivid.drpl new file mode 100644 index 0000000..135cf1c --- /dev/null +++ b/core/dr-pipeline/presets/vivid.drpl @@ -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 diff --git a/core/dr-pipeline/src/bundled.rs b/core/dr-pipeline/src/bundled.rs index 45c3f2b..ff12fc8 100644 --- a/core/dr-pipeline/src/bundled.rs +++ b/core/dr-pipeline/src/bundled.rs @@ -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", diff --git a/ui/dr-ui/src/presets.rs b/ui/dr-ui/src/presets.rs index 17c0551..dc66ce2 100644 --- a/ui/dr-ui/src/presets.rs +++ b/ui/dr-ui/src/presets.rs @@ -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]