mindustry logic execution, map- and schematic- parsing and rendering
use cloner
| -rw-r--r-- | mindus/Cargo.toml | 4 | ||||
| -rw-r--r-- | mindus/src/block/logic.rs | 14 | ||||
| -rw-r--r-- | mindus/src/data/map.rs | 2 | ||||
| -rw-r--r-- | mindus/src/utils/image/holder.rs | 42 |
4 files changed, 42 insertions, 20 deletions
diff --git a/mindus/Cargo.toml b/mindus/Cargo.toml index b348bc0..2b91fe6 100644 --- a/mindus/Cargo.toml +++ b/mindus/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mindus" -version = "5.0.4" +version = "5.0.5" edition = "2021" description = "A library for working with mindustry data formats (eg schematics and maps) (fork of plandustry)" authors = [ @@ -25,7 +25,7 @@ bobbin-bits = "0.1" blurslice = { version = "0.1" } enum_dispatch = "0.3" phf = { version = "0.11", features = ["macros"] } -fimg = { version = "0.4.1", default-features = false } +fimg = { version = "0.4.5", default-features = false } [features] bin = ["fimg/save"] diff --git a/mindus/src/block/logic.rs b/mindus/src/block/logic.rs index 4db95f7..7c3e9e0 100644 --- a/mindus/src/block/logic.rs +++ b/mindus/src/block/logic.rs @@ -138,13 +138,15 @@ impl BlockLogic for CanvasBlock { (*r, *g, *b) = PALETTE[y as usize]; *a = 255; } - let img = unsafe { fimg::scale::Nearest::scale(img.as_ref(), (s * self.size as u32) - offset * 2, (s * self.size as u32) - offset * 2) }; - let mut borders = load!("canvas", s); - unsafe { - borders - .borrow_mut() - .overlay_at(&img.as_ref(), offset, offset) + let img = unsafe { + fimg::scale::Nearest::scale( + img.as_ref(), + (s * self.size as u32) - offset * 2, + (s * self.size as u32) - offset * 2, + ) }; + let mut borders = load!("canvas", s); + unsafe { borders.overlay_at(&ImageHolder::from(img), offset, offset) }; return borders; } diff --git a/mindus/src/data/map.rs b/mindus/src/data/map.rs index b29ffd8..de474db 100644 --- a/mindus/src/data/map.rs +++ b/mindus/src/data/map.rs @@ -200,7 +200,7 @@ impl Tile { pub fn floor_image(&self, s: Scale) -> ImageHolder<3> { let mut floor = self.floor(s); if self.has_ore() { - unsafe { floor.borrow_mut().overlay(&self.ore(s).borrow()) }; + unsafe { floor.overlay(&self.ore(s)) }; } floor } diff --git a/mindus/src/utils/image/holder.rs b/mindus/src/utils/image/holder.rs index f44f177..24bcdb1 100644 --- a/mindus/src/utils/image/holder.rs +++ b/mindus/src/utils/image/holder.rs @@ -1,4 +1,4 @@ -use super::{Image, ImageUtils, Overlay, OverlayAt}; +use super::{ClonerOverlay, ClonerOverlayAt, Image, ImageUtils, Overlay, OverlayAt}; #[derive(Clone, Debug)] pub enum ImageHolder<const CHANNELS: usize> { Borrow(Image<&'static [u8], CHANNELS>), @@ -38,18 +38,38 @@ impl<const CHANNELS: usize> ImageHolder<CHANNELS> { } } +macro_rules! make { + ($me: ident . $fn:ident($($argv:expr),*)) => { + match $me { + Self::Own(v) => { + #[allow(unused_unsafe)] + unsafe { v.as_mut().$fn($($argv,)*) }; + $me + } + Self::Borrow(v) => { + #[allow(unused_unsafe)] + { *$me = Self::from(unsafe { v.cloner().$fn($($argv,)*) }) }; + $me + } + } + }; +} + impl OverlayAt<ImageHolder<4>> for ImageHolder<4> { unsafe fn overlay_at(&mut self, with: &ImageHolder<4>, x: u32, y: u32) -> &mut Self { - // SAFETY: this is basically a deref impl, the caller upholds the safety invariants - unsafe { self.borrow_mut().overlay_at(&with.borrow(), x, y) }; - self + make!(self.overlay_at(&with.borrow(), x, y)) + } +} + +impl Overlay<ImageHolder<4>> for ImageHolder<3> { + unsafe fn overlay(&mut self, with: &ImageHolder<4>) -> &mut Self { + make!(self.overlay(&with.borrow())) } } impl Overlay<ImageHolder<4>> for ImageHolder<4> { unsafe fn overlay(&mut self, with: &Self) -> &mut Self { - unsafe { self.borrow_mut().overlay(&with.borrow()) }; - self + make!(self.overlay(&with.borrow())) } } @@ -60,12 +80,12 @@ impl ImageUtils for ImageHolder<4> { } unsafe fn rotate(&mut self, times: u8) -> &mut Self { - if times == 0 { - return self; + match times { + 2 => make!(self.rot_180()), + 1 => make!(self.rot_90()), + 3 => make!(self.rot_270()), + _ => self, } - // borrow mut may clone, so try to avoid - unsafe { self.borrow_mut().rotate(times) }; - self } fn shadow(&mut self) -> &mut Self { |