#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PhotometricInterpretation {
WhiteIsZero,
BlackIsZero,
Rgb,
Palette,
TransparencyMask,
Cmyk,
YCbCr,
CieLab,
}
impl PhotometricInterpretation {
#[must_use]
pub fn from_code(code: u32) -> Option<Self> {
Some(match code {
0 => PhotometricInterpretation::WhiteIsZero,
1 => PhotometricInterpretation::BlackIsZero,
2 => PhotometricInterpretation::Rgb,
3 => PhotometricInterpretation::Palette,
4 => PhotometricInterpretation::TransparencyMask,
5 => PhotometricInterpretation::Cmyk,
6 => PhotometricInterpretation::YCbCr,
8 => PhotometricInterpretation::CieLab,
_ => return None,
})
}
#[must_use]
pub fn code(self) -> u16 {
match self {
PhotometricInterpretation::WhiteIsZero => 0,
PhotometricInterpretation::BlackIsZero => 1,
PhotometricInterpretation::Rgb => 2,
PhotometricInterpretation::Palette => 3,
PhotometricInterpretation::TransparencyMask => 4,
PhotometricInterpretation::Cmyk => 5,
PhotometricInterpretation::YCbCr => 6,
PhotometricInterpretation::CieLab => 8,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Predictor {
#[default]
None,
HorizontalDifferencing,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn photometric_codes_round_trip() {
for code in [0u32, 1, 2, 3, 4, 5, 6, 8] {
let p = PhotometricInterpretation::from_code(code).expect("known photometric");
assert_eq!(u32::from(p.code()), code);
}
assert_eq!(PhotometricInterpretation::from_code(7), None);
assert_eq!(PhotometricInterpretation::from_code(9), None);
}
#[test]
fn predictor_defaults_to_none() {
assert_eq!(Predictor::default(), Predictor::None);
assert_ne!(Predictor::None, Predictor::HorizontalDifferencing);
}
}