From 5cc0a40c39aed4624a89c19fac43e92c68922bc1 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 10 Jun 2015 23:21:52 -0700 Subject: Merge to XFA: Convert CPDF_ImageMap to std::map. Also simplify CPDF_DocPageData::ReleaseIccProfile() since its first argument is always null. R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1149273004. (cherry picked from commit a8a718c974210a919f2af0b099d540143cf330c6) Review URL: https://codereview.chromium.org/1180613004. --- core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp | 140 +++++++++++++++++++-------- 1 file changed, 100 insertions(+), 40 deletions(-) (limited to '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 e00e6cb01c..1c0629f45a 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp @@ -10,6 +10,77 @@ #include "../fpdf_font/font_int.h" #include "pageint.h" +namespace { + +template +KeyType PDF_DocPageData_FindValue( + const CFX_MapPtrTemplate*>& map, + ValueType findValue, + CPDF_CountedObject*& findData) +{ + FX_POSITION pos = map.GetStartPosition(); + while (pos) { + KeyType findKey; + map.GetNextAssoc(pos, findKey, findData); + if (findData->m_Obj == findValue) { + return findKey; + } + } + findData = nullptr; + return (KeyType)nullptr; +} + +template +void PDF_DocPageData_Release( + CFX_MapPtrTemplate*>& map, + KeyType findKey, + ValueType findValue, + FX_BOOL bForce) +{ + if (!findKey && !findValue) + return; + + CPDF_CountedObject* findData = nullptr; + if (!findKey) { + findKey = PDF_DocPageData_FindValue(map, findValue, findData); + } else if (!map.Lookup(findKey, findData)) { + return; + } + if (!findData) + return; + + if ((-- findData->m_nCount) == 0 || bForce) { + delete findData->m_Obj; + delete findData; + map.RemoveKey(findKey); + } +} + +template +void PDF_DocPageData_Release_Key( + KeyType findKey, + FX_BOOL bForce, + std::map*>* map) +{ + if (!findKey) + return; + + CPDF_CountedObject* findData = nullptr; + auto it = map->find(findKey); + if (it != map->end()) + findData = it->second; + if (!findData) + return; + + if ((--findData->m_nCount) == 0 || bForce) { + delete findData->m_Obj; + delete findData; + map->erase(it); + } +} + +} // namespace + class CPDF_PageModule : public CPDF_PageModuleDef { public: @@ -126,12 +197,10 @@ void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj) } CPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc) : m_pPDFDoc(pPDFDoc), - m_ImageMap(), m_IccProfileMap(), m_FontFileMap(), m_bForceClear(FALSE) { - m_ImageMap.InitHashTable(64); m_IccProfileMap.InitHashTable(16); m_FontFileMap.InitHashTable(32); } @@ -230,18 +299,17 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) m_FontFileMap.RemoveKey(ftKey); } } - pos = m_ImageMap.GetStartPosition(); - while (pos) { - FX_DWORD objNum; - CPDF_CountedObject* imageData; - m_ImageMap.GetNextAssoc(pos, objNum, imageData); - if (!imageData->m_Obj) { + + for (auto it = m_ImageMap.begin(); it != m_ImageMap.end();) { + auto curr_it = it++; + CPDF_CountedImage* imageData = curr_it->second; + if (!imageData->m_Obj) continue; - } + if (bForceRelease || imageData->m_nCount < 2) { delete imageData->m_Obj; delete imageData; - m_ImageMap.RemoveKey(objNum); + m_ImageMap.erase(curr_it); } } } @@ -517,30 +585,34 @@ void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj) CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream) { - if (!pImageStream) { - return NULL; - } - FX_DWORD dwImageObjNum = pImageStream->GetObjNum(); - CPDF_CountedObject* imageData; - if (m_ImageMap.Lookup(dwImageObjNum, imageData)) { - imageData->m_nCount ++; + if (!pImageStream) + return nullptr; + + const FX_DWORD dwImageObjNum = pImageStream->GetObjNum(); + auto it = m_ImageMap.find(dwImageObjNum); + if (it != m_ImageMap.end()) { + CPDF_CountedImage* imageData = it->second; + imageData->m_nCount++; return imageData->m_Obj; } - imageData = new CPDF_CountedObject; + CPDF_CountedImage* imageData = new CPDF_CountedImage; CPDF_Image* pImage = new CPDF_Image(m_pPDFDoc); pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE); imageData->m_nCount = 2; imageData->m_Obj = pImage; - m_ImageMap.SetAt(dwImageObjNum, imageData); + m_ImageMap[dwImageObjNum] = imageData; return pImage; } + void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream) { - if (!pImageStream) { + if (!pImageStream) return; - } - PDF_DocPageData_Release(m_ImageMap, pImageStream->GetObjNum(), NULL); + + PDF_DocPageData_Release_Key( + pImageStream->GetObjNum(), FALSE, &m_ImageMap); } + CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream) { if (!pIccProfileStream) { @@ -569,26 +641,14 @@ CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream) m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream); return pProfile; } -void CPDF_DocPageData::ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile) + +void CPDF_DocPageData::ReleaseIccProfile(CPDF_IccProfile* pIccProfile) { - if (!pIccProfileStream && !pIccProfile) { - return; - } - CPDF_CountedObject* ipData = NULL; - if (m_IccProfileMap.Lookup(pIccProfileStream, ipData) && ipData->m_nCount < 2) { - FX_POSITION pos = m_HashProfileMap.GetStartPosition(); - while (pos) { - CFX_ByteString key; - CPDF_Stream* pFindStream = NULL; - m_HashProfileMap.GetNextAssoc(pos, key, (void*&)pFindStream); - if (pIccProfileStream == pFindStream) { - m_HashProfileMap.RemoveKey(key); - break; - } - } - } - PDF_DocPageData_Release(m_IccProfileMap, pIccProfileStream, pIccProfile); + ASSERT(pIccProfile); + PDF_DocPageData_Release( + m_IccProfileMap, nullptr, pIccProfile, FALSE); } + CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream) { if (!pFontStream) { -- cgit v1.2.3