From b8f8b22aa57b4b6c651dba1527ebe9b45f7ddcfe Mon Sep 17 00:00:00 2001 From: Nicolas Ramz Date: Mon, 11 Sep 2023 10:46:15 +0200 Subject: [PATCH] LibGfx/ILBM: Add support for uncompressed files --- Tests/LibGfx/TestImageDecoder.cpp | 15 ++++++++++++++- .../test-inputs/ilbm/gradient-uncompressed.iff | Bin 0 -> 24104 bytes .../LibGfx/ImageFormats/ILBMLoader.cpp | 14 +++++++------- 3 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 Tests/LibGfx/test-inputs/ilbm/gradient-uncompressed.iff diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index bb5a294425..f36a6afe35 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -95,7 +95,20 @@ TEST_CASE(test_ilbm) EXPECT(Gfx::ILBMImageDecoderPlugin::sniff(file->bytes())); auto plugin_decoder = MUST(Gfx::ILBMImageDecoderPlugin::create(file->bytes())); - expect_single_frame_of_size(*plugin_decoder, { 320, 200 }); + auto frame = expect_single_frame_of_size(*plugin_decoder, { 320, 200 }); + + EXPECT_EQ(frame.image->get_pixel(8, 0), Gfx::Color(0xee, 0xbb, 0, 255)); +} + +TEST_CASE(test_ilbm_uncompressed) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("ilbm/gradient-uncompressed.iff"sv))); + EXPECT(Gfx::ILBMImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = MUST(Gfx::ILBMImageDecoderPlugin::create(file->bytes())); + + auto frame = expect_single_frame_of_size(*plugin_decoder, { 320, 200 }); + + EXPECT_EQ(frame.image->get_pixel(8, 0), Gfx::Color(0xee, 0xbb, 0, 255)); } TEST_CASE(test_jpeg_sof0_one_scan) diff --git a/Tests/LibGfx/test-inputs/ilbm/gradient-uncompressed.iff b/Tests/LibGfx/test-inputs/ilbm/gradient-uncompressed.iff new file mode 100644 index 0000000000000000000000000000000000000000..ef77add5b00394c5af3de8ea36e7cf6373db1e23 GIT binary patch literal 24104 zcmZ?s5AtPTh*R+Naq@NY^>ATeU=U$+U^v0Rz`(%Fz|g?Jpko5!JNr5YFfcGkoH=ub zfq~)w|Nk8w9jlZW?uIhF+s(kx!QkxZ>(0Qyz{0>Nz~B<#sQ_l1Fz7h>yF@ZD#2x^d zM-*=80D~2)u!2|bz~JA124d9_Whsgx2Ny612@Sn^7YzRXM*t+1#HvHmf|aSDq_haD zXTgHIcJKcE|Nnmm1_ol)VYLLWpn#xYU?>=rmY07=cot$WLMyTA5IQhf9N_5f=mL8V zgIEWS-goc+GZ3o|(*{B!Ea2#MaSaWP1xN4Q`$#@U(oC#6BrRB(OiD^x7#@WStlqtQ zKO~%qRfp9Qyn>8^f}-H)4Gk|ZuSfDNI9(yM5~~iO1CvE;z9d#1rVWHdh|QP8sv~3{ zvH6l%b%gB0lqWV{;#Y^7F#i9+vWH-$5eDFV2`-_D$iFz%5oa&4`I1<5q{lBbUj`6a|Ke0f zoPUY0SBcHP#M+C9UvRzz#~Ts#FHUvD*-LD_N~}84<99UwBGtf%M8LqnfIpuT7r(^j zOJdcL9>1gc7gzk^&*#L&FR}TOSaqbw?`ZzT6~CkT7alSU#HTA_>s4aa5tomU3ts&B z5}^{mI^yglHeV8}j`(nf`C~Ny!c!@>{x7(Fg{_@UT>KJSuM(?{^!OdEe{sd{X#RzV z3<>2kvHegG9Eh%uh|QP8svFI}i1HN|3xBtAT7fa@*d(lY}CvF&1F)e&niBI@wxOJda#XD_k&l2~=4 z`4PU~@(e^XE6atq+i1@{y&xwm)V)G@j>PU~@(fSux z{Ep^dc*qdlUl^@_k=N&tvwo7easyEcjpko?Dn%=wNAoW{WJdEZj&*Lt)~m#-8?Ap4 zB@-?d{(Onhgi9>1gQXLu=uRz8ompWz`xLitSWx(s5~5tok;xsuSh z6hh@_{v{`Vi5-_BRvqc_i$7l?;upU<;_M~1UL{r?>E-ii`x%}}(aPu1{0k2m63S;{ z^ChwBh|5QaTuEqMGeYHP{v{`ViLFM$%IC_rq!Bvu_h3yIB_#Hzz*7k0VP{0mQ|Xz6q`|H4BC zd(y!wN^HI)RvlJL@Cp)}FNsx$&oW~3C9&%8*@azhH2=a=>1h6SA$-mb_EdxrB{p9Y zs}5l@u`FWqC9&%8*-LD`Bvu_hyRgfR=HJo$3rZQp_LD(s@nK@~C9&%8*@az>*nCN> zI_$PUM2XFp#HxdsN(woee@F8#D7}p4UtH+`6gs#tvH6l%b-3)oEk2rmamCwc{}&!I zxRVct46*epvFb1^ASgg=y-KV)d=?U$FNsx$&o1n8qxlz}N=N&@qy1kvKqxlySWndB|tVZi!aF~DylyJe%A+}y6RvmuZu*nizui{Y$0P^DL0{{R3 literal 0 HcmV?d00001 diff --git a/Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp index 9b2efdd3cc..a448be0500 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp @@ -193,17 +193,17 @@ static ErrorOr decode_body_chunk(Chunk body_chunk, ILBMLoadingContext& con { dbgln_if(ILBM_DEBUG, "decode_body_chunk {}", body_chunk.data.size()); - if (context.bm_header.compression == CompressionType::ByteRun) { - // these are the uncompressed interleaved bitmap planes - auto plane_data = TRY(uncompress_byte_run(body_chunk.data, context)); - // that we need to convert to chunky pixel data - auto pixel_data = TRY(planar_to_chunky(plane_data, context)); + ByteBuffer pixel_data; - context.bitmap = TRY(chunky_to_bitmap(context, pixel_data)); + if (context.bm_header.compression == CompressionType::ByteRun) { + auto plane_data = TRY(uncompress_byte_run(body_chunk.data, context)); + pixel_data = TRY(planar_to_chunky(plane_data, context)); } else { - return Error::from_string_literal("Uncompress body not supported yet"); + pixel_data = TRY(planar_to_chunky(body_chunk.data, context)); } + context.bitmap = TRY(chunky_to_bitmap(context, pixel_data)); + return {}; }