CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj) { if (pObj == NULL) { return NULL; } if (pObj->GetType() == PDFOBJ_NAME) { return _CSFromName(pObj->GetString()); } if (pObj->GetType() == PDFOBJ_STREAM) { CPDF_Dictionary *pDict = ((CPDF_Stream *)pObj)->GetDict(); if (!pDict) { return NULL; } CPDF_ColorSpace *pRet = NULL; FX_POSITION pos = pDict->GetStartPos(); while (pos) { CFX_ByteString bsKey; CPDF_Object *pValue = pDict->GetNextElement(pos, bsKey); if (pValue && pValue->GetType() == PDFOBJ_NAME) { pRet = _CSFromName(pValue->GetString()); } if (pRet) { return pRet; } } return NULL; } if (pObj->GetType() != PDFOBJ_ARRAY) { return NULL; } CPDF_Array* pArray = (CPDF_Array*)pObj; if (pArray->GetCount() == 0) { return NULL; } CPDF_Object *pFamilyObj = pArray->GetElementValue(0); if (!pFamilyObj) { return NULL; } CFX_ByteString familyname = pFamilyObj->GetString(); if (pArray->GetCount() == 1) { return _CSFromName(familyname); } CPDF_ColorSpace* pCS = NULL; FX_DWORD id = familyname.GetID(); if (id == FXBSTR_ID('C', 'a', 'l', 'G')) { pCS = new CPDF_CalGray(pDoc); } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) { pCS = new CPDF_CalRGB(pDoc); } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) { pCS = new CPDF_LabCS(pDoc); } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) { pCS = new CPDF_ICCBasedCS(pDoc); } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) { pCS = new CPDF_IndexedCS(pDoc); } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) { pCS = new CPDF_SeparationCS(pDoc); } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) { pCS = new CPDF_DeviceNCS(pDoc); } else if (id == FXBSTR_ID('P', 'a', 't', 't')) { pCS = new CPDF_PatternCS(pDoc); } else { return NULL; } pCS->m_pArray = pArray; if (!pCS->v_Load(pDoc, pArray)) { pCS->ReleaseCS(); return NULL; } return pCS; }
FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { CPDF_Stream* pStream = pArray->GetStream(1); if (pStream == NULL) { return FALSE; } m_pProfile = pDoc->LoadIccProfile(pStream); if (!m_pProfile) { return FALSE; } 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* 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(); int32_t 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 == 1) { m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY); } else if (m_nComponents == 3) { m_pAlterCS = GetStockCS(PDFCS_DEVICERGB); } else if (m_nComponents == 4) { m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK); } } } CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range")); m_pRanges = FX_Alloc2D(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; }
CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj) { if (!pObj) return nullptr; if (pObj->IsName()) return _CSFromName(pObj->GetString()); if (CPDF_Stream* pStream = pObj->AsStream()) { CPDF_Dictionary* pDict = pStream->GetDict(); if (!pDict) return nullptr; for (const auto& it : *pDict) { CPDF_ColorSpace* pRet = nullptr; CPDF_Object* pValue = it.second; if (ToName(pValue)) pRet = _CSFromName(pValue->GetString()); if (pRet) return pRet; } return nullptr; } CPDF_Array* pArray = pObj->AsArray(); if (!pArray || pArray->GetCount() == 0) return nullptr; CPDF_Object* pFamilyObj = pArray->GetElementValue(0); if (!pFamilyObj) return nullptr; CFX_ByteString familyname = pFamilyObj->GetString(); if (pArray->GetCount() == 1) return _CSFromName(familyname); CPDF_ColorSpace* pCS = NULL; FX_DWORD id = familyname.GetID(); if (id == FXBSTR_ID('C', 'a', 'l', 'G')) { pCS = new CPDF_CalGray(pDoc); } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) { pCS = new CPDF_CalRGB(pDoc); } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) { pCS = new CPDF_LabCS(pDoc); } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) { pCS = new CPDF_ICCBasedCS(pDoc); } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) { pCS = new CPDF_IndexedCS(pDoc); } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) { pCS = new CPDF_SeparationCS(pDoc); } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) { pCS = new CPDF_DeviceNCS(pDoc); } else if (id == FXBSTR_ID('P', 'a', 't', 't')) { pCS = new CPDF_PatternCS(pDoc); } else { return NULL; } pCS->m_pArray = pArray; if (!pCS->v_Load(pDoc, pArray)) { pCS->ReleaseCS(); return NULL; } return pCS; }