pub mod ccitt;
pub mod lzw;
pub mod packbits;
pub mod predictor;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Compression {
#[default]
None,
CcittRle,
CcittGroup3Fax,
CcittGroup4Fax,
Lzw,
OldJpeg,
Jpeg,
Deflate,
PackBits,
}
impl Compression {
#[must_use]
pub fn from_code(code: u32) -> Option<Self> {
Some(match code {
1 => Compression::None,
2 => Compression::CcittRle,
3 => Compression::CcittGroup3Fax,
4 => Compression::CcittGroup4Fax,
5 => Compression::Lzw,
6 => Compression::OldJpeg,
7 => Compression::Jpeg,
8 | 32946 => Compression::Deflate,
32773 => Compression::PackBits,
_ => return None,
})
}
#[must_use]
pub fn code(self) -> u16 {
match self {
Compression::None => 1,
Compression::CcittRle => 2,
Compression::CcittGroup3Fax => 3,
Compression::CcittGroup4Fax => 4,
Compression::Lzw => 5,
Compression::OldJpeg => 6,
Compression::Jpeg => 7,
Compression::Deflate => 8,
Compression::PackBits => 32773,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn compression_codes_round_trip() {
for c in [
Compression::None,
Compression::CcittRle,
Compression::CcittGroup3Fax,
Compression::CcittGroup4Fax,
Compression::Lzw,
Compression::OldJpeg,
Compression::Jpeg,
Compression::Deflate,
Compression::PackBits,
] {
assert_eq!(Compression::from_code(u32::from(c.code())), Some(c));
}
assert_eq!(Compression::from_code(32946), Some(Compression::Deflate));
assert_eq!(Compression::from_code(99), None);
}
}