Fixed error in implementation of ImageView::split_by_width(), ImageView::split_by_height(), ImageViewMut::split_by_width_mut() and ImageViewMut::split_by_height_mut()(#46).

This commit is contained in:
Kirill Kuzminykh
2025-02-16 20:32:25 +03:00
parent 52999f0131
commit 0666a2323b
6 changed files with 181 additions and 137 deletions
+10 -1
View File
@@ -1,9 +1,18 @@
## [Unreleased] - ReleaseDate
## Fixed
- Fixed error in implementation of `ImageView::split_by_width()`, `ImageView::split_by_height()`,
`ImageViewMut::split_by_width_mut()` and `ImageViewMut::split_by_height_mut()`
([#46](https://github.com/Cykooz/fast_image_resize/issues/46)).
## [5.1.1] - 2025-01-13
## Fixed
- Fixed error in implementation of `ImageView::split_by_width()`, `ImageView::split_by_height()`,
`ImageViewMut::split_by_width_mut()` and `ImageViewMut::split_by_height_mut()`(#43).
`ImageViewMut::split_by_width_mut()` and `ImageViewMut::split_by_height_mut()`
([#43](https://github.com/Cykooz/fast_image_resize/issues/43)).
## [5.1.0] - 2024-12-09
Generated
+82 -80
View File
@@ -80,17 +80,18 @@ version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
dependencies = [
"windows-sys 0.59.0",
"windows-sys",
]
[[package]]
name = "anstyle-wincon"
version = "3.0.6"
version = "3.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
dependencies = [
"anstyle",
"windows-sys 0.59.0",
"once_cell",
"windows-sys",
]
[[package]]
@@ -165,9 +166,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.7.0"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be"
checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
[[package]]
name = "bitstream-io"
@@ -196,15 +197,15 @@ dependencies = [
[[package]]
name = "built"
version = "0.7.5"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b"
checksum = "73848a43c5d63a1251d17adf6c2bf78aa94830e60a335a95eeea45d6ba9e1e4d"
[[package]]
name = "bumpalo"
version = "3.16.0"
version = "3.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
[[package]]
name = "bytemuck"
@@ -232,9 +233,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]]
name = "cc"
version = "1.2.9"
version = "1.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b"
checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9"
dependencies = [
"jobserver",
"libc",
@@ -326,9 +327,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.26"
version = "4.5.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783"
checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184"
dependencies = [
"clap_builder",
"clap_derive",
@@ -346,9 +347,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.26"
version = "4.5.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121"
checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9"
dependencies = [
"anstream",
"anstyle",
@@ -358,9 +359,9 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.24"
version = "4.5.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c"
checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed"
dependencies = [
"heck",
"proc-macro2",
@@ -394,9 +395,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpufeatures"
version = "0.2.16"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
"libc",
]
@@ -471,9 +472,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crunchy"
version = "0.2.2"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
[[package]]
name = "crypto-common"
@@ -503,9 +504,9 @@ dependencies = [
[[package]]
name = "document-features"
version = "0.2.10"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0"
checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d"
dependencies = [
"litrs",
]
@@ -541,9 +542,9 @@ dependencies = [
[[package]]
name = "equivalent"
version = "1.0.1"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "exr"
@@ -655,7 +656,7 @@ version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757"
dependencies = [
"bitflags 2.7.0",
"bitflags 2.8.0",
"ignore",
"walkdir",
]
@@ -783,9 +784,9 @@ checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408"
[[package]]
name = "indexmap"
version = "2.7.0"
version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
dependencies = [
"equivalent",
"hashbrown",
@@ -804,13 +805,13 @@ dependencies = [
[[package]]
name = "is-terminal"
version = "0.4.13"
version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b"
checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37"
dependencies = [
"hermit-abi",
"libc",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -869,9 +870,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
[[package]]
name = "js-sys"
version = "0.3.76"
version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7"
checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -897,9 +898,9 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
[[package]]
name = "libfuzzer-sys"
version = "0.4.8"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa"
checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75"
dependencies = [
"arbitrary",
"cc",
@@ -929,9 +930,9 @@ checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
[[package]]
name = "log"
version = "0.4.22"
version = "0.4.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
[[package]]
name = "loop9"
@@ -966,9 +967,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
version = "0.8.2"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394"
checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b"
dependencies = [
"adler2",
"simd-adler32",
@@ -986,7 +987,7 @@ version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
dependencies = [
"bitflags 2.7.0",
"bitflags 2.8.0",
"cfg-if",
"cfg_aliases",
"libc",
@@ -1060,9 +1061,9 @@ dependencies = [
[[package]]
name = "once_cell"
version = "1.20.2"
version = "1.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
[[package]]
name = "oorandom"
@@ -1417,10 +1418,16 @@ dependencies = [
]
[[package]]
name = "ryu"
version = "1.0.18"
name = "rustversion"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
[[package]]
name = "ryu"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
[[package]]
name = "same-file"
@@ -1453,9 +1460,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.135"
version = "1.0.138"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9"
checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949"
dependencies = [
"itoa",
"memchr",
@@ -1522,9 +1529,9 @@ dependencies = [
[[package]]
name = "smallvec"
version = "1.13.2"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
[[package]]
name = "strsim"
@@ -1534,9 +1541,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "syn"
version = "2.0.96"
version = "2.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
dependencies = [
"proc-macro2",
"quote",
@@ -1655,9 +1662,9 @@ dependencies = [
[[package]]
name = "toml"
version = "0.8.19"
version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148"
dependencies = [
"serde",
"serde_spanned",
@@ -1676,9 +1683,9 @@ dependencies = [
[[package]]
name = "toml_edit"
version = "0.22.22"
version = "0.22.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474"
dependencies = [
"indexmap",
"serde",
@@ -1751,9 +1758,9 @@ dependencies = [
[[package]]
name = "unicode-ident"
version = "1.0.14"
version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034"
[[package]]
name = "utf8parse"
@@ -1802,20 +1809,21 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
version = "0.2.99"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396"
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.99"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79"
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
dependencies = [
"bumpalo",
"log",
@@ -1827,9 +1835,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.99"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe"
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -1837,9 +1845,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.99"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2"
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [
"proc-macro2",
"quote",
@@ -1850,9 +1858,12 @@ dependencies = [
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.99"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
dependencies = [
"unicode-ident",
]
[[package]]
name = "weezl"
@@ -1866,7 +1877,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
"windows-sys 0.59.0",
"windows-sys",
]
[[package]]
@@ -1878,15 +1889,6 @@ dependencies = [
"windows-targets",
]
[[package]]
name = "windows-sys"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-sys"
version = "0.59.0"
@@ -1962,9 +1964,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
version = "0.6.24"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a"
checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603"
dependencies = [
"memchr",
]
+4 -16
View File
@@ -23,10 +23,10 @@ exclude = ["/data"]
cfg-if = "1.0"
num-traits = "0.2.19"
thiserror = "1.0"
document-features = "0.2.10"
document-features = "0.2.11"
# Optional dependencies
image = { version = "0.25.5", optional = true, default-features = false }
bytemuck = { version = "1.20", optional = true }
bytemuck = { version = "1.21", optional = true }
rayon = { version = "1.10", optional = true }
[features]
@@ -43,7 +43,7 @@ only_u8x4 = ["testing/only_u8x4"] # This can be used to experiment with the cra
[dev-dependencies]
fast_image_resize = { path = ".", features = ["for_testing"] }
resize = { version = "0.8.7", default-features = false, features = ["std"] }
resize = { version = "0.8.8", default-features = false, features = ["std"] }
rgb = "0.8.50"
png = "0.17.16"
serde = { version = "1.0", features = ["serde_derive"] }
@@ -64,25 +64,13 @@ libvips = "1.7"
[profile.test]
opt-level = 3
opt-level = 1
incremental = true
# debug builds for deps
[profile.dev.package.'*']
opt-level = 3
debug = false
# Strip debug symbols as they are useless with O3 anyway.
strip = "debuginfo"
# debug builds for procmacros
[profile.dev.build-override]
opt-level = 2 # reasonable optimization
codegen-units = 256 # max threading
# When possible - this is generally scary as some procmacros
# will fail without any feedback.
#debug = false
# release build for procmacros - same config as debug build for procmacros
+28 -16
View File
@@ -80,13 +80,16 @@ pub unsafe trait ImageView: Sync + Send + Sized {
return None;
}
let mut res = Vec::with_capacity(num_parts as usize);
let step = height as f32 / num_parts as f32;
let step = height / num_parts;
let mut modulo = height % num_parts;
let mut top = start_row;
let mut top_f = start_row as f32;
let width = self.width();
for _ in 0..num_parts {
top_f += step;
let part_height = top_f.round() as u32 - top;
let mut part_height = step;
if modulo > 0 {
part_height += 1;
modulo -= 1;
}
let image = TypedCroppedImage::from_ref(self, 0, top, width, part_height).unwrap();
res.push(image);
top += part_height;
@@ -110,13 +113,16 @@ pub unsafe trait ImageView: Sync + Send + Sized {
return None;
}
let mut res = Vec::with_capacity(num_parts as usize);
let step = width as f32 / num_parts as f32;
let step = width / num_parts;
let mut modulo = width % num_parts;
let mut left = start_col;
let mut right_f = start_col as f32;
let height = self.height();
for _ in 0..num_parts {
right_f += step;
let part_width = right_f.round() as u32 - left;
let mut part_width = step;
if modulo > 0 {
part_width += 1;
modulo -= 1;
}
let image = TypedCroppedImage::from_ref(self, left, 0, part_width, height).unwrap();
res.push(image);
left += part_width;
@@ -161,14 +167,17 @@ pub unsafe trait ImageViewMut: ImageView {
return None;
}
let mut res = Vec::with_capacity(num_parts as usize);
let step = height as f32 / num_parts as f32;
let step = height / num_parts;
let mut modulo = height % num_parts;
let mut top = start_row;
let mut top_f = start_row as f32;
let width = self.width();
let unsafe_image = UnsafeImageMut::new(self);
for _ in 0..num_parts {
top_f += step;
let part_height = top_f.round() as u32 - top;
let mut part_height = step;
if modulo > 0 {
part_height += 1;
modulo -= 1;
}
let image = TypedCroppedImageMut::new(unsafe_image.clone(), 0, top, width, part_height)
.unwrap();
res.push(image);
@@ -193,14 +202,17 @@ pub unsafe trait ImageViewMut: ImageView {
return None;
}
let mut res = Vec::with_capacity(num_parts as usize);
let step = width as f32 / num_parts as f32;
let step = width / num_parts;
let mut modulo = width % num_parts;
let mut left = start_col;
let mut right_f = start_col as f32;
let height = self.height();
let unsafe_image = UnsafeImageMut::new(self);
for _ in 0..num_parts {
right_f += step;
let part_width = right_f.round() as u32 - left;
let mut part_width = step;
if modulo > 0 {
part_width += 1;
modulo -= 1;
}
let image =
TypedCroppedImageMut::new(unsafe_image.clone(), left, 0, part_width, height)
.unwrap();
+33 -24
View File
@@ -100,19 +100,22 @@ unsafe impl<'a, P: InnerPixel> ImageView for TypedImageRef<'a, P> {
return None;
}
let mut res = Vec::with_capacity(num_parts as usize);
let step = height as f32 / num_parts as f32;
let row_size = self.width as usize;
let step = height / num_parts;
let mut modulo = height % num_parts;
let mut top = start_row;
let mut bottom_f = start_row as f32;
let row_size = self.width as usize;
let mut remains_pixels = self.pixels.split_at(top as usize * row_size).1;
for _ in 0..num_parts {
bottom_f += step;
let height = bottom_f.round() as u32 - top;
let parts = remains_pixels.split_at(height as usize * row_size);
let image = TypedImageRef::new(self.width, height, parts.0).unwrap();
let mut part_height = step;
if modulo > 0 {
part_height += 1;
modulo -= 1;
}
let parts = remains_pixels.split_at(part_height as usize * row_size);
let image = TypedImageRef::new(self.width, part_height, parts.0).unwrap();
res.push(image);
remains_pixels = parts.1;
top += height;
top += part_height;
}
Some(res)
}
@@ -226,19 +229,22 @@ unsafe impl<'a, P: InnerPixel> ImageView for TypedImage<'a, P> {
return None;
}
let mut res = Vec::with_capacity(num_parts as usize);
let step = height as f32 / num_parts as f32;
let row_size = self.width as usize;
let step = height / num_parts;
let mut modulo = height % num_parts;
let mut top = start_row;
let mut bottom_f = start_row as f32;
let row_size = self.width as usize;
let mut remains_pixels = self.pixels.borrow().split_at(top as usize * row_size).1;
for _ in 0..num_parts {
bottom_f += step;
let height = bottom_f.round() as u32 - top;
let parts = remains_pixels.split_at(height as usize * row_size);
let image = TypedImageRef::new(self.width, height, parts.0).unwrap();
let mut part_height = step;
if modulo > 0 {
part_height += 1;
modulo -= 1;
}
let parts = remains_pixels.split_at(part_height as usize * row_size);
let image = TypedImageRef::new(self.width, part_height, parts.0).unwrap();
res.push(image);
remains_pixels = parts.1;
top += height;
top += part_height;
}
debug_assert!(top - start_row == height);
Some(res)
@@ -272,23 +278,26 @@ unsafe impl<'a, P: InnerPixel> ImageViewMut for TypedImage<'a, P> {
return None;
}
let mut res = Vec::with_capacity(num_parts as usize);
let step = height as f32 / num_parts as f32;
let row_size = self.width as usize;
let step = height / num_parts;
let mut modulo = height % num_parts;
let mut top = start_row;
let mut bottom_f = start_row as f32;
let row_size = self.width as usize;
let mut remains_pixels = self
.pixels
.borrow_mut()
.split_at_mut(top as usize * row_size)
.1;
for _ in 0..num_parts {
bottom_f += step;
let height = bottom_f.round() as u32 - top;
let parts = remains_pixels.split_at_mut(height as usize * row_size);
let image = TypedImage::from_pixels_slice(self.width, height, parts.0).unwrap();
let mut part_height = step;
if modulo > 0 {
part_height += 1;
modulo -= 1;
}
let parts = remains_pixels.split_at_mut(part_height as usize * row_size);
let image = TypedImage::from_pixels_slice(self.width, part_height, parts.0).unwrap();
res.push(image);
remains_pixels = parts.1;
top += height;
top += part_height;
}
debug_assert!(top - start_row == height);
Some(res)
+24
View File
@@ -1043,3 +1043,27 @@ mod u8x4 {
}
}
}
#[cfg(feature = "rayon")]
#[test]
fn split_image_on_different_number_of_parts() {
let src_image = Image::new(2176, 4608, PixelType::U8x4);
let mut dst_image = Image::new(582, 552, src_image.pixel_type());
let options = ResizeOptions::new()
.use_alpha(false)
.resize_alg(ResizeAlg::Convolution(FilterType::Box))
.crop(740.0, 1645.2, 58.200000000000045, 55.299999999999955);
for num in 2..32 {
let mut builder = rayon::ThreadPoolBuilder::new();
builder = builder.num_threads(num);
let pool = builder.build().unwrap();
pool.install(|| {
let mut resizer = Resizer::new();
resizer
.resize(&src_image, &mut dst_image, &options)
.expect("resize failed with {num} threads");
});
}
}