From 9faa0360a57fb2a3f5fce255ca51c83a54700dbe Mon Sep 17 00:00:00 2001 From: awxkee Date: Mon, 22 Jul 2024 18:38:19 +0100 Subject: [PATCH] Up colorutils, some improvements --- Cargo.lock | 193 ++++-------------------------- Cargo.toml | 4 +- src/lib/Cargo.toml | 6 +- src/lib/fast_gaussian.rs | 15 +-- src/lib/median_blur.rs | 4 +- src/lib/sse/fast_gaussian_next.rs | 10 +- src/main.rs | 28 ++--- 7 files changed, 59 insertions(+), 201 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ebdb22..7e17f20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -148,13 +148,12 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.1" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "907d8581360765417f8f2e0e7d602733bbed60156b4465b7617243689ef9b83d" +checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" dependencies = [ "jobserver", "libc", - "once_cell", ] [[package]] @@ -173,26 +172,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "clang" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c044c781163c001b913cd018fc95a628c50d0d2dfea8bca77dad71edb16e37" -dependencies = [ - "clang-sys", - "libc", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", -] - [[package]] name = "clap" version = "2.34.0" @@ -212,9 +191,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorutils-rs" -version = "0.4.13" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08db9a0e25441c6250724934d84fd943125768dcd92d925ab9eb902296b136e4" +checksum = "cab673f9f878bd331eb0e14a8d7bdf780ac086391b0a8fe9582ca52140f1834f" dependencies = [ "erydanos", "half 2.4.1", @@ -317,12 +296,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - [[package]] name = "either" version = "1.13.0" @@ -337,9 +310,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erydanos" -version = "0.2.3" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a140744bdb5b8777d9714a8d6a72c5e58d4eb2b0c3c8a85c8bada86efd9fa21" +checksum = "7698f0188aee8ace013304cf8604616f6ad8ea6c9647b025a3cebd6bea5a8acb" dependencies = [ "num-traits", ] @@ -369,7 +342,6 @@ dependencies = [ "half 2.4.1", "image", "libblur", - "opencv", "rayon", ] @@ -422,12 +394,6 @@ dependencies = [ "weezl", ] -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - [[package]] name = "half" version = "1.8.3" @@ -491,12 +457,12 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d730b085583c4d789dfd07fdcf185be59501666a90c97c40162b37e4fdad272d" +checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" dependencies = [ "byteorder-lite", - "thiserror", + "quick-error", ] [[package]] @@ -588,7 +554,7 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libblur" -version = "0.13.0" +version = "0.13.1" dependencies = [ "colorutils-rs", "erydanos", @@ -762,52 +728,12 @@ version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" -[[package]] -name = "opencv" -version = "0.92.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e19ccfa4237826b2213bda6dd30875b9ed184c5318ec64d3c269132d128212c" -dependencies = [ - "cc", - "dunce", - "jobserver", - "libc", - "num-traits", - "once_cell", - "opencv-binding-generator", - "pkg-config", - "semver", - "shlex", - "vcpkg", - "windows", -] - -[[package]] -name = "opencv-binding-generator" -version = "0.90.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ddd32f38d5cd32c79a38da363528ced3149a48f1e686b7a12913a184a84cd5" -dependencies = [ - "clang", - "clang-sys", - "dunce", - "once_cell", - "percent-encoding", - "regex", -] - [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - [[package]] name = "pkg-config" version = "0.3.30" @@ -1044,9 +970,9 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rgb" -version = "0.8.44" +version = "0.8.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aee83dc281d5a3200d37b299acd13b81066ea126a7f16f0eae70fc9aed241d9" +checksum = "ade4539f42266ded9e755c605bdddf546242b2c961b03b06a7375260788a0523" dependencies = [ "bytemuck", ] @@ -1072,12 +998,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - [[package]] name = "serde" version = "1.0.204" @@ -1128,12 +1048,6 @@ dependencies = [ "serde", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "simd-adler32" version = "0.3.7" @@ -1166,9 +1080,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.70" +version = "2.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" dependencies = [ "proc-macro2", "quote", @@ -1205,18 +1119,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", @@ -1246,9 +1160,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" dependencies = [ "serde", "serde_spanned", @@ -1267,9 +1181,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.15" +version = "0.22.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1" +checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" dependencies = [ "indexmap", "serde", @@ -1301,12 +1215,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version-compare" version = "0.2.0" @@ -1430,59 +1338,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" -dependencies = [ - "windows-core", - "windows-targets", -] - -[[package]] -name = "windows-core" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", - "windows-targets", -] - -[[package]] -name = "windows-implement" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -1558,9 +1413,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +checksum = "374ec40a2d767a3c1b4972d9475ecd557356637be906f2cb3f7fe17a6eb5e22f" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index ae1a346..2306c48 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ name = "fast-blur" path = "src/main.rs" [dependencies] -colorutils-rs = "0.4.13" +colorutils-rs = "0.5.2" half = "2.4.1" image = "0.25.1" libblur = {path = "src/lib"} @@ -19,7 +19,7 @@ rayon = "1.10.0" [dev-dependencies] criterion = "0.3" -opencv = { version = "0.92.0", default-features = false, features = ["imgcodecs", "imgproc"] } +#opencv = { version = "0.92.0", default-features = false, features = ["imgcodecs", "imgproc"] } [[bench]] name = "gauss_bench" diff --git a/src/lib/Cargo.toml b/src/lib/Cargo.toml index 6a9e60e..1092403 100644 --- a/src/lib/Cargo.toml +++ b/src/lib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libblur" -version = "0.13.0" +version = "0.13.1" edition = "2021" description = "Fast image blurring in pure Rust" readme = "../../README.md" @@ -19,8 +19,8 @@ edition = "2021" path = "lib.rs" [dependencies] -colorutils-rs = "0.4.13" -erydanos = "0.2.3" +colorutils-rs = "0.5.2" +erydanos = "0.2.9" half = { version = "2.4.1", features = ["num-traits"] } num-traits = "0.2.18" rayon = "1.10.0" diff --git a/src/lib/fast_gaussian.rs b/src/lib/fast_gaussian.rs index b0454ec..4e2aac9 100644 --- a/src/lib/fast_gaussian.rs +++ b/src/lib/fast_gaussian.rs @@ -25,6 +25,14 @@ // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +use colorutils_rs::linear_to_planar::linear_to_plane; +use colorutils_rs::planar_to_linear::plane_to_linear; +use colorutils_rs::{ + linear_to_rgb, linear_to_rgba, rgb_to_linear, rgba_to_linear, TransferFunction, +}; +use num_traits::cast::FromPrimitive; +use num_traits::{AsPrimitive, Float}; + use crate::channels_configuration::FastBlurChannels; use crate::edge_mode::reflect_index; #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] @@ -41,13 +49,6 @@ use crate::threading_policy::ThreadingPolicy; use crate::to_storage::ToStorage; use crate::unsafe_slice::UnsafeSlice; use crate::{clamp_edge, reflect_101, EdgeMode}; -use colorutils_rs::linear_to_planar::linear_to_plane; -use colorutils_rs::planar_to_linear::plane_to_linear; -use colorutils_rs::{ - linear_to_rgb, linear_to_rgba, rgb_to_linear, rgba_to_linear, TransferFunction, -}; -use num_traits::cast::FromPrimitive; -use num_traits::{AsPrimitive, Float}; const BASE_RADIUS_I64_CUTOFF: u32 = 180; diff --git a/src/lib/median_blur.rs b/src/lib/median_blur.rs index 5d5fe3e..0559ba3 100644 --- a/src/lib/median_blur.rs +++ b/src/lib/median_blur.rs @@ -173,7 +173,9 @@ fn median_filter(x: [i32; 256], n: i32) -> i32 { let mut n = n / 2; let mut i = 0i64; while i < 256 && i >= 0 { - n -= x[i as usize]; + unsafe { + n -= *x.get_unchecked(i as usize); + } if n > 0 { i += 1; } else { diff --git a/src/lib/sse/fast_gaussian_next.rs b/src/lib/sse/fast_gaussian_next.rs index c988009..bb638fd 100644 --- a/src/lib/sse/fast_gaussian_next.rs +++ b/src/lib/sse/fast_gaussian_next.rs @@ -61,8 +61,8 @@ pub fn fast_gaussian_next_vertical_pass_sse_u8< let f_weight = unsafe { _mm_set1_ps(weight) }; for x in start..std::cmp::min(width, end) { let mut diffs = unsafe { _mm_setzero_si128() }; - let mut ders = unsafe { _mm_setzero_si128() }; - let mut summs = unsafe { _mm_setzero_si128() }; + let mut ders = unsafe { _mm_setzero_si128() }; + let mut summs = unsafe { _mm_setzero_si128() }; let start_y = 0 - 3 * radius as i64; for y in start_y..height_wide { @@ -185,9 +185,9 @@ pub(crate) fn fast_gaussian_next_horizontal_pass_sse_u8< let weight = 1.0f32 / ((radius as f32) * (radius as f32) * (radius as f32)); let f_weight = unsafe { _mm_set1_ps(weight) }; for y in start..std::cmp::min(height, end) { - let mut diffs = unsafe { _mm_setzero_si128() }; - let mut ders = unsafe { _mm_setzero_si128() }; - let mut summs = unsafe { _mm_setzero_si128() }; + let mut diffs = unsafe { _mm_setzero_si128() }; + let mut ders = unsafe { _mm_setzero_si128() }; + let mut summs = unsafe { _mm_setzero_si128() }; let current_y = ((y as i64) * (stride as i64)) as usize; diff --git a/src/main.rs b/src/main.rs index edc73a2..56e6c3d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -192,18 +192,18 @@ fn main() { // FastBlurChannels::Channels3, // ThreadingPolicy::Single, // ); - // libblur::fast_gaussian_in_linear( - // &mut dst_bytes, - // stride as u32, - // dimensions.0, - // dimensions.1, - // 168, - // FastBlurChannels::Channels3, - // ThreadingPolicy::Single, - // TransferFunction::Srgb, - // EdgeMode::Reflect, - // ); - // + libblur::fast_gaussian_in_linear( + &mut dst_bytes, + stride as u32, + dimensions.0, + dimensions.1, + 25, + FastBlurChannels::Channels3, + ThreadingPolicy::Single, + TransferFunction::Srgb, + EdgeMode::Reflect, + ); + // libblur::gaussian_blur( // &bytes, // stride as u32, @@ -218,7 +218,7 @@ fn main() { // ThreadingPolicy::Single, // ); - dst_bytes = perform_planar_pass_3(&bytes, dimensions.0 as usize, dimensions.1 as usize); + // dst_bytes = perform_planar_pass_3(&bytes, dimensions.0 as usize, dimensions.1 as usize); let elapsed_time = start_time.elapsed(); // Print the elapsed time in milliseconds @@ -256,7 +256,7 @@ fn main() { if components == 3 { image::save_buffer( - "blurred_stack_cpu.jpg", + "blurred_stack_oklab.jpg", bytes.as_bytes(), dimensions.0, dimensions.1,