Merge ICC components validation code into CPDF_ColorSpace.

Add CPDF_ColorSpace::IsValidIccComponents() and delete two identical
functions that do the same check.

Change-Id: I6a85baf469573957ea879076f33cda7e1cffd066
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/65790
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index f3011db..fd4a2ad 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -231,7 +231,6 @@
                             uint32_t nExpectedComponents);
   static RetainPtr<CPDF_ColorSpace> GetStockAlternateProfile(
       uint32_t nComponents);
-  static bool IsValidComponents(int32_t nComps);
   static std::vector<float> GetRanges(const CPDF_Dictionary* pDict,
                                       uint32_t nComponents);
 
@@ -579,6 +578,11 @@
   }
 }
 
+// static
+bool CPDF_ColorSpace::IsValidIccComponents(int components) {
+  return components == 1 || components == 3 || components == 4;
+}
+
 std::vector<float> CPDF_ColorSpace::CreateBufAndSetDefaultColor() const {
   ASSERT(m_Family != PDFCS_PATTERN);
 
@@ -915,7 +919,7 @@
   // with Acrobat and reject bad values.
   const CPDF_Dictionary* pDict = pStream->GetDict();
   int32_t nDictComponents = pDict ? pDict->GetIntegerFor("N") : 0;
-  if (!IsValidComponents(nDictComponents))
+  if (!IsValidIccComponents(nDictComponents))
     return 0;
 
   uint32_t nComponents = static_cast<uint32_t>(nDictComponents);
@@ -1000,7 +1004,7 @@
 
   // |nMaxColors| will not overflow since |nComponents| is limited in size.
   const uint32_t nComponents = CountComponents();
-  ASSERT(IsValidComponents(nComponents));
+  ASSERT(IsValidIccComponents(nComponents));
   int nMaxColors = 1;
   for (uint32_t i = 0; i < nComponents; i++)
     nMaxColors *= 52;
@@ -1094,14 +1098,9 @@
 }
 
 // static
-bool CPDF_ICCBasedCS::IsValidComponents(int32_t nComps) {
-  return nComps == 1 || nComps == 3 || nComps == 4;
-}
-
-// static
 std::vector<float> CPDF_ICCBasedCS::GetRanges(const CPDF_Dictionary* pDict,
                                               uint32_t nComponents) {
-  ASSERT(IsValidComponents(nComponents));
+  ASSERT(IsValidIccComponents(nComponents));
 
   std::vector<float> ranges;
   const CPDF_Array* pRanges = pDict->GetArrayFor("Range");
diff --git a/core/fpdfapi/page/cpdf_colorspace.h b/core/fpdfapi/page/cpdf_colorspace.h
index c8751bd..75928d25 100644
--- a/core/fpdfapi/page/cpdf_colorspace.h
+++ b/core/fpdfapi/page/cpdf_colorspace.h
@@ -72,6 +72,7 @@
       const CPDF_Object* pObj,
       std::set<const CPDF_Object*>* pVisited);
   static uint32_t ComponentsForFamily(int family);
+  static bool IsValidIccComponents(int components);
 
   const CPDF_Array* GetArray() const { return m_pArray.Get(); }
   CPDF_Document* GetDocument() const { return m_pDocument.Get(); }
diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index cbad6b5..1a79a2f 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -12,6 +12,7 @@
 #include <utility>
 #include <vector>
 
+#include "core/fpdfapi/page/cpdf_colorspace.h"
 #include "core/fpdfapi/page/cpdf_docpagedata.h"
 #include "core/fpdfapi/page/cpdf_image.h"
 #include "core/fpdfapi/page/cpdf_imageobject.h"
@@ -65,10 +66,6 @@
   return bpc == 1 || bpc == 2 || bpc == 4 || bpc == 8 || bpc == 16;
 }
 
-bool IsAllowedICCComponents(int nComp) {
-  return nComp == 1 || nComp == 3 || nComp == 4;
-}
-
 bool IsColorIndexOutOfBounds(uint8_t index, const DIB_COMP_DATA& comp_datum) {
   return index < comp_datum.m_ColorKeyMin || index > comp_datum.m_ColorKeyMax;
 }
@@ -574,32 +571,31 @@
   m_nComponents = static_cast<uint32_t>(comps);
   m_CompData.clear();
   if (m_pColorSpace) {
+    uint32_t colorspace_comps = m_pColorSpace->CountComponents();
     switch (m_Family) {
       case PDFCS_DEVICEGRAY:
       case PDFCS_DEVICERGB:
       case PDFCS_DEVICECMYK: {
         uint32_t dwMinComps = CPDF_ColorSpace::ComponentsForFamily(m_Family);
-        if (m_pColorSpace->CountComponents() < dwMinComps ||
-            m_nComponents < dwMinComps) {
+        if (colorspace_comps < dwMinComps || m_nComponents < dwMinComps)
           return false;
-        }
         break;
       }
       case PDFCS_LAB: {
-        if (m_nComponents != 3 || m_pColorSpace->CountComponents() < 3)
+        if (m_nComponents != 3 || colorspace_comps < 3)
           return false;
         break;
       }
       case PDFCS_ICCBASED: {
-        if (!IsAllowedICCComponents(m_nComponents) ||
-            !IsAllowedICCComponents(m_pColorSpace->CountComponents()) ||
-            m_pColorSpace->CountComponents() < m_nComponents) {
+        if (!CPDF_ColorSpace::IsValidIccComponents(colorspace_comps) ||
+            !CPDF_ColorSpace::IsValidIccComponents(m_nComponents) ||
+            colorspace_comps < m_nComponents) {
           return false;
         }
         break;
       }
       default: {
-        if (m_pColorSpace->CountComponents() != m_nComponents)
+        if (colorspace_comps != m_nComponents)
           return false;
         break;
       }