use image::{GenericImageView, Pixel};
use std::path::Path;
pub fn load_image_2d<P: AsRef<Path>>(path: P) -> image::ImageResult<Vec<Vec<u32>>> {
let img = image::open(path)?;
let (width, height) = img.dimensions();
let mut buffer = vec![vec![0u32; width as usize]; height as usize];
for y in 0..height {
for x in 0..width {
let pixel = img.get_pixel(x, y).to_rgb();
let [r, g, b] = pixel.0;
buffer[y as usize][x as usize] =
((r as u32) << 16) |
((g as u32) << 8) |
(b as u32);
}
}
Ok(buffer)
}
pub fn load_sprite_sheet<P: AsRef<Path>>(
path: P,
sprite_width: u32,
sprite_height: u32,
) -> image::ImageResult<Vec<Vec<Vec<u32>>>> {
let img = image::open(path)?;
let (sheet_width, sheet_height) = img.dimensions();
let mut sprites = Vec::new();
let sprites_x = sheet_width / sprite_width;
let sprites_y = sheet_height / sprite_height;
for sy in 0..sprites_y {
for sx in 0..sprites_x {
let mut sprite = vec![vec![0u32; sprite_width as usize]; sprite_height as usize];
for y in 0..sprite_height {
for x in 0..sprite_width {
let px = sx * sprite_width + x;
let py = sy * sprite_height + y;
let pixel = img.get_pixel(px, py).to_rgb();
let [r, g, b] = pixel.0;
sprite[y as usize][x as usize] =
((r as u32) << 16) |
((g as u32) << 8) |
(b as u32);
}
}
sprites.push(sprite);
}
}
Ok(sprites)
}