| 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 8e578f6f8f2eb0d6bb7b49f876ee48c5c3525a20..ea8206a65f026081c466e731c4f7b39baedaadf2 100644
|
| --- a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
|
| +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
|
| @@ -147,15 +147,53 @@ CPDF_DocPageData::~CPDF_DocPageData()
|
| {
|
| Clear(FALSE);
|
| Clear(TRUE);
|
| + FX_POSITION pos = NULL;
|
| + pos = m_PatternMap.GetStartPosition();
|
| + while (pos)
|
| + {
|
| + CPDF_Object* ptObj;
|
| + CPDF_CountedObject<CPDF_Pattern*>* ptData;
|
| + m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
|
| + delete ptData;
|
| + }
|
| + m_PatternMap.RemoveAll();
|
| + pos = m_FontMap.GetStartPosition();
|
| + while (pos)
|
| + {
|
| + CPDF_Dictionary* fontDict;
|
| + CPDF_CountedObject<CPDF_Font*>* fontData;
|
| + m_FontMap.GetNextAssoc(pos, fontDict, fontData);
|
| + delete fontData;
|
| + }
|
| + m_FontMap.RemoveAll();
|
| + pos = m_ColorSpaceMap.GetStartPosition();
|
| + while (pos)
|
| + {
|
| + CPDF_Object* csKey;
|
| + CPDF_CountedObject<CPDF_ColorSpace*>* csData;
|
| + m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
|
| + delete csData;
|
| + }
|
| + m_ColorSpaceMap.RemoveAll();
|
| }
|
| void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
|
| {
|
| FX_POSITION pos;
|
| -
|
| 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_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_FontMap.GetStartPosition();
|
| while (pos) {
|
| CPDF_Dictionary* fontDict;
|
| @@ -203,7 +241,6 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
|
| }
|
| }
|
| delete ipData->m_Obj;
|
| - ipData->m_Obj = NULL;
|
| delete ipData;
|
| m_IccProfileMap.RemoveKey(ipKey);
|
| }
|
| @@ -218,25 +255,10 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
|
| }
|
| if (bForceRelease || ftData->m_nCount < 2) {
|
| delete ftData->m_Obj;
|
| - ftData->m_Obj = NULL;
|
| delete ftData;
|
| m_FontFileMap.RemoveKey(ftKey);
|
| }
|
| }
|
| - 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_ImageMap.GetStartPosition();
|
| while (pos) {
|
| FX_DWORD objNum;
|
| @@ -247,7 +269,6 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
|
| }
|
| if (bForceRelease || imageData->m_nCount < 2) {
|
| delete imageData->m_Obj;
|
| - imageData->m_Obj = NULL;
|
| delete imageData;
|
| m_ImageMap.RemoveKey(objNum);
|
| }
|
| @@ -653,4 +674,24 @@ void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOO
|
| return;
|
| }
|
| PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontStream, NULL, bForce);
|
| +}
|
| +CPDF_ColorSpace** CPDF_DocPageData::FindColorSpacePtr(CPDF_Object* pCSObj)
|
| +{
|
| + if (!pCSObj) return NULL;
|
| + CPDF_CountedObject<CPDF_ColorSpace*>* csData;
|
| + if (m_ColorSpaceMap.Lookup(pCSObj, csData))
|
| + {
|
| + return &csData->m_Obj;
|
| + }
|
| + return NULL;
|
| }
|
| +CPDF_Pattern** CPDF_DocPageData::FindPatternPtr(CPDF_Object* pPatternObj)
|
| +{
|
| + if (!pPatternObj) return NULL;
|
| + CPDF_CountedObject<CPDF_Pattern*>* ptData;
|
| + if (m_PatternMap.Lookup(pPatternObj, ptData))
|
| + {
|
| + return &ptData->m_Obj;
|
| + }
|
| + return NULL;
|
| +}
|
|
|