80 lines
1.5 KiB
Rust
80 lines
1.5 KiB
Rust
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,
|
|
}
|
|
}
|
|
}
|