use crate::types::Rect;
pub fn dirty_rect(prev: &[u8], curr: &[u8], width: u16, height: u16) -> Option<Rect> {
let stride = width as usize * 4;
let mut min_x = width as i32;
let mut min_y = height as i32;
let mut max_x: i32 = -1;
let mut max_y: i32 = -1;
for y in 0..height as usize {
let row_offset = y * stride;
let prev_row = &prev[row_offset..row_offset + stride];
let curr_row = &curr[row_offset..row_offset + stride];
if prev_row != curr_row {
if (y as i32) < min_y {
min_y = y as i32;
}
if (y as i32) > max_y {
max_y = y as i32;
}
for x in 0..width as usize {
let px = x * 4;
if prev_row[px..px + 4] != curr_row[px..px + 4] {
if (x as i32) < min_x {
min_x = x as i32;
}
if (x as i32) > max_x {
max_x = x as i32;
}
}
}
}
}
if max_x < 0 {
None
} else {
Some(Rect {
x: min_x,
y: min_y,
w: (max_x - min_x + 1) as u16,
h: (max_y - min_y + 1) as u16,
})
}
}
pub fn extract_region(buf: &[u8], width: u16, rect: &Rect, out: &mut [u8]) {
let stride = width as usize * 4;
let rw = rect.w as usize * 4;
for row in 0..rect.h as usize {
let src_y = (rect.y as usize + row) * stride + rect.x as usize * 4;
let dst_y = row * rw;
out[dst_y..dst_y + rw].copy_from_slice(&buf[src_y..src_y + rw]);
}
}