mindustry logic execution, map- and schematic- parsing and rendering
blend
| -rw-r--r-- | mindus/Cargo.toml | 5 | ||||
| -rw-r--r-- | mindus/src/data/renderer.rs | 14 | ||||
| -rw-r--r-- | mindus/src/utils/image/mod.rs | 37 |
3 files changed, 5 insertions, 51 deletions
diff --git a/mindus/Cargo.toml b/mindus/Cargo.toml index b327f36..5477f4a 100644 --- a/mindus/Cargo.toml +++ b/mindus/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mindus" -version = "5.0.7" +version = "5.0.8" edition = "2021" description = "A library for working with mindustry data formats (eg schematics and maps) (fork of plandustry)" authors = [ @@ -25,8 +25,7 @@ bobbin-bits = "0.1" blurslice = { version = "0.1" } enum_dispatch = "0.3" phf = { version = "0.11", features = ["macros"] } -fimg = { version = "0.4.20", features = ["scale"], default-features = false } -umath = "0.0.1" +fimg = { version = "0.4.21", features = ["scale"], default-features = false } [features] bin = ["fimg/save"] diff --git a/mindus/src/data/renderer.rs b/mindus/src/data/renderer.rs index 32e07b4..ab8554b 100644 --- a/mindus/src/data/renderer.rs +++ b/mindus/src/data/renderer.rs @@ -5,6 +5,8 @@ use super::GridPos; use crate::block::Rotation; pub(crate) use crate::utils::*; use crate::Map; +use fimg::BlendingOverlay; + include!(concat!(env!("OUT_DIR"), "/full.rs")); include!(concat!(env!("OUT_DIR"), "/quar.rs")); include!(concat!(env!("OUT_DIR"), "/eigh.rs")); @@ -140,17 +142,7 @@ impl Renderable for Schematic { unsafe { bg.overlay(&canvas) }; } else { canvas.as_mut().shadow(); - // this is a slow imageops::overlay style overlay (blending etc) - for x in 0..canvas.width() { - for y in 0..canvas.height() { - // canvas has a shadow - let p2 = unsafe { canvas.pixel(x, y) }; - let p = unsafe { bg.pixel_mut(x, y) }; - let mut p3 = [p[0], p[1], p[2], 255]; - crate::utils::image::blend(&mut p3, p2); - p.copy_from_slice(&p3[..3]); - } - } + unsafe { bg.overlay_blended(&canvas) }; } bg } diff --git a/mindus/src/utils/image/mod.rs b/mindus/src/utils/image/mod.rs index f82c2b1..6f80a86 100644 --- a/mindus/src/utils/image/mod.rs +++ b/mindus/src/utils/image/mod.rs @@ -62,40 +62,3 @@ impl ImageUtils for Image<&mut [u8], 4> { self } } -use umath::FFloat; -pub fn blend(bg: &mut [u8; 4], fg: [u8; 4]) { - if fg[3] == 0 { - return; - } - if fg[3] == 255 { - *bg = fg; - return; - } - #[allow(clippy::multiple_unsafe_ops_per_block)] - // SAFETY: no u8 can possibly become INF / NAN - unsafe { - let max = FFloat::new(255.0); - let bg_a = FFloat::new(bg[3] as f32) / max; - let fg_a = FFloat::new(fg[3] as f32) / max; - let a = bg_a + fg_a - bg_a * fg_a; - if a == 0.0 { - return; - }; - // could turn it into array::map - *bg = [ - *(max - * ((((FFloat::new(fg[0] as f32) / max) * fg_a) - + ((FFloat::new(bg[0] as f32) / max) * bg_a) * (FFloat::new(1.0) - fg_a)) - / a)) as u8, - *(max - * ((((FFloat::new(fg[1] as f32) / max) * fg_a) - + ((FFloat::new(bg[1] as f32) / max) * bg_a) * (FFloat::new(1.0) - fg_a)) - / a)) as u8, - *(max - * ((((FFloat::new(fg[2] as f32) / max) * fg_a) - + ((FFloat::new(bg[2] as f32) / max) * bg_a) * (FFloat::new(1.0) - fg_a)) - / a)) as u8, - *(max * a) as u8, - ] - } -} |