Use GetDecoderArray() in CPDF_DIB.

Use existing code instead of duplicating its functionality.

Change-Id: Id026536f9894874480829782e0623f96763ba632
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/67754
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index ccd7bd5..6b19730 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -384,6 +384,10 @@
 
 bool CPDF_DIB::LoadColorInfo(const CPDF_Dictionary* pFormResources,
                              const CPDF_Dictionary* pPageResources) {
+  Optional<DecoderArray> decoder_array = GetDecoderArray(m_pDict.Get());
+  if (!decoder_array.has_value())
+    return false;
+
   m_bpc_orig = m_pDict->GetIntegerFor("BitsPerComponent");
   if (!IsMaybeValidBitsPerComponent(m_bpc_orig))
     return false;
@@ -392,22 +396,11 @@
     m_bImageMask = true;
 
   if (m_bImageMask || !m_pDict->KeyExist("ColorSpace")) {
-    if (!m_bImageMask) {
-      const CPDF_Object* pFilter = m_pDict->GetDirectObjectFor("Filter");
-      if (pFilter) {
-        ByteString filter;
-        if (pFilter->IsName()) {
-          filter = pFilter->GetString();
-        } else if (const CPDF_Array* pArray = pFilter->AsArray()) {
-          if (!ValidateDecoderPipeline(pArray))
-            return false;
-          filter = pArray->GetStringAt(pArray->size() - 1);
-        }
-
-        if (filter == "JPXDecode") {
-          m_bDoBpcCheck = false;
-          return true;
-        }
+    if (!m_bImageMask && !decoder_array.value().empty()) {
+      const ByteString& filter = decoder_array.value().back().first;
+      if (filter == "JPXDecode") {
+        m_bDoBpcCheck = false;
+        return true;
       }
     }
     m_bImageMask = true;
@@ -444,7 +437,12 @@
     else if (cs == "DeviceCMYK")
       m_nComponents = 4;
   }
-  ValidateDictParam();
+
+  ByteString filter;
+  if (!decoder_array.value().empty())
+    filter = decoder_array.value().back().first;
+
+  ValidateDictParam(filter);
   return GetDecodeAndMaskArray(&m_bDefaultDecode, &m_bColorKey);
 }
 
@@ -925,29 +923,17 @@
   }
 }
 
-void CPDF_DIB::ValidateDictParam() {
+void CPDF_DIB::ValidateDictParam(const ByteString& filter) {
   m_bpc = m_bpc_orig;
-  const CPDF_Object* pFilter = m_pDict->GetDirectObjectFor("Filter");
-  if (pFilter) {
-    if (pFilter->IsName()) {
-      ByteString filter = pFilter->GetString();
-      if (filter == "CCITTFaxDecode" || filter == "JBIG2Decode") {
-        m_bpc = 1;
-        m_nComponents = 1;
-      } else if (filter == "DCTDecode") {
-        m_bpc = 8;
-      }
-    } else if (const CPDF_Array* pArray = pFilter->AsArray()) {
-      ByteString filter = pArray->GetStringAt(pArray->size() - 1);
-      if (filter == "CCITTFaxDecode" || filter == "JBIG2Decode") {
-        m_bpc = 1;
-        m_nComponents = 1;
-      } else if (filter == "DCTDecode") {
-        // Previously, filter == "RunLengthDecode" was checked in the "if"
-        // statement as well, but too many documents don't conform to it.
-        m_bpc = 8;
-      }
-    }
+
+  // Per spec, |m_bpc| should always be 8 for RunLengthDecode, but too many
+  // documents do not conform to it. So skip this check.
+
+  if (filter == "CCITTFaxDecode" || filter == "JBIG2Decode") {
+    m_bpc = 1;
+    m_nComponents = 1;
+  } else if (filter == "DCTDecode") {
+    m_bpc = 8;
   }
 
   if (!IsAllowedBitsPerComponent(m_bpc))
diff --git a/core/fpdfapi/page/cpdf_dib.h b/core/fpdfapi/page/cpdf_dib.h
index f81acb2..91a8305 100644
--- a/core/fpdfapi/page/cpdf_dib.h
+++ b/core/fpdfapi/page/cpdf_dib.h
@@ -102,7 +102,7 @@
                               const uint8_t* src_scan) const;
   bool TranslateScanline24bppDefaultDecode(uint8_t* dest_scan,
                                            const uint8_t* src_scan) const;
-  void ValidateDictParam();
+  void ValidateDictParam(const ByteString& filter);
   void DownSampleScanline1Bit(int orig_Bpp,
                               int dest_Bpp,
                               uint32_t src_width,