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