mindustry logic execution, map- and schematic- parsing and rendering
use cloner
bendn 2023-09-25
parent 200dc2e · commit 8842b7f
-rw-r--r--mindus/Cargo.toml4
-rw-r--r--mindus/src/block/logic.rs14
-rw-r--r--mindus/src/data/map.rs2
-rw-r--r--mindus/src/utils/image/holder.rs42
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 {