| Index: core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
|
| index f1640ad14af135dc3419d531bac17c30e96711fd..d99e64304719d7a21cd054537f30e697ac484c27 100644
|
| --- a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
|
| +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
|
| @@ -517,12 +517,17 @@ void CPDF_LabCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int
|
| pSrcBuf += 3;
|
| }
|
| }
|
| -CPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents)
|
| +CPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize):
|
| + m_bsRGB(FALSE),
|
| + m_pTransform(NULL),
|
| + m_nSrcComponents(0)
|
| {
|
| - m_bsRGB = nComponents == 3 && dwSize == 3144 && FXSYS_memcmp32(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0;
|
| - m_pTransform = NULL;
|
| - if (!m_bsRGB && CPDF_ModuleMgr::Get()->GetIccModule()) {
|
| - m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(pData, dwSize, nComponents);
|
| + if (dwSize == 3144 && FXSYS_memcmp32(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0) {
|
| + m_bsRGB = TRUE;
|
| + m_nSrcComponents = 3;
|
| + }
|
| + else if (CPDF_ModuleMgr::Get()->GetIccModule()) {
|
| + m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(pData, dwSize, m_nSrcComponents);
|
| }
|
| }
|
| CPDF_IccProfile::~CPDF_IccProfile()
|
| @@ -583,49 +588,67 @@ FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
|
| if (pStream == NULL) {
|
| return FALSE;
|
| }
|
| - CPDF_Dictionary* pDict = pStream->GetDict();
|
| - m_nComponents = pDict ? pDict->GetInteger(FX_BSTRC("N")) : 0;
|
| - if (m_nComponents != 1 && m_nComponents != 3 && m_nComponents != 4) {
|
| - return FALSE;
|
| - }
|
| - CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range"));
|
| - m_pRanges = FX_Alloc(FX_FLOAT, m_nComponents * 2);
|
| - for (int i = 0; i < m_nComponents * 2; i ++) {
|
| - if (pRanges) {
|
| - m_pRanges[i] = pRanges->GetNumber(i);
|
| - } else if (i % 2) {
|
| - m_pRanges[i] = 1.0f;
|
| - } else {
|
| - m_pRanges[i] = 0;
|
| - }
|
| - }
|
| - m_pProfile = pDoc->LoadIccProfile(pStream, m_nComponents);
|
| + m_pProfile = pDoc->LoadIccProfile(pStream);
|
| if (!m_pProfile) {
|
| return FALSE;
|
| }
|
| - if (m_pProfile->m_pTransform == NULL) {
|
| + m_nComponents = m_pProfile->GetComponents(); //Try using the nComponents from ICC profile
|
| + CPDF_Dictionary* pDict = pStream->GetDict();
|
| + if (m_pProfile->m_pTransform == NULL) { // No valid ICC profile or using sRGB
|
| CPDF_Object* pAlterCSObj = pDict ? pDict->GetElementValue(FX_BSTRC("Alternate")) : NULL;
|
| if (pAlterCSObj) {
|
| - CPDF_ColorSpace* alter_cs = CPDF_ColorSpace::Load(pDoc, pAlterCSObj);
|
| - if (alter_cs) {
|
| - if (alter_cs->CountComponents() > m_nComponents) {
|
| - alter_cs->ReleaseCS();
|
| - } else {
|
| - m_pAlterCS = alter_cs;
|
| - m_bOwn = TRUE;
|
| + CPDF_ColorSpace* pAlterCS = CPDF_ColorSpace::Load(pDoc, pAlterCSObj);
|
| + if (pAlterCS) {
|
| + if (m_nComponents == 0) { // NO valid ICC profile
|
| + if (pAlterCS->CountComponents() > 0) { // Use Alternative colorspace
|
| + m_nComponents = pAlterCS->CountComponents();
|
| + m_pAlterCS = pAlterCS;
|
| + m_bOwn = TRUE;
|
| + }
|
| + else { // No valid alternative colorspace
|
| + pAlterCS->ReleaseCS();
|
| + FX_INT32 nDictComponents = pDict ? pDict->GetInteger(FX_BSTRC("N")) : 0;
|
| + if (nDictComponents != 1 && nDictComponents != 3 && nDictComponents != 4) {
|
| + return FALSE;
|
| + }
|
| + m_nComponents = nDictComponents;
|
| + }
|
| +
|
| + }
|
| + else { // Using sRGB
|
| + if (pAlterCS->CountComponents() != m_nComponents) {
|
| + pAlterCS->ReleaseCS();
|
| + }
|
| + else {
|
| + m_pAlterCS = pAlterCS;
|
| + m_bOwn = TRUE;
|
| + }
|
| }
|
| }
|
| }
|
| if (!m_pAlterCS) {
|
| - if (m_nComponents == 3) {
|
| + if (m_nComponents == 1) {
|
| + m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);
|
| + }
|
| + else if (m_nComponents == 3) {
|
| m_pAlterCS = GetStockCS(PDFCS_DEVICERGB);
|
| - } else if (m_nComponents == 4) {
|
| + }
|
| + else if (m_nComponents == 4) {
|
| m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK);
|
| - } else {
|
| - m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);
|
| }
|
| }
|
| }
|
| + CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range"));
|
| + m_pRanges = FX_Alloc(FX_FLOAT, m_nComponents * 2);
|
| + for (int i = 0; i < m_nComponents * 2; i ++) {
|
| + if (pRanges) {
|
| + m_pRanges[i] = pRanges->GetNumber(i);
|
| + } else if (i % 2) {
|
| + m_pRanges[i] = 1.0f;
|
| + } else {
|
| + m_pRanges[i] = 0;
|
| + }
|
| + }
|
| return TRUE;
|
| }
|
| FX_BOOL CPDF_ICCBasedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
|
|
|