Browse Source

LibGfx/ILBM: Add support for uncompressed files

Nicolas Ramz 1 year ago
parent
commit
b8f8b22aa5

+ 14 - 1
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)

BIN
Tests/LibGfx/test-inputs/ilbm/gradient-uncompressed.iff


+ 6 - 6
Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp

@@ -193,17 +193,17 @@ static ErrorOr<void> decode_body_chunk(Chunk body_chunk, ILBMLoadingContext& con
 {
     dbgln_if(ILBM_DEBUG, "decode_body_chunk {}", body_chunk.data.size());
 
+    ByteBuffer pixel_data;
+
     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));
-
-        context.bitmap = TRY(chunky_to_bitmap(context, pixel_data));
+        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 {};
 }