Index: xfa/fxfa/app/xfa_ffdoc.cpp |
diff --git a/xfa/fxfa/app/xfa_ffdoc.cpp b/xfa/fxfa/app/xfa_ffdoc.cpp |
index 4b0f67bb6a00c75de01b473a5a077b39b7310a66..0acd9a59ce3bf96ec23d1fc7d7cacb8a83a3160e 100644 |
--- a/xfa/fxfa/app/xfa_ffdoc.cpp |
+++ b/xfa/fxfa/app/xfa_ffdoc.cpp |
@@ -6,6 +6,8 @@ |
#include "xfa/fxfa/include/xfa_ffdoc.h" |
+#include <algorithm> |
+ |
#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
#include "core/fpdfdoc/include/fpdf_doc.h" |
@@ -188,37 +190,27 @@ void CXFA_FFDoc::StopLoad() { |
m_dwDocType = XFA_DOCTYPE_Dynamic; |
} |
} |
+ |
CXFA_FFDocView* CXFA_FFDoc::CreateDocView(uint32_t dwView) { |
- CXFA_FFDocView* pDocView = |
- (CXFA_FFDocView*)m_mapTypeToDocView.GetValueAt((void*)(uintptr_t)dwView); |
- if (!pDocView) { |
- pDocView = new CXFA_FFDocView(this); |
- m_mapTypeToDocView.SetAt((void*)(uintptr_t)dwView, pDocView); |
- } |
- return pDocView; |
+ if (!m_TypeToDocViewMap[dwView]) |
+ m_TypeToDocViewMap[dwView].reset(new CXFA_FFDocView(this)); |
+ |
+ return m_TypeToDocViewMap[dwView].get(); |
} |
+ |
CXFA_FFDocView* CXFA_FFDoc::GetDocView(CXFA_LayoutProcessor* pLayout) { |
- FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); |
- while (ps) { |
- void* pType; |
- CXFA_FFDocView* pDocView; |
- m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView); |
- if (pDocView->GetXFALayout() == pLayout) { |
- return pDocView; |
- } |
+ for (const auto& pair : m_TypeToDocViewMap) { |
+ if (pair.second->GetXFALayout() == pLayout) |
+ return pair.second.get(); |
} |
- return NULL; |
+ return nullptr; |
} |
+ |
CXFA_FFDocView* CXFA_FFDoc::GetDocView() { |
- FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); |
- if (ps) { |
- void* pType; |
- CXFA_FFDocView* pDocView; |
- m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView); |
- return pDocView; |
- } |
- return NULL; |
+ auto it = m_TypeToDocViewMap.begin(); |
+ return it != m_TypeToDocViewMap.end() ? it->second.get() : nullptr; |
} |
+ |
FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) { |
m_bOwnStream = bTakeOverFile; |
m_pStream = pStream; |
@@ -264,53 +256,35 @@ FX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) { |
return TRUE; |
} |
FX_BOOL CXFA_FFDoc::CloseDoc() { |
- FX_POSITION psClose = m_mapTypeToDocView.GetStartPosition(); |
- while (psClose) { |
- void* pType; |
- CXFA_FFDocView* pDocView; |
- m_mapTypeToDocView.GetNextAssoc(psClose, pType, (void*&)pDocView); |
- pDocView->RunDocClose(); |
- } |
- if (m_pDocument) { |
+ for (const auto& pair : m_TypeToDocViewMap) |
+ pair.second->RunDocClose(); |
+ |
+ if (m_pDocument) |
m_pDocument->ClearLayoutData(); |
- } |
- FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); |
- while (ps) { |
- void* pType; |
- CXFA_FFDocView* pDocView; |
- m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView); |
- delete pDocView; |
- } |
- m_mapTypeToDocView.RemoveAll(); |
+ |
+ m_TypeToDocViewMap.clear(); |
+ |
if (m_pDocument) { |
- IXFA_Parser* pParser = m_pDocument->GetParser(); |
- pParser->Release(); |
- m_pDocument = NULL; |
- } |
- if (m_pNotify) { |
- delete m_pNotify; |
- m_pNotify = NULL; |
+ m_pDocument->GetParser()->Release(); |
+ m_pDocument = nullptr; |
} |
+ |
+ delete m_pNotify; |
+ m_pNotify = nullptr; |
+ |
m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this); |
+ |
if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) { |
m_pStream->Release(); |
- m_pStream = NULL; |
+ m_pStream = nullptr; |
} |
- ps = m_mapNamedImages.GetStartPosition(); |
- while (ps) { |
- void* pName; |
- FX_IMAGEDIB_AND_DPI* pImage = NULL; |
- m_mapNamedImages.GetNextAssoc(ps, pName, (void*&)pImage); |
- if (pImage) { |
- delete pImage->pDibSource; |
- pImage->pDibSource = NULL; |
- FX_Free(pImage); |
- pImage = NULL; |
- } |
- } |
- m_mapNamedImages.RemoveAll(); |
- IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver(); |
- pNoteDriver->ClearEventTargets(FALSE); |
+ |
+ for (const auto& pair : m_HashToDibDpiMap) |
+ delete pair.second.pDibSource; |
+ |
+ m_HashToDibDpiMap.clear(); |
+ |
+ FWL_GetApp()->GetNoteDriver()->ClearEventTargets(FALSE); |
return TRUE; |
} |
void CXFA_FFDoc::SetDocType(uint32_t dwType) { |
@@ -327,11 +301,11 @@ CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName, |
return nullptr; |
uint32_t dwHash = FX_HashCode_GetW(wsName, false); |
- FX_IMAGEDIB_AND_DPI* imageDIBDpi = nullptr; |
- if (m_mapNamedImages.Lookup((void*)(uintptr_t)dwHash, (void*&)imageDIBDpi)) { |
- iImageXDpi = imageDIBDpi->iImageXDpi; |
- iImageYDpi = imageDIBDpi->iImageYDpi; |
- return static_cast<CFX_DIBitmap*>(imageDIBDpi->pDibSource); |
+ auto it = m_HashToDibDpiMap.find(dwHash); |
+ if (it != m_HashToDibDpiMap.end()) { |
+ iImageXDpi = it->second.iImageXDpi; |
+ iImageYDpi = it->second.iImageYDpi; |
+ return static_cast<CFX_DIBitmap*>(it->second.pDibSource); |
} |
CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot(); |
@@ -360,26 +334,21 @@ CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName, |
} |
} |
- if (!pObject || !pObject->IsStream()) |
+ CPDF_Stream* pStream = ToStream(pObject); |
+ if (!pStream) |
return nullptr; |
- if (!imageDIBDpi) { |
- imageDIBDpi = FX_Alloc(FX_IMAGEDIB_AND_DPI, 1); |
- imageDIBDpi->pDibSource = nullptr; |
- imageDIBDpi->iImageXDpi = 0; |
- imageDIBDpi->iImageYDpi = 0; |
- CPDF_StreamAcc streamAcc; |
- streamAcc.LoadAllData((CPDF_Stream*)pObject); |
- IFX_FileRead* pImageFileRead = FX_CreateMemoryStream( |
- (uint8_t*)streamAcc.GetData(), streamAcc.GetSize()); |
- imageDIBDpi->pDibSource = XFA_LoadImageFromBuffer( |
- pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi); |
- imageDIBDpi->iImageXDpi = iImageXDpi; |
- imageDIBDpi->iImageYDpi = iImageYDpi; |
- pImageFileRead->Release(); |
- } |
- m_mapNamedImages.SetAt((void*)(uintptr_t)dwHash, imageDIBDpi); |
- return (CFX_DIBitmap*)imageDIBDpi->pDibSource; |
+ CPDF_StreamAcc streamAcc; |
+ streamAcc.LoadAllData(pStream); |
+ |
+ IFX_FileRead* pImageFileRead = |
+ FX_CreateMemoryStream((uint8_t*)streamAcc.GetData(), streamAcc.GetSize()); |
+ |
+ CFX_DIBitmap* pDibSource = XFA_LoadImageFromBuffer( |
+ pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi); |
+ m_HashToDibDpiMap[dwHash] = {pDibSource, iImageXDpi, iImageYDpi}; |
+ pImageFileRead->Release(); |
+ return pDibSource; |
} |
CFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) { |