use crate::{RawImage, RawPixel}; impl RawImage { pub fn scale_white_balance_fn(&self) -> impl Fn(RawPixel) -> u16 + use<> { let Some(mut white_balance) = self.white_balance else { todo!() }; if white_balance[1] == 0. { white_balance[1] = 1.; } // TODO: Move this at its correct location when highlights are implemented correctly. let highlight = 0; let normalization_factor = if highlight == 0 { white_balance.into_iter().fold(f64::INFINITY, f64::min) } else { white_balance.into_iter().fold(f64::NEG_INFINITY, f64::max) }; let normalized_white_balance = if normalization_factor > 0.00001 { white_balance.map(|x| x / normalization_factor) } else { [1., 1., 1., 1.] }; move |pixel: RawPixel| { let cfa_index = 2 * (pixel.row % 2) + (pixel.column % 2); ((pixel.value as f64) * normalized_white_balance[cfa_index]).min(u16::MAX as f64).max(0.) as u16 } } }