mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/utils/image/overlay.rs')
-rw-r--r--src/utils/image/overlay.rs61
1 files changed, 60 insertions, 1 deletions
diff --git a/src/utils/image/overlay.rs b/src/utils/image/overlay.rs
index aee251c..9cad52e 100644
--- a/src/utils/image/overlay.rs
+++ b/src/utils/image/overlay.rs
@@ -1,8 +1,24 @@
-use super::{really_unsafe_index, unsafe_assert, Image, Overlay, OverlayAt};
+use super::{really_unsafe_index, unsafe_assert, Image};
use std::simd::SimdInt;
use std::simd::SimdPartialOrd;
use std::simd::{simd_swizzle, Simd};
+pub trait OverlayAt<W> {
+ /// Overlay with => self at coordinates x, y, without blending
+ /// # Safety
+ ///
+ /// UB if x, y is out of bounds
+ unsafe fn overlay_at(&mut self, with: &W, x: u32, y: u32) -> &mut Self;
+}
+
+pub trait Overlay<W> {
+ /// Overlay with => self (does not blend)
+ /// # Safety
+ ///
+ /// UB if a.width != b.width || a.height != b.height
+ unsafe fn overlay(&mut self, with: &W) -> &mut Self;
+}
+
#[inline]
pub unsafe fn blit(rgb: &mut [u8], rgba: &[u8]) {
const LAST4: Simd<u8, 16> = Simd::from_array([
@@ -108,3 +124,46 @@ impl OverlayAt<Image<&[u8], 4>> for Image<&mut [u8], 4> {
self
}
}
+
+#[cfg(test)]
+mod bench {
+ extern crate test;
+ use test::{black_box, Bencher};
+
+ use super::*;
+ use crate::{data::renderer::Scale, load};
+
+ #[bench]
+ fn overlay_4on3at(bench: &mut Bencher) {
+ let mut v = vec![0u8; 3 * 56 * 56];
+ let mut a: Image<_, 3> = Image::new(
+ 56.try_into().unwrap(),
+ 56.try_into().unwrap(),
+ v.as_mut_slice(),
+ );
+ let b = load!("interplanetary-accelerator", 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));
+ });
+ }
+
+ #[bench]
+ fn overlay_4on4at(bench: &mut Bencher) {
+ let mut v = vec![0u8; 4 * 56 * 56];
+ let mut a: Image<_, 4> = Image::new(
+ 56.try_into().unwrap(),
+ 56.try_into().unwrap(),
+ v.as_mut_slice(),
+ );
+ let b = load!("interplanetary-accelerator", 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));
+ });
+ }
+}