mindustry logic execution, map- and schematic- parsing and rendering
-rw-r--r--Cargo.toml34
-rw-r--r--README.md2
-rw-r--r--src/data/map.rs6
-rw-r--r--src/data/renderer.rs8
-rw-r--r--src/utils/image.rs10
5 files changed, 35 insertions, 25 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 488049e..60e7a51 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "mindus"
-version = "1.4.1"
+version = "1.4.2"
edition = "2021"
description = "A library for working with mindustry data formats (eg schematics and maps) (fork of plandustry)"
authors = [
@@ -11,23 +11,27 @@ repository = "https://github.com/bend-n/mindus.git"
license = "GPL-3.0"
exclude = [".github/", "items.py"]
-
[dependencies]
flate2 = { version = "1.0", features = ["zlib"], default-features = false }
-base64 = "0.21.2"
-paste = "1.0.12"
+base64 = "0.21"
+paste = "1.0"
strconv = "0.1"
-image = { version = "0.24.6", features = ["png"], default-features = false }
-const-str = "0.5.5"
-color-hex = "0.2.0"
-zip = { version = "0.6.6", features = ["zstd"], default-features = false }
-tinyrand = "0.5.0"
-tinyrand-std = "0.5.0"
-dashmap = "5.4.0"
-fast_image_resize = "2.7.3"
-thiserror = "1.0.41"
-bobbin-bits = "0.1.1"
-blurslice = "0.1.0"
+image = { version = "0.24", features = ["png"], default-features = false }
+const-str = "0.5"
+color-hex = "0.2"
+zip = { version = "0.6", features = ["zstd"], default-features = false }
+tinyrand = "0.5"
+tinyrand-std = "0.5"
+dashmap = "5.4"
+fast_image_resize = "2.7"
+thiserror = "1.0"
+bobbin-bits = "0.1"
+blurslice = { version = "0.1", optional = true }
+
+[features]
+schem_shadow = ["dep:blurslice"]
+map_shadow = ["dep:blurslice"]
+default = ["schem_shadow", "map_shadow"]
[build-dependencies]
zip = { version = "0.6.6", features = ["zstd"], default-features = false }
diff --git a/README.md b/README.md
index 37debda..bb2d76f 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ use mindus::*;
let reg = build_registry();
let mut ss = SchematicSerializer(&reg);
let s = ss.deserialize_base64("bXNjaAF4nD3SQW6DMBBA0bE94wF104vkDr1H1QVtWUQioTL0/oFJ/Fl9GXiy5ZFBhiJ6n26zvE9tv7T1f5/bZbtNyyJvv/P2065/+3W9i0hdpu952SR/fiWp29qOL4/lDzkfExkiEpWPGqMKpZRRlT/8VQkv4aXwnlUopYw6vRTVvRzeGJVYy1ShlDKqezk8O8+DV/AKXgkvRSllvK2sdU/xFE/xFE/xFE/xNLzxeRlU9wzPOK9xXsMzPMOr3EcNL0VlqlBKGVWpfh+O5+zPmRdnXpx5cebFmRd/eQ9KIReL")?;
-let output = Renderer::render(&s);
+let output = s.render();
output.save("output.png");
```
diff --git a/src/data/map.rs b/src/data/map.rs
index 04938d8..20b5a23 100644
--- a/src/data/map.rs
+++ b/src/data/map.rs
@@ -578,13 +578,11 @@ impl<'l> Serializer<Map<'l>> for MapSerializer<'l> {
if central {
let mut output = [0u8; 2];
output.copy_from_slice(&buff.data[..2]);
- let n = u16::from_be_bytes(output) as usize;
let _ = buff.read_chunk(false, |buff| {
#[cfg(debug_assertions)]
println!(
- "reading {:?} {:?}",
- map[i].build.as_ref().unwrap(),
- &buff.data[1..n]
+ "reading {:?}",
+ map[i].build.as_ref().unwrap()
);
let _ = buff.read_i8()?;
diff --git a/src/data/renderer.rs b/src/data/renderer.rs
index 06b2cc5..f020e5f 100644
--- a/src/data/renderer.rs
+++ b/src/data/renderer.rs
@@ -219,7 +219,9 @@ impl Renderable for Schematic<'_> {
}
#[cfg(debug_assertions)]
println!("finishing up");
- image::imageops::overlay(&mut bg, canvas.shadow(), 0, 0);
+ #[cfg(feature = "schem_shadow")]
+ canvas.shadow();
+ image::imageops::overlay(&mut bg, &canvas, 0, 0);
bg
}
}
@@ -282,7 +284,9 @@ impl Renderable for Map<'_> {
);
}
}
- image::imageops::overlay(&mut floor, top.shadow(), 0, 0);
+ #[cfg(feature = "map_shadow")]
+ top.shadow();
+ image::imageops::overlay(&mut floor, &top, 0, 0);
floor
}
}
diff --git a/src/utils/image.rs b/src/utils/image.rs
index d120209..85a8266 100644
--- a/src/utils/image.rs
+++ b/src/utils/image.rs
@@ -1,6 +1,5 @@
-use blurslice::gaussian_blur_bytes;
use fast_image_resize as fr;
-use image::{GenericImageView, Rgb, Rgba, RgbaImage};
+use image::{Rgb, Rgba, RgbaImage};
use std::num::NonZeroU32;
pub trait ImageUtils {
@@ -13,8 +12,10 @@ pub trait ImageUtils {
/// rotate
fn rotate(&mut self, times: u8) -> &mut Self;
/// shadow
+ #[cfg(any(feature = "map_shadow", feature = "schem_shadow"))]
fn shadow(&mut self) -> &mut Self;
/// silhouette
+ #[cfg(any(feature = "map_shadow", feature = "schem_shadow"))]
fn silhouette(&mut self) -> &mut Self;
/// scale a image
///
@@ -88,6 +89,7 @@ impl ImageUtils for RgbaImage {
RgbaImage::from_raw(to.get(), to.get(), dst.into_vec()).unwrap()
}
+ #[cfg(any(feature = "map_shadow", feature = "schem_shadow"))]
fn silhouette(&mut self) -> &mut Self {
for pixel in self.pixels_mut() {
if pixel[3] < 128 {
@@ -99,11 +101,12 @@ impl ImageUtils for RgbaImage {
self
}
+ #[cfg(any(feature = "map_shadow", feature = "schem_shadow"))]
fn shadow(&mut self) -> &mut Self {
let mut shadow = self.clone();
shadow.silhouette();
let samples = shadow.as_flat_samples_mut();
- gaussian_blur_bytes::<4>(
+ blurslice::gaussian_blur_bytes::<4>(
samples.samples,
self.width() as usize,
self.height() as usize,
@@ -114,6 +117,7 @@ impl ImageUtils for RgbaImage {
for y in 0..shadow.height() {
let Rgba([r, g, b, a]) = self.get_pixel_mut(x, y);
if *a == 0 {
+ use image::GenericImageView;
// SAFETY: yes
let p = unsafe { shadow.unsafe_get_pixel(x, y) };
*r = p[0];