use crate::{color_tables::ColorTable, Colors256};
const SIZE_FILE_HEADER: u32 = 14;
const SIZE_DIB_HEADER: u32 = 40;
pub fn raw(image: &impl Colors256, color_table: &mut ColorTable) -> Vec<u8> {
let mut bytes = vec![];
bytes.append(&mut vec![0x42, 0x4D]); bytes.append(&mut size(image, &color_table)); bytes.append(&mut vec![0x00; 4]); bytes.append(&mut offset(&color_table));
bytes.append(&mut vec_of_bytes(SIZE_DIB_HEADER)); bytes.append(&mut vec_of_bytes(image.dimensions().width)); bytes.append(&mut vec_of_bytes(image.dimensions().height)); bytes.append(&mut vec![0x01, 0x00]); bytes.append(&mut vec![0x08, 0x00]); bytes.append(&mut compression_method()); bytes.append(&mut vec_of_bytes(0_u32)); bytes.append(&mut vec_of_bytes(0_u32)); bytes.append(&mut vec_of_bytes(0_u32)); bytes.append(&mut vec_of_bytes(0_u32)); bytes.append(&mut vec_of_bytes(0_u32));
bytes.append(&mut color_table.bytes());
bytes.append(&mut image.samples(color_table));
bytes
}
fn size(image: &impl Colors256, table: &ColorTable) -> Vec<u8> {
vec_of_bytes(
SIZE_FILE_HEADER + SIZE_DIB_HEADER + table.bytes().len() as u32 + image.dimensions().size(),
)
}
fn offset(table: &ColorTable) -> Vec<u8> {
vec_of_bytes(SIZE_FILE_HEADER + SIZE_DIB_HEADER + table.bytes().len() as u32)
}
fn compression_method() -> Vec<u8> {
vec_of_bytes(0_u32)
}
fn vec_of_bytes(number: u32) -> Vec<u8> {
let mut bytes = vec![];
bytes.extend(number.to_le_bytes());
bytes
}
#[cfg(test)]
mod tests {
use crate::binary_format::vec_of_bytes;
#[test]
fn bytes_conversion() {
assert_eq!(vec![0x01, 0x00, 0x00, 0x00], vec_of_bytes(1u32));
assert_eq!(vec![0x01, 0x01, 0x00, 0x00], vec_of_bytes(257u32));
}
}