CPDF_IccProfile* CPDF_DocPageData::GetIccProfile( CPDF_Stream* pIccProfileStream) { if (!pIccProfileStream) return NULL; auto it = m_IccProfileMap.find(pIccProfileStream); if (it != m_IccProfileMap.end()) { return it->second->AddRef(); } CPDF_StreamAcc stream; stream.LoadAllData(pIccProfileStream, FALSE); uint8_t digest[20]; CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); auto hash_it = m_HashProfileMap.find(CFX_ByteStringC(digest, 20)); if (hash_it != m_HashProfileMap.end()) { auto it_copied_stream = m_IccProfileMap.find(hash_it->second); return it_copied_stream->second->AddRef(); } CPDF_IccProfile* pProfile = new CPDF_IccProfile(stream.GetData(), stream.GetSize()); CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(pProfile); m_IccProfileMap[pIccProfileStream] = ipData; m_HashProfileMap[CFX_ByteStringC(digest, 20)] = pIccProfileStream; return ipData->AddRef(); }
CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents) { if (!pIccProfileStream) { return NULL; } CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL; if (m_IccProfileMap.Lookup(pIccProfileStream, ipData)) { ipData->m_nCount++; return ipData->m_Obj; } CPDF_StreamAcc stream; stream.LoadAllData(pIccProfileStream, FALSE); FX_BYTE digest[20]; CPDF_Stream* pCopiedStream = NULL; CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStream)) { m_IccProfileMap.Lookup(pCopiedStream, ipData); ipData->m_nCount++; return ipData->m_Obj; } CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize(), nComponents); if (!pProfile) { return NULL; } ipData = FX_NEW CPDF_CountedObject<CPDF_IccProfile*>; if (!ipData) { delete pProfile; return NULL; } ipData->m_nCount = 2; ipData->m_Obj = pProfile; m_IccProfileMap.SetAt(pIccProfileStream, ipData); m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream); return pProfile; }