summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fpdfapi/page/cpdf_colorspace.cpp87
1 files changed, 45 insertions, 42 deletions
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index ec45160ef8..f9214c75d6 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -178,7 +178,7 @@ class CPDF_ICCBasedCS : public CPDF_ColorSpace {
MaybeOwned<CPDF_ColorSpace> m_pAlterCS;
RetainPtr<CPDF_IccProfile> m_pProfile;
- uint8_t* m_pCache;
+ mutable uint8_t* m_pCache;
float* m_pRanges;
};
@@ -474,16 +474,14 @@ void CPDF_ColorSpace::Release() {
}
int CPDF_ColorSpace::GetBufSize() const {
- if (m_Family == PDFCS_PATTERN) {
+ if (m_Family == PDFCS_PATTERN)
return sizeof(PatternValue);
- }
return m_nComponents * sizeof(float);
}
float* CPDF_ColorSpace::CreateBuf() {
int size = GetBufSize();
- uint8_t* pBuf = FX_Alloc(uint8_t, size);
- return (float*)pBuf;
+ return reinterpret_cast<float*>(FX_Alloc(uint8_t, size));
}
void CPDF_ColorSpace::GetDefaultColor(float* buf) const {
@@ -644,9 +642,9 @@ bool CPDF_CalRGB::GetRGB(float* pBuf, float* R, float* G, float* B) const {
float B_ = pBuf[1];
float C_ = pBuf[2];
if (m_bGamma) {
- A_ = (float)FXSYS_pow(A_, m_Gamma[0]);
- B_ = (float)FXSYS_pow(B_, m_Gamma[1]);
- C_ = (float)FXSYS_pow(C_, m_Gamma[2]);
+ A_ = FXSYS_pow(A_, m_Gamma[0]);
+ B_ = FXSYS_pow(B_, m_Gamma[1]);
+ C_ = FXSYS_pow(C_, m_Gamma[2]);
}
float X;
@@ -773,12 +771,13 @@ void CPDF_LabCS::TranslateImageLine(uint8_t* pDestBuf,
bool bTransMask) const {
for (int i = 0; i < pixels; i++) {
float lab[3];
+ lab[0] = pSrcBuf[0] * 100 / 255.0f;
+ lab[1] = pSrcBuf[1] - 128;
+ lab[2] = pSrcBuf[2] - 128;
+
float R;
float G;
float B;
- lab[0] = (pSrcBuf[0] * 100 / 255.0f);
- lab[1] = (float)(pSrcBuf[1] - 128);
- lab[2] = (float)(pSrcBuf[2] - 128);
GetRGB(lab, &R, &G, &B);
pDestBuf[0] = static_cast<int32_t>(B * 255);
pDestBuf[1] = static_cast<int32_t>(G * 255);
@@ -790,7 +789,6 @@ void CPDF_LabCS::TranslateImageLine(uint8_t* pDestBuf,
CPDF_ICCBasedCS::CPDF_ICCBasedCS(CPDF_Document* pDoc)
: CPDF_ColorSpace(pDoc, PDFCS_ICCBASED, 0),
- m_pProfile(nullptr),
m_pCache(nullptr),
m_pRanges(nullptr) {}
@@ -889,45 +887,50 @@ void CPDF_ICCBasedCS::TranslateImageLine(uint8_t* pDestBuf,
bool bTransMask) const {
if (IsSRGB()) {
ReverseRGB(pDestBuf, pSrcBuf, pixels);
- } else if (m_pProfile->transform()) {
+ return;
+ }
+ if (m_pProfile->transform()) {
int nMaxColors = 1;
- for (uint32_t i = 0; i < m_nComponents; i++) {
+ for (uint32_t i = 0; i < m_nComponents; i++)
nMaxColors *= 52;
- }
+
if (m_nComponents > 3 || image_width * image_height < nMaxColors * 3 / 2) {
CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(
m_pProfile->transform(), pDestBuf, pSrcBuf, pixels);
- } else {
- if (!m_pCache) {
- ((CPDF_ICCBasedCS*)this)->m_pCache = FX_Alloc2D(uint8_t, nMaxColors, 3);
- uint8_t* temp_src = FX_Alloc2D(uint8_t, nMaxColors, m_nComponents);
- uint8_t* pSrc = temp_src;
- for (int i = 0; i < nMaxColors; i++) {
- uint32_t color = i;
- uint32_t order = nMaxColors / 52;
- for (uint32_t c = 0; c < m_nComponents; c++) {
- *pSrc++ = (uint8_t)(color / order * 5);
- color %= order;
- order /= 52;
- }
- }
- CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(
- m_pProfile->transform(), m_pCache, temp_src, nMaxColors);
- FX_Free(temp_src);
- }
- for (int i = 0; i < pixels; i++) {
- int index = 0;
+ return;
+ }
+
+ if (!m_pCache) {
+ m_pCache = FX_Alloc2D(uint8_t, nMaxColors, 3);
+ uint8_t* temp_src = FX_Alloc2D(uint8_t, nMaxColors, m_nComponents);
+ uint8_t* pSrc = temp_src;
+ for (int i = 0; i < nMaxColors; i++) {
+ uint32_t color = i;
+ uint32_t order = nMaxColors / 52;
for (uint32_t c = 0; c < m_nComponents; c++) {
- index = index * 52 + (*pSrcBuf) / 5;
- pSrcBuf++;
+ *pSrc++ = static_cast<uint8_t>(color / order * 5);
+ color %= order;
+ order /= 52;
}
- index *= 3;
- *pDestBuf++ = m_pCache[index];
- *pDestBuf++ = m_pCache[index + 1];
- *pDestBuf++ = m_pCache[index + 2];
}
+ CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(
+ m_pProfile->transform(), m_pCache, temp_src, nMaxColors);
+ FX_Free(temp_src);
+ }
+ for (int i = 0; i < pixels; i++) {
+ int index = 0;
+ for (uint32_t c = 0; c < m_nComponents; c++) {
+ index = index * 52 + (*pSrcBuf) / 5;
+ pSrcBuf++;
+ }
+ index *= 3;
+ *pDestBuf++ = m_pCache[index];
+ *pDestBuf++ = m_pCache[index + 1];
+ *pDestBuf++ = m_pCache[index + 2];
}
- } else if (m_pAlterCS) {
+ return;
+ }
+ if (m_pAlterCS) {
m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width,
image_height, false);
}