mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/utils/image/overlay.rs')
| -rw-r--r-- | src/utils/image/overlay.rs | 70 |
1 files changed, 54 insertions, 16 deletions
diff --git a/src/utils/image/overlay.rs b/src/utils/image/overlay.rs index 4406a9b..3dba13b 100644 --- a/src/utils/image/overlay.rs +++ b/src/utils/image/overlay.rs @@ -79,6 +79,24 @@ impl OverlayAt<Image<&[u8], 4>> for Image<&mut [u8], 3> { } } +impl OverlayAt<Image<&[u8], 3>> for Image<&mut [u8], 3> { + unsafe fn overlay_at(&mut self, with: &Image<&[u8], 3>, x: u32, y: u32) -> &mut Self { + for j in 0..with.height() { + let i_x = j as usize * with.width() as usize * 3 + ..(j as usize + 1) * with.width() as usize * 3; + let o_x = ((j as usize + y as usize) * self.width() as usize + x as usize) * 3 + ..((j as usize + y as usize) * self.width() as usize + + x as usize + + with.width() as usize) + * 3; + let a = unsafe { self.buffer.get_unchecked_mut(o_x) }; + let b = unsafe { with.buffer.get_unchecked(i_x) }; + a.copy_from_slice(b); + } + self + } +} + impl Overlay<Image<&[u8], 4>> for Image<&mut [u8], 3> { unsafe fn overlay(&mut self, with: &Image<&[u8], 4>) -> &mut Self { unsafe { assert_unchecked!(self.width() == with.width()) }; @@ -135,36 +153,56 @@ mod bench { use crate::{data::renderer::Scale, load}; #[bench] + fn overlay_3on3at(bench: &mut Bencher) { + let mut v = vec![0u8; 3 * 64 * 64]; + let mut a: Image<_, 3> = Image::new( + 64.try_into().unwrap(), + 64.try_into().unwrap(), + v.as_mut_slice(), + ); + let b = load!("darksand", Scale::Eigth); + bench.iter(|| unsafe { + for x in 0..16 { + for y in 0..16 { + black_box(a.overlay_at(&b.borrow(), x, y)); + } + } + }); + } + + #[bench] fn overlay_4on3at(bench: &mut Bencher) { - let mut v = vec![0u8; 3 * 56 * 56]; + let mut v = vec![0u8; 3 * 64 * 64]; let mut a: Image<_, 3> = Image::new( - 56.try_into().unwrap(), - 56.try_into().unwrap(), + 64.try_into().unwrap(), + 64.try_into().unwrap(), v.as_mut_slice(), ); - let b = load!("interplanetary-accelerator", Scale::Eigth); + let b = load!("salt-wall", Scale::Eigth); bench.iter(|| unsafe { - black_box(a.overlay_at(&b.borrow(), 0, 0)); - black_box(a.overlay_at(&b.borrow(), 28, 0)); - black_box(a.overlay_at(&b.borrow(), 28, 28)); - black_box(a.overlay_at(&b.borrow(), 0, 28)); + for x in 0..16 { + for y in 0..16 { + black_box(a.overlay_at(&b.borrow(), x, y)); + } + } }); } #[bench] fn overlay_4on4at(bench: &mut Bencher) { - let mut v = vec![0u8; 4 * 56 * 56]; + let mut v = vec![0u8; 4 * 64 * 64]; let mut a: Image<_, 4> = Image::new( - 56.try_into().unwrap(), - 56.try_into().unwrap(), + 64.try_into().unwrap(), + 64.try_into().unwrap(), v.as_mut_slice(), ); - let b = load!("interplanetary-accelerator", Scale::Eigth); + let b = load!("salt-wall", Scale::Eigth); bench.iter(|| unsafe { - black_box(a.overlay_at(&b.borrow(), 0, 0)); - black_box(a.overlay_at(&b.borrow(), 28, 0)); - black_box(a.overlay_at(&b.borrow(), 28, 28)); - black_box(a.overlay_at(&b.borrow(), 0, 28)); + for x in 0..16 { + for y in 0..16 { + black_box(a.overlay_at(&b.borrow(), x, y)); + } + } }); } } |