| Index: core/fpdfapi/page/fpdf_page_colors.cpp
|
| diff --git a/core/fpdfapi/page/fpdf_page_colors.cpp b/core/fpdfapi/page/fpdf_page_colors.cpp
|
| index 3ee5328dbcefbda60528ec24fd0394bce3921b95..455233abb57abc237c577ed18e8d7b492b654c87 100644
|
| --- a/core/fpdfapi/page/fpdf_page_colors.cpp
|
| +++ b/core/fpdfapi/page/fpdf_page_colors.cpp
|
| @@ -26,9 +26,14 @@ uint32_t ComponentsForFamily(int family) {
|
| return 3;
|
| if (family == PDFCS_DEVICEGRAY)
|
| return 1;
|
| + ASSERT(family == PDFCS_DEVICECMYK);
|
| return 4;
|
| }
|
|
|
| +FX_FLOAT NormalizeChannel(FX_FLOAT fVal) {
|
| + return std::min(std::max(fVal, 0.0f), 1.0f);
|
| +}
|
| +
|
| } // namespace
|
|
|
| void sRGB_to_AdobeCMYK(FX_FLOAT R,
|
| @@ -69,109 +74,103 @@ void ReverseRGB(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels) {
|
| }
|
|
|
| CPDF_DeviceCS::CPDF_DeviceCS(CPDF_Document* pDoc, int family)
|
| - : CPDF_ColorSpace(pDoc, family, ComponentsForFamily(family)) {}
|
| + : CPDF_ColorSpace(pDoc, family, ComponentsForFamily(family)) {
|
| + ASSERT(family == PDFCS_DEVICEGRAY || family == PDFCS_DEVICERGB ||
|
| + family == PDFCS_DEVICECMYK);
|
| +}
|
|
|
| bool CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf,
|
| FX_FLOAT& R,
|
| FX_FLOAT& G,
|
| FX_FLOAT& B) const {
|
| - if (m_Family == PDFCS_DEVICERGB) {
|
| - R = pBuf[0];
|
| - if (R < 0) {
|
| - R = 0;
|
| - } else if (R > 1) {
|
| - R = 1;
|
| - }
|
| - G = pBuf[1];
|
| - if (G < 0) {
|
| - G = 0;
|
| - } else if (G > 1) {
|
| - G = 1;
|
| - }
|
| - B = pBuf[2];
|
| - if (B < 0) {
|
| - B = 0;
|
| - } else if (B > 1) {
|
| - B = 1;
|
| - }
|
| - } else if (m_Family == PDFCS_DEVICEGRAY) {
|
| - R = *pBuf;
|
| - if (R < 0) {
|
| - R = 0;
|
| - } else if (R > 1) {
|
| - R = 1;
|
| - }
|
| - G = B = R;
|
| - } else if (m_Family == PDFCS_DEVICECMYK) {
|
| - if (!m_dwStdConversion) {
|
| - AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);
|
| - } else {
|
| - FX_FLOAT k = pBuf[3];
|
| - R = 1.0f - std::min(1.0f, pBuf[0] + k);
|
| - G = 1.0f - std::min(1.0f, pBuf[1] + k);
|
| - B = 1.0f - std::min(1.0f, pBuf[2] + k);
|
| - }
|
| - } else {
|
| - ASSERT(m_Family == PDFCS_PATTERN);
|
| - R = G = B = 0;
|
| - return false;
|
| + switch (m_Family) {
|
| + case PDFCS_DEVICEGRAY:
|
| + R = NormalizeChannel(*pBuf);
|
| + G = R;
|
| + B = R;
|
| + break;
|
| + case PDFCS_DEVICERGB:
|
| + R = NormalizeChannel(pBuf[0]);
|
| + G = NormalizeChannel(pBuf[1]);
|
| + B = NormalizeChannel(pBuf[2]);
|
| + break;
|
| + case PDFCS_DEVICECMYK:
|
| + if (m_dwStdConversion) {
|
| + FX_FLOAT k = pBuf[3];
|
| + R = 1.0f - std::min(1.0f, pBuf[0] + k);
|
| + G = 1.0f - std::min(1.0f, pBuf[1] + k);
|
| + B = 1.0f - std::min(1.0f, pBuf[2] + k);
|
| + } else {
|
| + AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);
|
| + }
|
| + break;
|
| + default:
|
| + ASSERT(false);
|
| + return false;
|
| }
|
| return true;
|
| }
|
| +
|
| bool CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf,
|
| FX_FLOAT& c,
|
| FX_FLOAT& m,
|
| FX_FLOAT& y,
|
| FX_FLOAT& k) const {
|
| - if (m_Family != PDFCS_DEVICECMYK) {
|
| + if (m_Family != PDFCS_DEVICECMYK)
|
| return false;
|
| - }
|
| +
|
| c = pBuf[0];
|
| m = pBuf[1];
|
| y = pBuf[2];
|
| k = pBuf[3];
|
| return true;
|
| }
|
| +
|
| bool CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf,
|
| FX_FLOAT R,
|
| FX_FLOAT G,
|
| FX_FLOAT B) const {
|
| - if (m_Family == PDFCS_DEVICERGB) {
|
| - pBuf[0] = R;
|
| - pBuf[1] = G;
|
| - pBuf[2] = B;
|
| - return true;
|
| - }
|
| - if (m_Family == PDFCS_DEVICEGRAY) {
|
| - if (R == G && R == B) {
|
| + switch (m_Family) {
|
| + case PDFCS_DEVICEGRAY:
|
| + if (R != G || R != B)
|
| + return false;
|
| *pBuf = R;
|
| return true;
|
| - }
|
| - return false;
|
| - }
|
| - if (m_Family == PDFCS_DEVICECMYK) {
|
| - sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
|
| - return true;
|
| + case PDFCS_DEVICERGB:
|
| + pBuf[0] = R;
|
| + pBuf[1] = G;
|
| + pBuf[2] = B;
|
| + return true;
|
| + case PDFCS_DEVICECMYK:
|
| + sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
|
| + return true;
|
| + default:
|
| + ASSERT(false);
|
| + return false;
|
| }
|
| - return false;
|
| }
|
| +
|
| bool CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf,
|
| FX_FLOAT c,
|
| FX_FLOAT m,
|
| FX_FLOAT y,
|
| FX_FLOAT k) const {
|
| - if (m_Family == PDFCS_DEVICERGB) {
|
| - AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);
|
| - return true;
|
| - }
|
| - if (m_Family == PDFCS_DEVICECMYK) {
|
| - pBuf[0] = c;
|
| - pBuf[1] = m;
|
| - pBuf[2] = y;
|
| - pBuf[3] = k;
|
| - return true;
|
| + switch (m_Family) {
|
| + case PDFCS_DEVICEGRAY:
|
| + return false;
|
| + case PDFCS_DEVICERGB:
|
| + AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);
|
| + return true;
|
| + case PDFCS_DEVICECMYK:
|
| + pBuf[0] = c;
|
| + pBuf[1] = m;
|
| + pBuf[2] = y;
|
| + pBuf[3] = k;
|
| + return true;
|
| + default:
|
| + ASSERT(false);
|
| + return false;
|
| }
|
| - return false;
|
| }
|
|
|
| void CPDF_DeviceCS::TranslateImageLine(uint8_t* pDestBuf,
|
| @@ -180,39 +179,46 @@ void CPDF_DeviceCS::TranslateImageLine(uint8_t* pDestBuf,
|
| int image_width,
|
| int image_height,
|
| bool bTransMask) const {
|
| - if (bTransMask && m_Family == PDFCS_DEVICECMYK) {
|
| - for (int i = 0; i < pixels; i++) {
|
| - int k = 255 - pSrcBuf[3];
|
| - pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;
|
| - pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;
|
| - pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;
|
| - pDestBuf += 3;
|
| - pSrcBuf += 4;
|
| - }
|
| - return;
|
| - }
|
| - if (m_Family == PDFCS_DEVICERGB) {
|
| - ReverseRGB(pDestBuf, pSrcBuf, pixels);
|
| - } else if (m_Family == PDFCS_DEVICEGRAY) {
|
| - for (int i = 0; i < pixels; i++) {
|
| - *pDestBuf++ = pSrcBuf[i];
|
| - *pDestBuf++ = pSrcBuf[i];
|
| - *pDestBuf++ = pSrcBuf[i];
|
| - }
|
| - } else {
|
| - for (int i = 0; i < pixels; i++) {
|
| - if (!m_dwStdConversion) {
|
| - AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3],
|
| - pDestBuf[2], pDestBuf[1], pDestBuf[0]);
|
| + switch (m_Family) {
|
| + case PDFCS_DEVICEGRAY:
|
| + for (int i = 0; i < pixels; i++) {
|
| + *pDestBuf++ = pSrcBuf[i];
|
| + *pDestBuf++ = pSrcBuf[i];
|
| + *pDestBuf++ = pSrcBuf[i];
|
| + }
|
| + break;
|
| + case PDFCS_DEVICERGB:
|
| + ReverseRGB(pDestBuf, pSrcBuf, pixels);
|
| + break;
|
| + case PDFCS_DEVICECMYK:
|
| + if (bTransMask) {
|
| + for (int i = 0; i < pixels; i++) {
|
| + int k = 255 - pSrcBuf[3];
|
| + pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;
|
| + pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;
|
| + pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;
|
| + pDestBuf += 3;
|
| + pSrcBuf += 4;
|
| + }
|
| } else {
|
| - uint8_t k = pSrcBuf[3];
|
| - pDestBuf[2] = 255 - std::min(255, pSrcBuf[0] + k);
|
| - pDestBuf[1] = 255 - std::min(255, pSrcBuf[1] + k);
|
| - pDestBuf[0] = 255 - std::min(255, pSrcBuf[2] + k);
|
| + for (int i = 0; i < pixels; i++) {
|
| + if (m_dwStdConversion) {
|
| + uint8_t k = pSrcBuf[3];
|
| + pDestBuf[2] = 255 - std::min(255, pSrcBuf[0] + k);
|
| + pDestBuf[1] = 255 - std::min(255, pSrcBuf[1] + k);
|
| + pDestBuf[0] = 255 - std::min(255, pSrcBuf[2] + k);
|
| + } else {
|
| + AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3],
|
| + pDestBuf[2], pDestBuf[1], pDestBuf[0]);
|
| + }
|
| + pSrcBuf += 4;
|
| + pDestBuf += 3;
|
| + }
|
| }
|
| - pSrcBuf += 4;
|
| - pDestBuf += 3;
|
| - }
|
| + break;
|
| + default:
|
| + ASSERT(false);
|
| + break;
|
| }
|
| }
|
|
|
|
|