pub(crate) fn sniff_webp_dimensions(bytes: &[u8]) -> Option<(usize, usize)> {
if bytes.len() < 30 { return None; }
if &bytes[..4] != b"RIFF" || &bytes[8..12] != b"WEBP" {
return None;
}
if &bytes[12..16] != b"VP8X" {
return None;
}
let w_minus1 = bytes[24] as u32
| ((bytes[25] as u32) << 8)
| ((bytes[26] as u32) << 16);
let h_minus1 = bytes[27] as u32
| ((bytes[28] as u32) << 8)
| ((bytes[29] as u32) << 16);
Some(((w_minus1 + 1) as usize, (h_minus1 + 1) as usize))
}
pub(crate) fn sniff_heic_dimensions(bytes: &[u8]) -> Option<(usize, usize)> {
if bytes.len() < 30 { return None; }
let scan_limit = bytes.len().saturating_sub(16).min(1024 * 1024);
for i in 0..scan_limit {
if &bytes[i..i + 4] == b"ispe" {
let w_off = i + 4 + 4; if w_off + 8 > bytes.len() { return None; }
let width = u32::from_be_bytes([
bytes[w_off], bytes[w_off + 1], bytes[w_off + 2], bytes[w_off + 3],
]);
let height = u32::from_be_bytes([
bytes[w_off + 4], bytes[w_off + 5], bytes[w_off + 6], bytes[w_off + 7],
]);
if width == 0 || height == 0 { return None; }
return Some((width as usize, height as usize));
}
}
None
}