소스 검색

LibGfx/JBIG2: Reject unimplemented combination operators

In practice, everything uses white backgrounds and operators `or`
or `xor` to turn them black, at least for the simple images we're
about to be able to decode.

To make sure we don't forget implementing this for real once needed,
reject other ops, and also reject black backgrounds (because 1 | 0
is 1, not 0 like our overwrite implementation will produce).

This means we have to remove a test, but since this scenario doesn't
seem to happen in practice, that seems ok.
Nico Weber 1 년 전
부모
커밋
b0c73d1652
2개의 변경된 파일7개의 추가작업 그리고 11개의 파일을 삭제
  1. 0 11
      Tests/LibGfx/TestImageDecoder.cpp
  2. 7 0
      Userland/Libraries/LibGfx/ImageFormats/JBIG2Loader.cpp

+ 0 - 11
Tests/LibGfx/TestImageDecoder.cpp

@@ -325,17 +325,6 @@ TEST_CASE(test_jbig2_size)
     EXPECT_EQ(plugin_decoder->size(), Gfx::IntSize(399, 400));
 }
 
-TEST_CASE(test_jbig2_black_47x23)
-{
-    auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("jbig2/black_47x23.jbig2"sv)));
-    EXPECT(Gfx::JBIG2ImageDecoderPlugin::sniff(file->bytes()));
-    auto plugin_decoder = TRY_OR_FAIL(Gfx::JBIG2ImageDecoderPlugin::create(file->bytes()));
-
-    auto frame = TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 47, 23 }));
-    for (auto pixel : *frame.image)
-        EXPECT_EQ(pixel, Gfx::Color(Gfx::Color::Black).value());
-}
-
 TEST_CASE(test_jbig2_white_47x23)
 {
     auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("jbig2/white_47x23.jbig2"sv)));

+ 7 - 0
Userland/Libraries/LibGfx/ImageFormats/JBIG2Loader.cpp

@@ -846,6 +846,11 @@ static ErrorOr<void> decode_immediate_generic_region(JBIG2LoadingContext& contex
         || information_field.y_location + information_field.height > (u32)context.page.size.height()) {
         return Error::from_string_literal("JBIG2ImageDecoderPlugin: Region bounds outsize of page bounds");
     }
+    if (information_field.external_combination_operator() != RegionSegmentInformationField::CombinationOperator::Or
+        && information_field.external_combination_operator() != RegionSegmentInformationField::CombinationOperator::Xor
+        && information_field.external_combination_operator() != RegionSegmentInformationField::CombinationOperator::Replace)
+        return Error::from_string_literal("JBIG2ImageDecoderPlugin: Cannot handle external combination operator other than OR, XOR, and REPLACE yet");
+
     for (size_t y = 0; y < information_field.height; ++y) {
         for (size_t x = 0; x < information_field.width; ++x) {
             // FIXME: Honor segment's combination operator instead of just copying.
@@ -904,6 +909,8 @@ static ErrorOr<void> decode_page_information(JBIG2LoadingContext& context, Segme
     context.page.bits = TRY(BitBuffer::create(page_information.bitmap_width, height));
 
     // "3) Fill the page buffer with the page's default pixel value."
+    if (default_color == 1)
+        return Error::from_string_literal("JBIG2ImageDecoderPlugin: Can only handle white default color for now");
     context.page.bits->fill(default_color != 0);
 
     return {};