use std::io::{self, Read};
use std::collections::HashMap;
use byteorder::BigEndian;
const PAD: u16 = 1;
pub struct Atlas {
#[allow(dead_code)] pub(super) dims: (f32, f32),
pub(super) images: HashMap<u16, ImageCoords>,
}
impl Atlas {
pub fn new<R: Read>(mut input: R) -> io::Result<Atlas> {
use byteorder::ReadBytesExt;
let dims = (input.read_u16::<BigEndian>()? as f32, input.read_u16::<BigEndian>()? as f32);
let handle_count = input.read_u16::<BigEndian>()?;
let mut images = HashMap::with_capacity(handle_count as usize);
for id in 0..handle_count {
let image = ImageCoords {
lt: ((input.read_u16::<BigEndian>()? - PAD) as f32, (input.read_u16::<BigEndian>()? - PAD) as f32),
rb: ((input.read_u16::<BigEndian>()? + PAD) as f32, (input.read_u16::<BigEndian>()? + PAD) as f32),
anchor: (0.5 * input.read_i16::<BigEndian>()? as f32, 0.5 * input.read_i16::<BigEndian>()? as f32),
};
images.insert(id, image);
}
Ok(Atlas { dims, images })
}
}
#[derive(Copy, Clone)]
pub(super) struct ImageCoords {
pub lt: (f32, f32), pub rb: (f32, f32), pub anchor: (f32, f32), }