summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp64
1 files changed, 41 insertions, 23 deletions
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
index 77db4534fb..8e578f6f8f 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
@@ -151,39 +151,34 @@ CPDF_DocPageData::~CPDF_DocPageData()
void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
{
FX_POSITION pos;
- FX_DWORD nCount;
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);
- nCount = fontData->m_nCount;
- if (bForceRelease || nCount < 2) {
+ if (!fontData->m_Obj) {
+ continue;
+ }
+ if (bForceRelease || fontData->m_nCount < 2) {
delete fontData->m_Obj;
fontData->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 (bForceRelease || nCount < 2) {
- delete imageData->m_Obj;
- delete imageData;
- m_ImageMap.RemoveKey(objNum);
- }
- }
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 (bForceRelease || nCount < 2) {
+ 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;
}
@@ -193,8 +188,10 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
CPDF_Stream* ipKey;
CPDF_CountedObject<CPDF_IccProfile*>* ipData;
m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData);
- nCount = ipData->m_nCount;
- if (bForceRelease || nCount < 2) {
+ if (!ipData->m_Obj) {
+ continue;
+ }
+ if (bForceRelease || ipData->m_nCount < 2) {
FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();
while (pos2) {
CFX_ByteString bsKey;
@@ -206,6 +203,7 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
}
}
delete ipData->m_Obj;
+ ipData->m_Obj = NULL;
delete ipData;
m_IccProfileMap.RemoveKey(ipKey);
}
@@ -215,9 +213,12 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
CPDF_Stream* ftKey;
CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);
- nCount = ftData->m_nCount;
- if (bForceRelease || nCount < 2) {
+ 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);
}
@@ -227,13 +228,30 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
CPDF_Object* ptObj;
CPDF_CountedObject<CPDF_Pattern*>* ptData;
m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
- nCount = ptData->m_nCount;
- if (bForceRelease || nCount < 2) {
+ 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_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);
+ }
+ }
}
CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly)
{