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