#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum AdobeTransform {
Unknown, YCbCr, Ycck, }
pub(crate) fn parse_adobe_app14(payload: &[u8]) -> Option<AdobeTransform> {
if payload.len() < 12 || &payload[0..5] != b"Adobe" {
return None;
}
match payload[11] {
0 => Some(AdobeTransform::Unknown),
1 => Some(AdobeTransform::YCbCr),
2 => Some(AdobeTransform::Ycck),
_ => Some(AdobeTransform::Unknown), }
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::vec;
use alloc::vec::Vec;
fn adobe_payload(transform: u8) -> Vec<u8> {
let mut v = vec![b'A', b'd', b'o', b'b', b'e'];
v.extend_from_slice(&[0x00, 0x64]); v.extend_from_slice(&[0x00, 0x00]); v.extend_from_slice(&[0x00, 0x00]); v.push(transform);
v
}
#[test]
fn parses_adobe_ycbcr_transform() {
assert_eq!(
parse_adobe_app14(&adobe_payload(1)),
Some(AdobeTransform::YCbCr)
);
}
#[test]
fn parses_adobe_ycck_transform() {
assert_eq!(
parse_adobe_app14(&adobe_payload(2)),
Some(AdobeTransform::Ycck)
);
}
#[test]
fn parses_adobe_unknown_transform_zero() {
assert_eq!(
parse_adobe_app14(&adobe_payload(0)),
Some(AdobeTransform::Unknown)
);
}
#[test]
fn parses_adobe_unknown_transform_out_of_range() {
assert_eq!(
parse_adobe_app14(&adobe_payload(99)),
Some(AdobeTransform::Unknown)
);
}
#[test]
fn rejects_non_adobe_signature() {
let mut p = adobe_payload(1);
p[0] = b'X';
assert_eq!(parse_adobe_app14(&p), None);
}
#[test]
fn rejects_short_payload() {
assert_eq!(parse_adobe_app14(b"Adobe"), None);
}
}