Browse Source

LibGfx/TIFF: Support bilevel images missing baseline tags

Bilevel images are not required to have a BitsPerSample or a
SamplesPerPixel tag.
Lucas CHOLLET 1 year ago
parent
commit
3c138b9580
1 changed files with 15 additions and 11 deletions
  1. 15 11
      Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp

+ 15 - 11
Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp

@@ -108,20 +108,22 @@ public:
         if (!m_metadata.rows_per_strip().has_value() && segment_byte_counts()->size() != 1 && !is_tiled())
             return Error::from_string_literal("TIFFImageDecoderPlugin: RowsPerStrip is not provided and impossible to deduce");
 
-        if (!m_metadata.bits_per_sample().has_value())
-            return Error::from_string_literal("TIFFImageDecoderPlugin: Tag BitsPerSample is missing");
+        if (!is_bilevel(*m_metadata.photometric_interpretation())) {
+            if (!m_metadata.bits_per_sample().has_value())
+                return Error::from_string_literal("TIFFImageDecoderPlugin: Tag BitsPerSample is missing");
 
-        if (!m_metadata.samples_per_pixel().has_value())
-            return Error::from_string_literal("TIFFImageDecoderPlugin: Tag SamplesPerPixel is missing");
+            if (!m_metadata.samples_per_pixel().has_value())
+                return Error::from_string_literal("TIFFImageDecoderPlugin: Tag SamplesPerPixel is missing");
 
-        if (any_of(*m_metadata.bits_per_sample(), [](auto bit_depth) { return bit_depth == 0 || bit_depth > 32; }))
-            return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid value in BitsPerSample");
+            if (any_of(*m_metadata.bits_per_sample(), [](auto bit_depth) { return bit_depth == 0 || bit_depth > 32; }))
+                return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid value in BitsPerSample");
 
-        if (m_metadata.bits_per_sample()->size() != m_metadata.samples_per_pixel())
-            return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid number of values in BitsPerSample");
+            if (m_metadata.bits_per_sample()->size() != m_metadata.samples_per_pixel())
+                return Error::from_string_literal("TIFFImageDecoderPlugin: Invalid number of values in BitsPerSample");
 
-        if (*m_metadata.samples_per_pixel() < samples_for_photometric_interpretation())
-            return Error::from_string_literal("TIFFImageDecoderPlugin: Not enough values in BitsPerSample for given PhotometricInterpretation");
+            if (*m_metadata.samples_per_pixel() < samples_for_photometric_interpretation())
+                return Error::from_string_literal("TIFFImageDecoderPlugin: Not enough values in BitsPerSample for given PhotometricInterpretation");
+        }
 
         return {};
     }
@@ -132,6 +134,8 @@ public:
             m_photometric_interpretation = m_metadata.photometric_interpretation().value();
         if (m_metadata.bits_per_sample().has_value())
             m_bits_per_sample = m_metadata.bits_per_sample().value();
+        else if (is_bilevel(m_photometric_interpretation))
+            m_bits_per_sample.append(1);
         if (m_metadata.image_width().has_value())
             m_image_width = m_metadata.image_width().value();
         if (m_metadata.predictor().has_value())
@@ -391,7 +395,7 @@ private:
     {
         // Section 8: Baseline Field Reference Guide
         // BitsPerSample must be 1, since this type of compression is defined only for bilevel images.
-        if (m_metadata.bits_per_sample()->size() > 1)
+        if (m_bits_per_sample.size() > 1)
             return Error::from_string_literal("TIFFImageDecoderPlugin: CCITT image with BitsPerSample greater than one");
         if (!is_bilevel(*m_metadata.photometric_interpretation()))
             return Error::from_string_literal("TIFFImageDecoderPlugin: CCITT compression is used on a non bilevel image");