Walk JPEG segments until a Start-Of-Frame marker, read (h, w).
(b: &[u8])
| 93 | |
| 94 | /// Walk JPEG segments until a Start-Of-Frame marker, read (h, w). |
| 95 | fn parse_jpeg_size(b: &[u8]) -> Option<(u32, u32)> { |
| 96 | let mut i = 2; |
| 97 | while i + 9 < b.len() { |
| 98 | if b[i] != 0xFF { return None; } |
| 99 | let marker = b[i + 1]; |
| 100 | i += 2; |
| 101 | // Standalone markers (no length field) |
| 102 | if marker == 0xD8 || marker == 0xD9 { continue; } |
| 103 | if i + 2 > b.len() { return None; } |
| 104 | let seg_len = u16::from_be_bytes([b[i], b[i+1]]) as usize; |
| 105 | // SOF0 (0xC0), SOF1 (0xC1), SOF2 (0xC2) — baseline + progressive. |
| 106 | if marker == 0xC0 || marker == 0xC1 || marker == 0xC2 { |
| 107 | if i + 7 > b.len() { return None; } |
| 108 | let h = u16::from_be_bytes([b[i+3], b[i+4]]) as u32; |
| 109 | let w = u16::from_be_bytes([b[i+5], b[i+6]]) as u32; |
| 110 | return Some((w, h)); |
| 111 | } |
| 112 | i += seg_len; |
| 113 | } |
| 114 | None |
| 115 | } |
| 116 | |
| 117 | pub fn width(handle: u32) -> u32 { |
| 118 | let reg = REG.lock().unwrap(); |