| 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<T: ToFloat> { |
| pub numerator: T, |
| pub denominator: T, |
| } |
|
|
| impl<T: ToFloat> ToFloat for Rational<T> { |
| fn to_float(&self) -> f64 { |
| self.numerator.to_float() / self.denominator.to_float() |
| } |
| } |
|
|
| pub struct CurveLookupTable { |
| table: Vec<u16>, |
| } |
|
|
| 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, |
| } |
| } |
| } |
|
|