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;
}