diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock index d05c23a..fa35e51 100644 --- a/fuzz/Cargo.lock +++ b/fuzz/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arbitrary" @@ -26,7 +26,7 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.2" +version = "0.2.0" dependencies = [ "byteorder-lite", "quick-error", diff --git a/src/lossless_transform.rs b/src/lossless_transform.rs index 3ec091b..c6b2e2d 100644 --- a/src/lossless_transform.rs +++ b/src/lossless_transform.rs @@ -350,11 +350,19 @@ pub(crate) fn apply_color_transform( let width = usize::from(width); for (y, row) in image_data.chunks_exact_mut(width * 4).enumerate() { - for (block_x, block) in row.chunks_mut(4 << size_bits).enumerate() { - let block_index = (y >> size_bits) * block_xsize + block_x; - let red_to_blue = transform_data[block_index * 4]; - let green_to_blue = transform_data[block_index * 4 + 1]; - let green_to_red = transform_data[block_index * 4 + 2]; + let row_transform_data_start = (y >> size_bits) * block_xsize * 4; + // the length of block_tf_data should be `block_xsize * 4`, so we could slice it with [..block_xsize * 4] + // but there is no point - `.zip()` runs until either of the iterators is consumed, + // so the extra slicing operation would be doing more work for no reason + let row_tf_data = &transform_data[row_transform_data_start..]; + + for (block, transform) in row + .chunks_mut(4 << size_bits) + .zip(row_tf_data.chunks_exact(4)) + { + let red_to_blue = transform[0]; + let green_to_blue = transform[1]; + let green_to_red = transform[2]; for pixel in block.chunks_exact_mut(4) { let green = u32::from(pixel[1]);