use crate::core_modules::chunk::chunk::Chunk;
use crate::core_modules::pixel::pixel::Pixel;
use crate::core_modules::smart_chunk::{ChunkStatus, SmartChunk};
pub struct GridManager {
image_width: u32,
grid_width: u32,
grid_height: u32,
chunk_width: u32,
chunk_height: u32,
smart_chunks: Vec<SmartChunk>,
}
impl GridManager {
pub fn new(image_width: u32, image_height: u32, chunk_width: u32, chunk_height: u32) -> Self {
let grid_width = image_width / chunk_width;
let grid_height = image_height / chunk_height;
let num_chunks = (grid_width * grid_height) as usize;
let mut smart_chunks = Vec::with_capacity(num_chunks);
for i in 0..num_chunks {
let y = i as u32 / grid_width;
let x = i as u32 % grid_width;
smart_chunks.push(SmartChunk::new(x, y));
}
Self {
image_width,
grid_width,
grid_height,
chunk_width,
chunk_height,
smart_chunks,
}
}
pub fn process_frame(&mut self, frame_buffer: &[u8]) -> Vec<ChunkStatus> {
for chunk_index in 0..self.smart_chunks.len() {
let chunk_y = chunk_index as u32 / self.grid_width;
let chunk_x = chunk_index as u32 % self.grid_width;
let start_pixel_x = chunk_x * self.chunk_width;
let start_pixel_y = chunk_y * self.chunk_height;
let mut chunk_pixels =
Vec::with_capacity((self.chunk_width * self.chunk_height) as usize);
for i in 0..(self.chunk_width * self.chunk_height) {
let y_offset = i / self.chunk_width;
let x_offset = i % self.chunk_width;
let pixel_y = start_pixel_y + y_offset;
let pixel_x = start_pixel_x + x_offset;
let byte_index = ((pixel_y * self.image_width) + pixel_x) * 4;
let pixel_bytes = &frame_buffer[byte_index as usize..(byte_index + 4) as usize];
chunk_pixels.push(Pixel::from(pixel_bytes));
}
let chunk_data = Chunk::new(self.chunk_width, self.chunk_height, chunk_pixels);
self.smart_chunks[chunk_index].update(&chunk_data);
}
self.smart_chunks
.iter()
.map(|sc| sc.status.clone())
.collect()
}
}