Skip to main content

imagesize/formats/
astc.rs

1use std::io::{BufRead, Seek, SeekFrom};
2
3use crate::{ImageResult, ImageSize};
4
5pub fn size<R: BufRead + Seek>(reader: &mut R) -> ImageResult<ImageSize> {
6    // ASTC header is 16 bytes total
7    // Magic number: 0x13, 0x12, 0x10, 0x5C (4 bytes)
8    // Block dimensions: blockdim_x, blockdim_y, blockdim_z (3 bytes) - skip these
9    // Image dimensions: xsize (3 bytes), ysize (3 bytes), zsize (3 bytes)
10
11    reader.seek(SeekFrom::Start(7))?; // Skip magic + block dimensions
12
13    // Read 3-byte little-endian values for image dimensions
14    let mut xsize_bytes = [0u8; 4];
15    reader.read_exact(&mut xsize_bytes[0..3])?;
16    let width = u32::from_le_bytes(xsize_bytes) as usize;
17
18    let mut ysize_bytes = [0u8; 4];
19    reader.read_exact(&mut ysize_bytes[0..3])?;
20    let height = u32::from_le_bytes(ysize_bytes) as usize;
21
22    Ok(ImageSize { width, height })
23}
24
25pub fn matches(header: &[u8]) -> bool {
26    // ASTC magic number is 0x13 0xAB 0xA? 0x5C (third byte can be A0 or A1)
27    header.len() >= 4
28        && header[0] == 0x13
29        && header[1] == 0xAB
30        && (header[2] == 0xA0 || header[2] == 0xA1)
31        && header[3] == 0x5C
32}