diff options
Diffstat (limited to 'src/render/composite.rs')
-rw-r--r-- | src/render/composite.rs | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/render/composite.rs b/src/render/composite.rs index 99950f1..ea9cc29 100644 --- a/src/render/composite.rs +++ b/src/render/composite.rs @@ -7,21 +7,25 @@ pub const CHUNK_SIZE: usize = 16; pub fn image_buffer_blit( target: &mut ImageBuffer<Rgba<u8>, Vec<u8>>, source: &ImageBuffer<Rgba<u8>, Vec<u8>>, - offset: (u32, u32), + offset: (isize, isize), ) { for (x, y, source_pixel) in source.enumerate_pixels() { - let target_pixel = target.get_pixel_mut(x + offset.0, y + offset.1); - let sa = source_pixel.0[3] as u16; - let new_pixel = Rgba::from([ - ((target_pixel.0[0] as u16 * (255 - sa)) / 255 + (source_pixel.0[0] as u16 * sa) / 255) - as u8, - ((target_pixel.0[1] as u16 * (255 - sa)) / 255 + (source_pixel.0[1] as u16 * sa) / 255) - as u8, - ((target_pixel.0[2] as u16 * (255 - sa)) / 255 + (source_pixel.0[2] as u16 * sa) / 255) - as u8, - 255 - (((255 - target_pixel.0[3] as u16) * (255 - sa)) / 255) as u8, - ]); - *target_pixel = new_pixel; + let tx = x as isize + offset.0; + let ty = y as isize + offset.1; + if tx >= 0 && tx < target.width() as isize && ty >= 0 && ty < target.height() as isize { + let target_pixel = target.get_pixel_mut(tx as u32, ty as u32); + let sa = source_pixel.0[3] as u16; + let new_pixel = Rgba::from([ + ((target_pixel.0[0] as u16 * (255 - sa)) / 255 + + (source_pixel.0[0] as u16 * sa) / 255) as u8, + ((target_pixel.0[1] as u16 * (255 - sa)) / 255 + + (source_pixel.0[1] as u16 * sa) / 255) as u8, + ((target_pixel.0[2] as u16 * (255 - sa)) / 255 + + (source_pixel.0[2] as u16 * sa) / 255) as u8, + 255 - (((255 - target_pixel.0[3] as u16) * (255 - sa)) / 255) as u8, + ]); + *target_pixel = new_pixel; + } } } |