use super::*;
impl GridEdgeAtlas {
}
impl GridEdgeAtlas {
pub fn from_wang(wang: &RgbaImage) -> ImageResult<Self> {
let cell_size = wang.width() / 4;
if wang.width() % 4 != 0 || wang.width() != wang.height() {
dimension_error()?
}
let mut out = Self {
image: RgbaImage::new(cell_size * 16, cell_size),
count: [1; 16],
};
for i in 0..16 {
let view = make_wing_cell(wang, i, cell_size);
out.image.copy_from(&view.to_image(), i * cell_size, 0)?;
}
Ok(out)
}
}
fn make_wing_cell(raw: &RgbaImage, id: u32, s: u32) -> SubImage<&RgbaImage> {
match id {
0b0000 => raw.view(0 * s, 3 * s, s, s),
0b0001 => raw.view(1 * s, 3 * s, s, s),
0b0010 => raw.view(0 * s, 2 * s, s, s),
0b0011 => raw.view(1 * s, 2 * s, s, s),
0b0100 => raw.view(3 * s, 3 * s, s, s),
0b0101 => raw.view(2 * s, 3 * s, s, s),
0b0110 => raw.view(3 * s, 2 * s, s, s),
0b0111 => raw.view(2 * s, 2 * s, s, s),
0b1000 => raw.view(0 * s, 0 * s, s, s),
0b1001 => raw.view(1 * s, 0 * s, s, s),
0b1010 => raw.view(0 * s, 1 * s, s, s),
0b1011 => raw.view(1 * s, 1 * s, s, s),
0b1100 => raw.view(3 * s, 0 * s, s, s),
0b1101 => raw.view(2 * s, 0 * s, s, s),
0b1110 => raw.view(3 * s, 1 * s, s, s),
0b1111 => raw.view(2 * s, 1 * s, s, s),
_ => unreachable!(),
}
}