pub trait ToFloat { fn to_float(&self) -> f64; } impl ToFloat for u32 { fn to_float(&self) -> f64 { *self as f64 } } impl ToFloat for i32 { fn to_float(&self) -> f64 { *self as f64 } } pub struct Rational { pub numerator: T, pub denominator: T, } impl ToFloat for Rational { fn to_float(&self) -> f64 { self.numerator.to_float() / self.denominator.to_float() } } pub struct CurveLookupTable { table: Vec, } impl CurveLookupTable { pub fn from_sony_tone_table(values: [u16; 4]) -> CurveLookupTable { let mut sony_curve = [0, 0, 0, 0, 0, 4095]; for i in 0..4 { sony_curve[i + 1] = values[i] >> 2 & 0xfff; } let mut table = vec![0_u16; (sony_curve[5] + 1).into()]; for i in 0..5 { for j in (sony_curve[i] + 1)..=sony_curve[i + 1] { table[j as usize] = table[(j - 1) as usize] + (1 << i); } } CurveLookupTable { table } } pub fn get(&self, x: usize) -> u16 { self.table[x] } } #[derive(Copy, Clone, Eq, PartialEq)] pub enum Transform { Horizontal, MirrorHorizontal, Rotate180, MirrorVertical, MirrorHorizontalRotate270, Rotate90, MirrorHorizontalRotate90, Rotate270, } impl Transform { pub fn is_identity(&self) -> bool { *self == Transform::Horizontal } pub fn will_swap_coordinates(&self) -> bool { use Transform as Tr; match *self { Tr::Horizontal | Tr::MirrorHorizontal | Tr::Rotate180 | Tr::MirrorVertical => false, Tr::MirrorHorizontalRotate270 | Tr::Rotate90 | Tr::MirrorHorizontalRotate90 | Tr::Rotate270 => true, } } }