Add Minimum and Maximum option to Threshold node (#1029)

This might be usefull later when spliting Images into Seperate Images for each Channel, as then the other modes might behave weirdly

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
isiko 2023-02-20 08:39:09 +01:00 committed by Keavon Chambers
parent 6caed9e761
commit 4bb4e2c22e
2 changed files with 24 additions and 2 deletions

View file

@ -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 {

View file

@ -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