From a1255cb6c9f4d53fea8ae491da314edfabbeb108 Mon Sep 17 00:00:00 2001 From: Nicolas Ramz Date: Fri, 12 Jan 2024 18:26:52 +0100 Subject: [PATCH] LibGfx/ILBMLoader: Don't decode bits once full row has been decoded We were potentially decoding more bits than needed: this could trash the next lines if decoder didn't zero the extra bits. --- Tests/LibGfx/TestImageDecoder.cpp | 11 +++++++++++ Tests/LibGfx/test-inputs/ilbm/small-24bit.iff | Bin 0 -> 678 bytes .../Libraries/LibGfx/ImageFormats/ILBMLoader.cpp | 4 +++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Tests/LibGfx/test-inputs/ilbm/small-24bit.iff diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index ffd47e6a3e..6c475bf8ca 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -254,6 +254,17 @@ TEST_CASE(test_brush_transparent_color) EXPECT_EQ(frame.image->get_pixel(114, 103), Gfx::Color::NamedColor::Black); } +TEST_CASE(test_small_24bit) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("ilbm/small-24bit.iff"sv))); + EXPECT(Gfx::ILBMImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::ILBMImageDecoderPlugin::create(file->bytes())); + + auto frame = TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 10, 10 })); + + EXPECT_EQ(frame.image->get_pixel(0, 4), Gfx::Color(1, 0, 1, 255)); +} + TEST_CASE(test_ilbm_malformed_header) { Array test_inputs = { diff --git a/Tests/LibGfx/test-inputs/ilbm/small-24bit.iff b/Tests/LibGfx/test-inputs/ilbm/small-24bit.iff new file mode 100644 index 0000000000000000000000000000000000000000..39580314bc541a9037ef17da8a852a369d1af4dc GIT binary patch literal 678 zcmZ?s5AtPTV4COY*2z{z#ziF#lXeDz`!8Ez{tSBzzyPYIXn8gGcYi)fW)2r zT_PD6n6eoC4=^rZV7$P2W}LP~+uG%$d;?{6_0Nii}= zfz&@>U_2lNLJU%j|F8dNKtM(Y1x5xAMh1od3}6Bx!}$L?BLfG74Ivr#AAm4GB*;_- z1x5!BMg}X8J}X8BDUkSo2FCrD7#)Nd8HB)wLKtB3^8rR4xU~@dV4YwBq5bm>Mj4Q! zLBbM@3=&|KQjF*CGYY_UgXCb&MRzk3#2FBh@jr%}L3%Nqe1cH`W+w;O-5?(0`vXXJ zg53eO6kYfG17JCr{~5q~t1&DF#Rx`V#b07<1gVEQ7owLqNB=(rww8;LK>&t8CNcg$ z5Aq^Eh!A3AkY{9&2Qk?h8LSu?co`XV!HVU<0nYgUHkc>E$RNVVzz9|?$H<@n05f%^ A>Hq)$ literal 0 HcmV?d00001 diff --git a/Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp index e89f6bff24..1b10f91978 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp @@ -220,7 +220,9 @@ static ErrorOr planar_to_chunky(ReadonlyBytes bitplanes, ILBMLoading u8 bit = bitplanes[offset_base + i]; u8 rgb_shift = p / 8; - for (u8 b = 0; b < 8; b++) { + // Some encoders don't pad bytes rows with 0: make sure we stop + // when enough data for current bitplane row has been read + for (u8 b = 0; b < 8 && (i * 8) + b < width; b++) { u8 mask = 1 << (7 - b); // get current plane if (bit & mask) {