Pass spans of floats to CPDF_ColorSpace::GetRGB().
Change-Id: If7c608ede56f880f5b25e15ab83014a948b92fb6
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/74391
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_color.cpp b/core/fpdfapi/page/cpdf_color.cpp
index 6c739b7..7c122ab 100644
--- a/core/fpdfapi/page/cpdf_color.cpp
+++ b/core/fpdfapi/page/cpdf_color.cpp
@@ -85,7 +85,7 @@
}
} else {
if (!m_Buffer.empty())
- result = m_pCS->GetRGB(m_Buffer.data(), &r, &g, &b);
+ result = m_pCS->GetRGB(m_Buffer, &r, &g, &b);
}
if (!result)
return false;
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index acfb348..4e4df16 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -112,7 +112,10 @@
~CPDF_CalGray() override;
// CPDF_ColorSpace:
- bool GetRGB(const float* pBuf, float* R, float* G, float* B) const override;
+ bool GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const override;
uint32_t v_Load(CPDF_Document* pDoc,
const CPDF_Array* pArray,
std::set<const CPDF_Object*>* pVisited) override;
@@ -139,7 +142,10 @@
~CPDF_CalRGB() override;
// CPDF_ColorSpace:
- bool GetRGB(const float* pBuf, float* R, float* G, float* B) const override;
+ bool GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const override;
void TranslateImageLine(uint8_t* pDestBuf,
const uint8_t* pSrcBuf,
int pixels,
@@ -170,7 +176,10 @@
~CPDF_LabCS() override;
// CPDF_ColorSpace:
- bool GetRGB(const float* pBuf, float* R, float* G, float* B) const override;
+ bool GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const override;
void GetDefaultValue(int iComponent,
float* value,
float* min,
@@ -201,7 +210,10 @@
~CPDF_ICCBasedCS() override;
// CPDF_ColorSpace:
- bool GetRGB(const float* pBuf, float* R, float* G, float* B) const override;
+ bool GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const override;
void EnableStdConversion(bool bEnabled) override;
void TranslateImageLine(uint8_t* pDestBuf,
const uint8_t* pSrcBuf,
@@ -239,7 +251,10 @@
~CPDF_IndexedCS() override;
// CPDF_ColorSpace:
- bool GetRGB(const float* pBuf, float* R, float* G, float* B) const override;
+ bool GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const override;
void EnableStdConversion(bool bEnabled) override;
uint32_t v_Load(CPDF_Document* pDoc,
const CPDF_Array* pArray,
@@ -261,7 +276,10 @@
~CPDF_SeparationCS() override;
// CPDF_ColorSpace:
- bool GetRGB(const float* pBuf, float* R, float* G, float* B) const override;
+ bool GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const override;
void GetDefaultValue(int iComponent,
float* value,
float* min,
@@ -286,7 +304,10 @@
~CPDF_DeviceNCS() override;
// CPDF_ColorSpace:
- bool GetRGB(const float* pBuf, float* R, float* G, float* B) const override;
+ bool GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const override;
void GetDefaultValue(int iComponent,
float* value,
float* min,
@@ -609,7 +630,7 @@
for (int i = 0; i < pixels; i++) {
for (uint32_t j = 0; j < m_nComponents; j++)
src[j] = static_cast<float>(*src_buf++) / divisor;
- GetRGB(src.data(), &R, &G, &B);
+ GetRGB(src, &R, &G, &B);
*dest_buf++ = static_cast<int32_t>(B * 255);
*dest_buf++ = static_cast<int32_t>(G * 255);
*dest_buf++ = static_cast<int32_t>(R * 255);
@@ -680,13 +701,13 @@
return 1;
}
-bool CPDF_CalGray::GetRGB(const float* pBuf,
+bool CPDF_CalGray::GetRGB(pdfium::span<const float> pBuf,
float* R,
float* G,
float* B) const {
- *R = *pBuf;
- *G = *pBuf;
- *B = *pBuf;
+ *R = pBuf[0];
+ *G = pBuf[0];
+ *B = pBuf[0];
return true;
}
@@ -736,7 +757,7 @@
return 3;
}
-bool CPDF_CalRGB::GetRGB(const float* pBuf,
+bool CPDF_CalRGB::GetRGB(pdfium::span<const float> pBuf,
float* R,
float* G,
float* B) const {
@@ -837,7 +858,10 @@
return 3;
}
-bool CPDF_LabCS::GetRGB(const float* pBuf, float* R, float* G, float* B) const {
+bool CPDF_LabCS::GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const {
float Lstar = pBuf[0];
float astar = pBuf[1];
float bstar = pBuf[2];
@@ -937,7 +961,7 @@
return nComponents;
}
-bool CPDF_ICCBasedCS::GetRGB(const float* pBuf,
+bool CPDF_ICCBasedCS::GetRGB(pdfium::span<const float> pBuf,
float* R,
float* G,
float* B) const {
@@ -950,7 +974,8 @@
}
if (m_pProfile->transform()) {
float rgb[3];
- IccModule::Translate(m_pProfile->transform(), CountComponents(), pBuf, rgb);
+ IccModule::Translate(m_pProfile->transform(), CountComponents(),
+ pBuf.data(), rgb);
*R = rgb[0];
*G = rgb[1];
*B = rgb[2];
@@ -1156,11 +1181,11 @@
return 1;
}
-bool CPDF_IndexedCS::GetRGB(const float* pBuf,
+bool CPDF_IndexedCS::GetRGB(pdfium::span<const float> pBuf,
float* R,
float* G,
float* B) const {
- int32_t index = static_cast<int32_t>(*pBuf);
+ int32_t index = static_cast<int32_t>(pBuf[0]);
if (index < 0 || index > m_MaxIndex)
return false;
@@ -1183,7 +1208,7 @@
m_pCompMinMax[i * 2 + 1] * pTable[index * m_nBaseComponents + i] / 255;
}
ASSERT(m_nBaseComponents == m_pBaseCS->CountComponents());
- return m_pBaseCS->GetRGB(comps.data(), R, G, B);
+ return m_pBaseCS->GetRGB(comps, R, G, B);
}
void CPDF_IndexedCS::EnableStdConversion(bool bEnabled) {
@@ -1236,7 +1261,7 @@
return 1;
}
-bool CPDF_SeparationCS::GetRGB(const float* pBuf,
+bool CPDF_SeparationCS::GetRGB(pdfium::span<const float> pBuf,
float* R,
float* G,
float* B) const {
@@ -1250,18 +1275,19 @@
int nComps = m_pAltCS->CountComponents();
std::vector<float> results(nComps);
for (int i = 0; i < nComps; i++)
- results[i] = *pBuf;
- return m_pAltCS->GetRGB(results.data(), R, G, B);
+ results[i] = pBuf[0];
+ return m_pAltCS->GetRGB(results, R, G, B);
}
// Using at least 16 elements due to the call m_pAltCS->GetRGB() below.
std::vector<float> results(std::max(m_pFunc->CountOutputs(), 16u));
int nresults = 0;
- if (!m_pFunc->Call(pBuf, 1, results.data(), &nresults) || nresults == 0)
+ if (!m_pFunc->Call(pBuf.data(), 1, results.data(), &nresults) ||
+ nresults == 0)
return false;
if (m_pAltCS)
- return m_pAltCS->GetRGB(results.data(), R, G, B);
+ return m_pAltCS->GetRGB(results, R, G, B);
R = 0;
G = 0;
@@ -1314,7 +1340,7 @@
return pObj->size();
}
-bool CPDF_DeviceNCS::GetRGB(const float* pBuf,
+bool CPDF_DeviceNCS::GetRGB(pdfium::span<const float> pBuf,
float* R,
float* G,
float* B) const {
@@ -1324,12 +1350,13 @@
// Using at least 16 elements due to the call m_pAltCS->GetRGB() below.
std::vector<float> results(std::max(m_pFunc->CountOutputs(), 16u));
int nresults = 0;
- if (!m_pFunc->Call(pBuf, CountComponents(), results.data(), &nresults) ||
+ if (!m_pFunc->Call(pBuf.data(), CountComponents(), results.data(),
+ &nresults) ||
nresults == 0) {
return false;
}
- return m_pAltCS->GetRGB(results.data(), R, G, B);
+ return m_pAltCS->GetRGB(results, R, G, B);
}
void CPDF_DeviceNCS::EnableStdConversion(bool bEnabled) {
diff --git a/core/fpdfapi/page/cpdf_colorspace.h b/core/fpdfapi/page/cpdf_colorspace.h
index 75928d25..eee1257 100644
--- a/core/fpdfapi/page/cpdf_colorspace.h
+++ b/core/fpdfapi/page/cpdf_colorspace.h
@@ -87,7 +87,7 @@
GetFamily() == PDFCS_INDEXED || GetFamily() == PDFCS_PATTERN;
}
- virtual bool GetRGB(const float* pBuf,
+ virtual bool GetRGB(pdfium::span<const float> pBuf,
float* R,
float* G,
float* B) const = 0;
diff --git a/core/fpdfapi/page/cpdf_devicecs.cpp b/core/fpdfapi/page/cpdf_devicecs.cpp
index 46565c0..fdb1718 100644
--- a/core/fpdfapi/page/cpdf_devicecs.cpp
+++ b/core/fpdfapi/page/cpdf_devicecs.cpp
@@ -43,13 +43,13 @@
return 0;
}
-bool CPDF_DeviceCS::GetRGB(const float* pBuf,
+bool CPDF_DeviceCS::GetRGB(pdfium::span<const float> pBuf,
float* R,
float* G,
float* B) const {
switch (m_Family) {
case PDFCS_DEVICEGRAY:
- *R = NormalizeChannel(*pBuf);
+ *R = NormalizeChannel(pBuf[0]);
*G = *R;
*B = *R;
return true;
diff --git a/core/fpdfapi/page/cpdf_devicecs.h b/core/fpdfapi/page/cpdf_devicecs.h
index 933a881..2815974 100644
--- a/core/fpdfapi/page/cpdf_devicecs.h
+++ b/core/fpdfapi/page/cpdf_devicecs.h
@@ -18,7 +18,10 @@
~CPDF_DeviceCS() override;
// CPDF_ColorSpace:
- bool GetRGB(const float* pBuf, float* R, float* G, float* B) const override;
+ bool GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const override;
void TranslateImageLine(uint8_t* pDestBuf,
const uint8_t* pSrcBuf,
int pixels,
diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index d47c6fa..e1139ce 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -787,7 +787,7 @@
float R;
float G;
float B;
- m_pColorSpace->GetRGB(colors.data(), &R, &G, &B);
+ m_pColorSpace->GetRGB(colors, &R, &G, &B);
m_MatteColor = ArgbEncode(0, FXSYS_roundf(R * 255), FXSYS_roundf(G * 255),
FXSYS_roundf(B * 255));
}
@@ -906,9 +906,9 @@
std::vector<float> temp_buf(nComponents);
for (int k = 0; k < nComponents; ++k)
temp_buf[k] = color_values[0];
- m_pColorSpace->GetRGB(temp_buf.data(), &R, &G, &B);
+ m_pColorSpace->GetRGB(temp_buf, &R, &G, &B);
} else {
- m_pColorSpace->GetRGB(color_values.data(), &R, &G, &B);
+ m_pColorSpace->GetRGB(color_values, &R, &G, &B);
}
SetPaletteArgb(i, ArgbEncode(255, FXSYS_roundf(R * 255),
FXSYS_roundf(G * 255), FXSYS_roundf(B * 255)));
@@ -974,7 +974,7 @@
G = (1.0f - color_values[1]) * k;
B = (1.0f - color_values[2]) * k;
} else if (m_Family != PDFCS_PATTERN) {
- m_pColorSpace->GetRGB(color_values.data(), &R, &G, &B);
+ m_pColorSpace->GetRGB(color_values, &R, &G, &B);
}
R = pdfium::clamp(R, 0.0f, 1.0f);
G = pdfium::clamp(G, 0.0f, 1.0f);
diff --git a/core/fpdfapi/page/cpdf_patterncs.cpp b/core/fpdfapi/page/cpdf_patterncs.cpp
index 52d81cf..598f5da 100644
--- a/core/fpdfapi/page/cpdf_patterncs.cpp
+++ b/core/fpdfapi/page/cpdf_patterncs.cpp
@@ -41,7 +41,7 @@
return m_pBaseCS->CountComponents() + 1;
}
-bool CPDF_PatternCS::GetRGB(const float* pBuf,
+bool CPDF_PatternCS::GetRGB(pdfium::span<const float> pBuf,
float* R,
float* G,
float* B) const {
@@ -61,7 +61,7 @@
float* R,
float* G,
float* B) const {
- if (m_pBaseCS && m_pBaseCS->GetRGB(value.GetComps().data(), R, G, B))
+ if (m_pBaseCS && m_pBaseCS->GetRGB(value.GetComps(), R, G, B))
return true;
*R = 0.75f;
diff --git a/core/fpdfapi/page/cpdf_patterncs.h b/core/fpdfapi/page/cpdf_patterncs.h
index 69e0754..2df1613 100644
--- a/core/fpdfapi/page/cpdf_patterncs.h
+++ b/core/fpdfapi/page/cpdf_patterncs.h
@@ -24,7 +24,10 @@
void InitializeStockPattern();
// CPDF_ColorSpace:
- bool GetRGB(const float* pBuf, float* R, float* G, float* B) const override;
+ bool GetRGB(pdfium::span<const float> pBuf,
+ float* R,
+ float* G,
+ float* B) const override;
bool GetPatternRGB(const PatternValue& value,
float* R,
float* G,
diff --git a/core/fpdfapi/render/cpdf_rendershading.cpp b/core/fpdfapi/render/cpdf_rendershading.cpp
index 5849b42..1394dca 100644
--- a/core/fpdfapi/render/cpdf_rendershading.cpp
+++ b/core/fpdfapi/render/cpdf_rendershading.cpp
@@ -78,7 +78,7 @@
float R = 0.0f;
float G = 0.0f;
float B = 0.0f;
- pCS->GetRGB(result_array.data(), &R, &G, &B);
+ pCS->GetRGB(result_array, &R, &G, &B);
shading_steps[i] =
FXARGB_TODIB(ArgbEncode(alpha, FXSYS_roundf(R * 255),
FXSYS_roundf(G * 255), FXSYS_roundf(B * 255)));
@@ -307,7 +307,7 @@
float R = 0.0f;
float G = 0.0f;
float B = 0.0f;
- pCS->GetRGB(result_array.data(), &R, &G, &B);
+ pCS->GetRGB(result_array, &R, &G, &B);
dib_buf[column] = FXARGB_TODIB(ArgbEncode(
alpha, (int32_t)(R * 255), (int32_t)(G * 255), (int32_t)(B * 255)));
}
@@ -875,7 +875,7 @@
float R = 0.0f;
float G = 0.0f;
float B = 0.0f;
- pColorSpace->GetRGB(comps.data(), &R, &G, &B);
+ pColorSpace->GetRGB(comps, &R, &G, &B);
background = ArgbEncode(255, (int32_t)(R * 255), (int32_t)(G * 255),
(int32_t)(B * 255));
}
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 0e8efe5..6fd93a8 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1510,7 +1510,7 @@
float R;
float G;
float B;
- pCS->GetRGB(floats.data(), &R, &G, &B);
+ pCS->GetRGB(floats, &R, &G, &B);
return ArgbEncode(255, static_cast<int>(R * 255), static_cast<int>(G * 255),
static_cast<int>(B * 255));
}