diff --git a/node-graph/gcore/src/raster/adjustments.rs b/node-graph/gcore/src/raster/adjustments.rs index 769b32c7..6c7724e5 100644 --- a/node-graph/gcore/src/raster/adjustments.rs +++ b/node-graph/gcore/src/raster/adjustments.rs @@ -11,11 +11,19 @@ pub enum LuminanceCalculation { SRGB, Perceptual, AverageChannels, + MinimumChannels, + MaximumChannels, } impl LuminanceCalculation { - pub fn list() -> [LuminanceCalculation; 3] { - [LuminanceCalculation::SRGB, LuminanceCalculation::Perceptual, LuminanceCalculation::AverageChannels] + pub fn list() -> [LuminanceCalculation; 5] { + [ + LuminanceCalculation::SRGB, + LuminanceCalculation::Perceptual, + LuminanceCalculation::AverageChannels, + LuminanceCalculation::MinimumChannels, + LuminanceCalculation::MaximumChannels, + ] } } @@ -25,6 +33,8 @@ impl std::fmt::Display for LuminanceCalculation { LuminanceCalculation::SRGB => write!(f, "sRGB"), LuminanceCalculation::Perceptual => write!(f, "Perceptual"), LuminanceCalculation::AverageChannels => write!(f, "Average Channels"), + LuminanceCalculation::MinimumChannels => write!(f, "Minimum Channels"), + LuminanceCalculation::MaximumChannels => write!(f, "Maximum Channels"), } } } @@ -43,6 +53,8 @@ fn luminance_color_node(color: Color, luma_calculation: LuminanceCalculation) -> LuminanceCalculation::SRGB => color.luminance_srgb(), LuminanceCalculation::Perceptual => color.luminance_perceptual(), LuminanceCalculation::AverageChannels => color.average_rgb_channels(), + LuminanceCalculation::MinimumChannels => color.minimum_rgb_channels(), + LuminanceCalculation::MaximumChannels => color.maximum_rgb_channels(), }; // TODO: Remove conversion to linear when the whole node graph uses linear color @@ -188,6 +200,8 @@ fn threshold_node(color: Color, luma_calculation: LuminanceCalculation, threshol LuminanceCalculation::SRGB => color.luminance_srgb(), LuminanceCalculation::Perceptual => color.luminance_perceptual(), LuminanceCalculation::AverageChannels => color.average_rgb_channels(), + LuminanceCalculation::MinimumChannels => color.minimum_rgb_channels(), + LuminanceCalculation::MaximumChannels => color.maximum_rgb_channels(), }; if luminance >= threshold { diff --git a/node-graph/gcore/src/raster/color.rs b/node-graph/gcore/src/raster/color.rs index 1dfd0279..ff8f94c3 100644 --- a/node-graph/gcore/src/raster/color.rs +++ b/node-graph/gcore/src/raster/color.rs @@ -200,6 +200,14 @@ impl Color { (self.red + self.green + self.blue) / 3. } + pub fn minimum_rgb_channels(&self) -> f32 { + self.red.min(self.green).min(self.blue) + } + + pub fn maximum_rgb_channels(&self) -> f32 { + self.red.max(self.green).max(self.blue) + } + // From https://stackoverflow.com/a/56678483/775283 pub fn luminance_srgb(&self) -> f32 { 0.2126 * self.red + 0.7152 * self.green + 0.0722 * self.blue