{
return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix);
}
-CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream, int nComponents)
+CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream)
{
- return GetValidatePageData()->GetIccProfile(pStream, nComponents);
+ return GetValidatePageData()->GetIccProfile(pStream);
}
CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj)
{
, m_ImageMap()
, m_IccProfileMap()
, m_FontFileMap()
+ , m_bForceClear(FALSE)
{
m_FontMap.InitHashTable(64);
m_ColorSpaceMap.InitHashTable(32);
Clear(FALSE);
Clear(TRUE);
}
-void CPDF_DocPageData::Clear(FX_BOOL bRelease)
+void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
{
FX_POSITION pos;
- FX_DWORD nCount;
- {
- pos = m_PatternMap.GetStartPosition();
- while (pos) {
- CPDF_Object* ptObj;
- CPDF_CountedObject<CPDF_Pattern*>* ptData;
- m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
- nCount = ptData->m_nCount;
- if (bRelease || nCount < 2) {
- delete ptData->m_Obj;
- ptData->m_Obj = NULL;
- }
+
+ m_bForceClear = bForceRelease;
+
+ // Release objects saved in the resource maps like font map and color space map.
+ // The compound objects shall be released before simple ones.
+ pos = m_FontMap.GetStartPosition();
+ while (pos) {
+ CPDF_Dictionary* fontDict;
+ CPDF_CountedObject<CPDF_Font*>* fontData;
+ m_FontMap.GetNextAssoc(pos, fontDict, fontData);
+ if (!fontData->m_Obj) {
+ continue;
+ }
+ if (bForceRelease || fontData->m_nCount < 2) {
+ delete fontData->m_Obj;
+ fontData->m_Obj = NULL;
}
}
- {
- pos = m_FontMap.GetStartPosition();
- while (pos) {
- CPDF_Dictionary* fontDict;
- CPDF_CountedObject<CPDF_Font*>* fontData;
- m_FontMap.GetNextAssoc(pos, fontDict, fontData);
- nCount = fontData->m_nCount;
- if (bRelease || nCount < 2) {
- delete fontData->m_Obj;
- fontData->m_Obj = NULL;
- }
+ pos = m_ColorSpaceMap.GetStartPosition();
+ while (pos) {
+ CPDF_Object* csKey;
+ CPDF_CountedObject<CPDF_ColorSpace*>* csData;
+ m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
+ if (!csData->m_Obj) {
+ continue;
+ }
+ if (bForceRelease || csData->m_nCount < 2) {
+ // csData->m_Obj is deleted in the function of ReleaseCS().
+ csData->m_Obj->ReleaseCS();
+ csData->m_Obj = NULL;
}
}
- {
- pos = m_ImageMap.GetStartPosition();
- while (pos) {
- FX_DWORD objNum;
- CPDF_CountedObject<CPDF_Image*>* imageData;
- m_ImageMap.GetNextAssoc(pos, objNum, imageData);
- nCount = imageData->m_nCount;
- if (bRelease || nCount < 2) {
- delete imageData->m_Obj;
- delete imageData;
- m_ImageMap.RemoveKey(objNum);
+ pos = m_IccProfileMap.GetStartPosition();
+ while (pos) {
+ CPDF_Stream* ipKey;
+ CPDF_CountedObject<CPDF_IccProfile*>* ipData;
+ m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData);
+ if (!ipData->m_Obj) {
+ continue;
+ }
+ if (bForceRelease || ipData->m_nCount < 2) {
+ FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();
+ while (pos2) {
+ CFX_ByteString bsKey;
+ CPDF_Stream* pFindStream = NULL;
+ m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);
+ if (ipKey == pFindStream) {
+ m_HashProfileMap.RemoveKey(bsKey);
+ break;
+ }
}
+ delete ipData->m_Obj;
+ ipData->m_Obj = NULL;
+ delete ipData;
+ m_IccProfileMap.RemoveKey(ipKey);
}
}
- {
- pos = m_ColorSpaceMap.GetStartPosition();
- while (pos) {
- CPDF_Object* csKey;
- CPDF_CountedObject<CPDF_ColorSpace*>* csData;
- m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
- nCount = csData->m_nCount;
- if (bRelease || nCount < 2) {
- csData->m_Obj->ReleaseCS();
- csData->m_Obj = NULL;
- }
+ pos = m_FontFileMap.GetStartPosition();
+ while (pos) {
+ CPDF_Stream* ftKey;
+ CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
+ m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);
+ if (!ftData->m_Obj) {
+ continue;
+ }
+ if (bForceRelease || ftData->m_nCount < 2) {
+ delete ftData->m_Obj;
+ ftData->m_Obj = NULL;
+ delete ftData;
+ m_FontFileMap.RemoveKey(ftKey);
}
}
- {
- pos = m_IccProfileMap.GetStartPosition();
- while (pos) {
- CPDF_Stream* ipKey;
- CPDF_CountedObject<CPDF_IccProfile*>* ipData;
- m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData);
- nCount = ipData->m_nCount;
- if (bRelease || nCount < 2) {
- FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();
- while (pos2) {
- CFX_ByteString bsKey;
- CPDF_Stream* pFindStream = NULL;
- m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);
- if (ipKey == pFindStream) {
- m_HashProfileMap.RemoveKey(bsKey);
- break;
- }
- }
- delete ipData->m_Obj;
- delete ipData;
- m_IccProfileMap.RemoveKey(ipKey);
- }
+ pos = m_PatternMap.GetStartPosition();
+ while (pos) {
+ CPDF_Object* ptObj;
+ CPDF_CountedObject<CPDF_Pattern*>* ptData;
+ m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
+ if (!ptData->m_Obj) {
+ continue;
+ }
+ if (bForceRelease || ptData->m_nCount < 2) {
+ ptData->m_Obj->SetForceClear(bForceRelease);
+ delete ptData->m_Obj;
+ ptData->m_Obj = NULL;
}
}
- {
- pos = m_FontFileMap.GetStartPosition();
- while (pos) {
- CPDF_Stream* ftKey;
- CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
- m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);
- nCount = ftData->m_nCount;
- if (bRelease || nCount < 2) {
- delete ftData->m_Obj;
- delete ftData;
- m_FontFileMap.RemoveKey(ftKey);
- }
+ pos = m_ImageMap.GetStartPosition();
+ while (pos) {
+ FX_DWORD objNum;
+ CPDF_CountedObject<CPDF_Image*>* imageData;
+ m_ImageMap.GetNextAssoc(pos, objNum, imageData);
+ if (!imageData->m_Obj) {
+ continue;
+ }
+ if (bForceRelease || imageData->m_nCount < 2) {
+ delete imageData->m_Obj;
+ imageData->m_Obj = NULL;
+ delete imageData;
+ m_ImageMap.RemoveKey(objNum);
}
}
}
}
PDF_DocPageData_Release<FX_DWORD, CPDF_Image*>(m_ImageMap, pImageStream->GetObjNum(), NULL);
}
-CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents)
+CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream)
{
if (!pIccProfileStream) {
return NULL;
ipData->m_nCount++;
return ipData->m_Obj;
}
- CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize(), nComponents);
+ CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize());
if (!pProfile) {
return NULL;
}