| Index: core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
|
| index 77db4534fbd27f345ede1a73f9cb5ce3bbaea08e..8e578f6f8f2eb0d6bb7b49f876ee48c5c3525a20 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)
|
| {
|
|
|