diff --git a/CHANGELOG.md b/CHANGELOG.md index ab5c1e6..1902f9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ ## [Unreleased] - ReleaseDate +### Fixed + +- [#50](https://github.com/embedded-graphics/tinybmp/pull/50) Fixed handling of padding bytes in absolute mode for RLE4 compressed files. + ### Changed - **(breaking)** [#49](https://github.com/embedded-graphics/tinybmp/pull/41) Use 1.81 as the MSRV. diff --git a/src/raw_iter.rs b/src/raw_iter.rs index de572b7..458e3a3 100644 --- a/src/raw_iter.rs +++ b/src/raw_iter.rs @@ -413,13 +413,14 @@ impl<'a> Iterator for Rle4Pixels<'a> { // Delta encoding is unsupported. return None; } - _ => { + num_pixels => { + let num_bytes = num_pixels.div_ceil(2); // Absolute mode self.rle_state = RleState::Absolute { remaining: param.saturating_sub(1), is_odd: (param % 2) != 0, // padding if the number of *bytes* is odd - has_padding: ((param >> 1) % 2) != 0, + has_padding: num_bytes & 1 != 0, }; } } diff --git a/tests/embedded_graphics.rs b/tests/embedded_graphics.rs index 11e94c9..21d7b0a 100644 --- a/tests/embedded_graphics.rs +++ b/tests/embedded_graphics.rs @@ -1,7 +1,7 @@ use embedded_graphics::{ - image::Image, + image::{Image, ImageRawLE}, mock_display::{ColorMapping, MockDisplay}, - pixelcolor::{Gray8, Rgb555, Rgb565, Rgb888}, + pixelcolor::{Bgr888, Gray8, Rgb555, Rgb565, Rgb888}, prelude::*, primitives::Rectangle, }; @@ -149,3 +149,21 @@ fn issue_8_height_is_negative() { bottom_up_display.assert_pattern(&["WK", "KK"]); top_down_display.assert_eq(&bottom_up_display); } + +/// Test for PR #50 +#[test] +fn pr_50_rle4_padding() { + let bmp = Bmp::::from_slice(include_bytes!("pr_50_rle4_padding.bmp")).unwrap(); + let raw = ImageRawLE::::new(include_bytes!("pr_50_rle4_padding.raw"), 20); + + assert_eq!(raw.size(), Size::new(20, 20)); + assert_eq!(bmp.size(), Size::new(20, 20)); + + let mut display_bmp = MockDisplay::new(); + let mut display_raw = MockDisplay::new(); + + bmp.draw(&mut display_bmp).unwrap(); + raw.draw(&mut display_raw).unwrap(); + + display_bmp.assert_eq(&display_raw); +} diff --git a/tests/pr_50_rle4_padding.bmp b/tests/pr_50_rle4_padding.bmp new file mode 100644 index 0000000..9371eb1 Binary files /dev/null and b/tests/pr_50_rle4_padding.bmp differ diff --git a/tests/pr_50_rle4_padding.raw b/tests/pr_50_rle4_padding.raw new file mode 100644 index 0000000..dc6ac43 Binary files /dev/null and b/tests/pr_50_rle4_padding.raw differ