summaryrefslogtreecommitdiff
path: root/core/src/fpdfapi/fpdf_page
diff options
context:
space:
mode:
authorBo Xu <bo_xu@foxitsoftware.com>2014-08-25 11:52:41 -0700
committerBo Xu <bo_xu@foxitsoftware.com>2014-08-25 11:52:41 -0700
commita550e4cfd41d6e86b2a676e38200f3f4cebf5f2e (patch)
treea81b38c5cf8a1848ea6c5a67e38a0e4b8798b800 /core/src/fpdfapi/fpdf_page
parentbe831032f3ef4654e0f645785c6a59b1d06a9ad8 (diff)
downloadpdfium-a550e4cfd41d6e86b2a676e38200f3f4cebf5f2e.tar.xz
Revert of Use number of components from ICC profile and alternateCS (patchset #1 of https://codereview.chromium.org/493163003/)
Reason for revert: Needs to address comments before landing Original issue's description: > Use number of components from ICC profile and alternate color space > > BUG=406806 > > Committed: https://pdfium.googlesource.com/pdfium/+/be83103 TBR=tsepez@chromium.org,jun_fang@foxitsoftware.com NOTREECHECKS=true NOTRY=true BUG=406806 Review URL: https://codereview.chromium.org/504883003
Diffstat (limited to 'core/src/fpdfapi/fpdf_page')
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp86
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp8
-rw-r--r--core/src/fpdfapi/fpdf_page/pageint.h6
3 files changed, 37 insertions, 63 deletions
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
index b5b4695c6c..f1640ad14a 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
@@ -517,16 +517,12 @@ void CPDF_LabCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int
pSrcBuf += 3;
}
}
-CPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize)
+CPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents)
{
- if (dwSize == 3144 && FXSYS_memcmp32(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0) {
- m_bsRGB = TRUE;
- m_pTransform = NULL;
- m_nSrcComponents = 3;
- }
- else if (CPDF_ModuleMgr::Get()->GetIccModule()) {
- m_bsRGB = FALSE;
- m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(pData, dwSize, &m_nSrcComponents);
+ 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);
}
}
CPDF_IccProfile::~CPDF_IccProfile()
@@ -587,69 +583,49 @@ FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
if (pStream == NULL) {
return FALSE;
}
- m_pProfile = pDoc->LoadIccProfile(pStream);
+ 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);
if (!m_pProfile) {
return FALSE;
}
- m_nComponents = m_pProfile->GetComponents(); //Try using the nComponents from ICC profile
- CPDF_Dictionary* pDict = pStream->GetDict();
- FX_INT32 Dict_nComponents = pDict ? pDict->GetInteger(FX_BSTRC("N")) : 0;
- if (m_pProfile->m_pTransform == NULL) { // No valid ICC profile or using sRGB
+ if (m_pProfile->m_pTransform == NULL) {
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 (m_nComponents == 0) { // NO valid ICC profile
- if (alter_cs->CountComponents() > 0) { // Use Alternative colorspace
- m_nComponents = alter_cs->CountComponents();
- m_pAlterCS = alter_cs;
- m_bOwn = TRUE;
- }
- else { // No valid alternative colorspace
- alter_cs->ReleaseCS();
- if (Dict_nComponents == 1 || Dict_nComponents == 3 || Dict_nComponents == 4 ) {
- m_nComponents = Dict_nComponents;
- }
- else {
- return FALSE;
- }
- }
-
- }
- else { // Using sRGB
- if (alter_cs->CountComponents() != m_nComponents) {
- alter_cs->ReleaseCS();
- }
- else {
- m_pAlterCS = alter_cs;
- m_bOwn = TRUE;
- }
+ if (alter_cs->CountComponents() > m_nComponents) {
+ alter_cs->ReleaseCS();
+ } else {
+ m_pAlterCS = alter_cs;
+ m_bOwn = TRUE;
}
}
}
if (!m_pAlterCS) {
- if (m_nComponents == 1) {
- m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);
- }
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
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
index 16f0a9cfad..0b52800939 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
@@ -107,9 +107,9 @@ CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, FX_BOOL bShad
{
return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix);
}
-CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream)
+CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream, int nComponents)
{
- return GetValidatePageData()->GetIccProfile(pStream);
+ return GetValidatePageData()->GetIccProfile(pStream, nComponents);
}
CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj)
{
@@ -543,7 +543,7 @@ void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream)
}
PDF_DocPageData_Release<FX_DWORD, CPDF_Image*>(m_ImageMap, pImageStream->GetObjNum(), NULL);
}
-CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream)
+CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents)
{
if (!pIccProfileStream) {
return NULL;
@@ -563,7 +563,7 @@ CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream)
ipData->m_nCount++;
return ipData->m_Obj;
}
- CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize());
+ CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize(), nComponents);
if (!pProfile) {
return NULL;
}
diff --git a/core/src/fpdfapi/fpdf_page/pageint.h b/core/src/fpdfapi/fpdf_page/pageint.h
index 24261ef8b2..625e5df737 100644
--- a/core/src/fpdfapi/fpdf_page/pageint.h
+++ b/core/src/fpdfapi/fpdf_page/pageint.h
@@ -426,7 +426,7 @@ public:
void ReleasePattern(CPDF_Object* pPatternObj);
CPDF_Image* GetImage(CPDF_Object* pImageStream);
void ReleaseImage(CPDF_Object* pImageStream);
- CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream);
+ CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents);
void ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile);
CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream);
void ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE);
@@ -468,11 +468,9 @@ protected:
class CPDF_IccProfile : public CFX_Object
{
public:
- CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize);
+ CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents);
~CPDF_IccProfile();
- FX_INT32 GetComponents() { return m_nSrcComponents; }
FX_BOOL m_bsRGB;
- FX_INT32 m_nSrcComponents;
FX_LPVOID m_pTransform;
};
class CPDF_DeviceCS : public CPDF_ColorSpace