54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
use crate::consts::{QOI_HEADER_SIZE, QOI_MAGIC};
|
|
|
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
|
pub struct Header {
|
|
pub magic: [u8; 4],
|
|
pub width: u32,
|
|
pub height: u32,
|
|
pub channels: u8,
|
|
pub colorspace: u8,
|
|
}
|
|
|
|
impl Default for Header {
|
|
fn default() -> Self {
|
|
Self { magic: QOI_MAGIC, width: 0, height: 0, channels: 3, colorspace: 0 }
|
|
}
|
|
}
|
|
|
|
const fn u32_to_be(v: u32) -> [u8; 4] {
|
|
[
|
|
((0xff000000 & v) >> 24) as u8,
|
|
((0xff0000 & v) >> 16) as u8,
|
|
((0xff00 & v) >> 8) as u8,
|
|
(0xff & v) as u8,
|
|
]
|
|
}
|
|
|
|
const fn u32_from_be(v: &[u8]) -> u32 {
|
|
((v[0] as u32) << 24) | ((v[1] as u32) << 16) | ((v[2] as u32) << 8) | (v[3] as u32)
|
|
}
|
|
|
|
impl Header {
|
|
pub const SIZE: usize = QOI_HEADER_SIZE;
|
|
|
|
pub(crate) fn to_bytes(&self) -> [u8; QOI_HEADER_SIZE] {
|
|
let mut out = [0; QOI_HEADER_SIZE];
|
|
out[..4].copy_from_slice(&self.magic);
|
|
out[4..8].copy_from_slice(&u32_to_be(self.width));
|
|
out[8..12].copy_from_slice(&u32_to_be(self.height));
|
|
out[12] = self.channels;
|
|
out[13] = self.colorspace;
|
|
out
|
|
}
|
|
|
|
pub(crate) fn from_bytes(v: [u8; QOI_HEADER_SIZE]) -> Self {
|
|
let mut out = Self::default();
|
|
out.magic.copy_from_slice(&v[..4]);
|
|
out.width = u32_from_be(&v[4..8]);
|
|
out.height = u32_from_be(&v[8..12]);
|
|
out.channels = v[12];
|
|
out.colorspace = v[13];
|
|
out
|
|
}
|
|
}
|