s25 0.2.1

Decoder and encoder for ShiinaRio .S25 format.
Documentation
pub(crate) mod io {
    use std::io::Read;

    pub fn read_i16<R: Read>(mut reader: R) -> std::io::Result<i16> {
        let mut buf = 0_i16.to_le_bytes();
        reader.read_exact(&mut buf)?;
        Ok(i16::from_le_bytes(buf))
    }

    pub fn read_i32<R: Read>(mut reader: R) -> std::io::Result<i32> {
        let mut buf = 0_i32.to_le_bytes();
        reader.read_exact(&mut buf)?;
        Ok(i32::from_le_bytes(buf))
    }

    pub fn push_i16(v: &mut Vec<u8>, a: i16) {
        let a = a.to_le_bytes();
        v.push(a[0]);
        v.push(a[1]);
    }

    pub fn push_i32(v: &mut Vec<u8>, a: i32) {
        let a = a.to_le_bytes();
        v.push(a[0]);
        v.push(a[1]);
        v.push(a[2]);
        v.push(a[3]);
    }
}

pub fn rgba_to_bgra(rgba: &[u8]) -> Vec<u8> {
    assert!(rgba.len() & 0x03 == 0);

    let mut bgra = vec![0; rgba.len()];

    for i in 0..(rgba.len() >> 2) {
        let i = i << 2;
        bgra[i] = rgba[i + 2];
        bgra[i + 1] = rgba[i + 1];
        bgra[i + 2] = rgba[i + 0];
        bgra[i + 3] = rgba[i + 3];
    }

    bgra
}