OLD | NEW |
---|---|
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fxfa/include/xfa_ffdoc.h" | 7 #include "xfa/fxfa/include/xfa_ffdoc.h" |
8 | 8 |
9 #include <algorithm> | |
10 | |
9 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
11 #include "core/fpdfdoc/include/fpdf_doc.h" | 13 #include "core/fpdfdoc/include/fpdf_doc.h" |
12 #include "core/fxcrt/include/fx_ext.h" | 14 #include "core/fxcrt/include/fx_ext.h" |
13 #include "core/fxcrt/include/fx_memory.h" | 15 #include "core/fxcrt/include/fx_memory.h" |
14 #include "xfa/fde/xml/fde_xml_imp.h" | 16 #include "xfa/fde/xml/fde_xml_imp.h" |
15 #include "xfa/fgas/crt/fgas_algorithm.h" | 17 #include "xfa/fgas/crt/fgas_algorithm.h" |
16 #include "xfa/fwl/core/ifwl_notedriver.h" | 18 #include "xfa/fwl/core/ifwl_notedriver.h" |
17 #include "xfa/fxfa/app/xfa_ffnotify.h" | 19 #include "xfa/fxfa/app/xfa_ffnotify.h" |
18 #include "xfa/fxfa/include/xfa_checksum.h" | 20 #include "xfa/fxfa/include/xfa_checksum.h" |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
181 CXFA_Node* pDynamicRender = | 183 CXFA_Node* pDynamicRender = |
182 pAcrobat7->GetFirstChildByClass(XFA_ELEMENT_DynamicRender); | 184 pAcrobat7->GetFirstChildByClass(XFA_ELEMENT_DynamicRender); |
183 if (!pDynamicRender) { | 185 if (!pDynamicRender) { |
184 return; | 186 return; |
185 } | 187 } |
186 CFX_WideString wsType; | 188 CFX_WideString wsType; |
187 if (pDynamicRender->TryContent(wsType) && wsType == FX_WSTRC(L"required")) { | 189 if (pDynamicRender->TryContent(wsType) && wsType == FX_WSTRC(L"required")) { |
188 m_dwDocType = XFA_DOCTYPE_Dynamic; | 190 m_dwDocType = XFA_DOCTYPE_Dynamic; |
189 } | 191 } |
190 } | 192 } |
193 | |
191 CXFA_FFDocView* CXFA_FFDoc::CreateDocView(uint32_t dwView) { | 194 CXFA_FFDocView* CXFA_FFDoc::CreateDocView(uint32_t dwView) { |
192 CXFA_FFDocView* pDocView = | 195 auto it = m_TypeToDocViewMap.find(dwView); |
193 (CXFA_FFDocView*)m_mapTypeToDocView.GetValueAt((void*)(uintptr_t)dwView); | 196 if (it != m_TypeToDocViewMap.end()) |
194 if (!pDocView) { | 197 return it->second; |
195 pDocView = new CXFA_FFDocView(this); | 198 |
196 m_mapTypeToDocView.SetAt((void*)(uintptr_t)dwView, pDocView); | 199 CXFA_FFDocView* pDocView = new CXFA_FFDocView(this); |
197 } | 200 m_TypeToDocViewMap[dwView] = pDocView; |
198 return pDocView; | 201 return pDocView; |
199 } | 202 } |
203 | |
200 CXFA_FFDocView* CXFA_FFDoc::GetDocView(CXFA_LayoutProcessor* pLayout) { | 204 CXFA_FFDocView* CXFA_FFDoc::GetDocView(CXFA_LayoutProcessor* pLayout) { |
201 FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); | 205 auto it = |
202 while (ps) { | 206 std::find_if(m_TypeToDocViewMap.begin(), m_TypeToDocViewMap.end(), |
203 void* pType; | 207 [pLayout](const std::pair<uint32_t, CXFA_FFDocView*>& pair) { |
204 CXFA_FFDocView* pDocView; | 208 return pair.second->GetXFALayout() == pLayout; |
205 m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView); | 209 }); |
206 if (pDocView->GetXFALayout() == pLayout) { | 210 return it != m_TypeToDocViewMap.end() ? it->second : nullptr; |
207 return pDocView; | |
208 } | |
209 } | |
210 return NULL; | |
211 } | 211 } |
212 | |
212 CXFA_FFDocView* CXFA_FFDoc::GetDocView() { | 213 CXFA_FFDocView* CXFA_FFDoc::GetDocView() { |
213 FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); | 214 auto it = m_TypeToDocViewMap.begin(); |
214 if (ps) { | 215 return it != m_TypeToDocViewMap.end() ? it->second : nullptr; |
215 void* pType; | |
216 CXFA_FFDocView* pDocView; | |
217 m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView); | |
218 return pDocView; | |
219 } | |
220 return NULL; | |
221 } | 216 } |
217 | |
222 FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) { | 218 FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) { |
223 m_bOwnStream = bTakeOverFile; | 219 m_bOwnStream = bTakeOverFile; |
224 m_pStream = pStream; | 220 m_pStream = pStream; |
225 return TRUE; | 221 return TRUE; |
226 } | 222 } |
227 FX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) { | 223 FX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) { |
228 if (pPDFDoc == NULL) { | 224 if (pPDFDoc == NULL) { |
229 return FALSE; | 225 return FALSE; |
230 } | 226 } |
231 CPDF_Dictionary* pRoot = pPDFDoc->GetRoot(); | 227 CPDF_Dictionary* pRoot = pPDFDoc->GetRoot(); |
(...skipping 25 matching lines...) Expand all Loading... | |
257 m_pPDFDoc = pPDFDoc; | 253 m_pPDFDoc = pPDFDoc; |
258 if (m_pStream) { | 254 if (m_pStream) { |
259 m_pStream->Release(); | 255 m_pStream->Release(); |
260 m_pStream = NULL; | 256 m_pStream = NULL; |
261 } | 257 } |
262 m_pStream = pFileRead; | 258 m_pStream = pFileRead; |
263 m_bOwnStream = TRUE; | 259 m_bOwnStream = TRUE; |
264 return TRUE; | 260 return TRUE; |
265 } | 261 } |
266 FX_BOOL CXFA_FFDoc::CloseDoc() { | 262 FX_BOOL CXFA_FFDoc::CloseDoc() { |
267 FX_POSITION psClose = m_mapTypeToDocView.GetStartPosition(); | 263 for (const auto& pair : m_TypeToDocViewMap) |
268 while (psClose) { | 264 pair.second->RunDocClose(); |
269 void* pType; | 265 |
270 CXFA_FFDocView* pDocView; | 266 if (m_pDocument) |
271 m_mapTypeToDocView.GetNextAssoc(psClose, pType, (void*&)pDocView); | 267 m_pDocument->ClearLayoutData(); |
272 pDocView->RunDocClose(); | 268 |
269 for (const auto& pair : m_TypeToDocViewMap) | |
270 delete pair.second; | |
271 | |
272 m_TypeToDocViewMap.clear(); | |
273 | |
274 if (m_pDocument) { | |
275 m_pDocument->GetParser()->Release(); | |
276 m_pDocument = nullptr; | |
273 } | 277 } |
274 if (m_pDocument) { | 278 |
275 m_pDocument->ClearLayoutData(); | 279 delete m_pNotify; |
276 } | 280 m_pNotify = nullptr; |
277 FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); | 281 |
278 while (ps) { | |
279 void* pType; | |
280 CXFA_FFDocView* pDocView; | |
281 m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView); | |
282 delete pDocView; | |
283 } | |
284 m_mapTypeToDocView.RemoveAll(); | |
285 if (m_pDocument) { | |
286 IXFA_Parser* pParser = m_pDocument->GetParser(); | |
287 pParser->Release(); | |
288 m_pDocument = NULL; | |
289 } | |
290 if (m_pNotify) { | |
291 delete m_pNotify; | |
292 m_pNotify = NULL; | |
293 } | |
294 m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this); | 282 m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this); |
283 | |
295 if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) { | 284 if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) { |
296 m_pStream->Release(); | 285 m_pStream->Release(); |
297 m_pStream = NULL; | 286 m_pStream = nullptr; |
298 } | 287 } |
299 ps = m_mapNamedImages.GetStartPosition(); | 288 |
300 while (ps) { | 289 for (const auto& pair : m_HashToDibDpiMap) |
301 void* pName; | 290 delete pair.second.pDibSource; |
302 FX_IMAGEDIB_AND_DPI* pImage = NULL; | 291 |
303 m_mapNamedImages.GetNextAssoc(ps, pName, (void*&)pImage); | 292 m_HashToDibDpiMap.clear(); |
304 if (pImage) { | 293 |
305 delete pImage->pDibSource; | 294 FWL_GetApp()->GetNoteDriver()->ClearEventTargets(FALSE); |
306 pImage->pDibSource = NULL; | |
307 FX_Free(pImage); | |
308 pImage = NULL; | |
309 } | |
310 } | |
311 m_mapNamedImages.RemoveAll(); | |
312 IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver(); | |
313 pNoteDriver->ClearEventTargets(FALSE); | |
314 return TRUE; | 295 return TRUE; |
315 } | 296 } |
316 void CXFA_FFDoc::SetDocType(uint32_t dwType) { | 297 void CXFA_FFDoc::SetDocType(uint32_t dwType) { |
317 m_dwDocType = dwType; | 298 m_dwDocType = dwType; |
318 } | 299 } |
319 CPDF_Document* CXFA_FFDoc::GetPDFDoc() { | 300 CPDF_Document* CXFA_FFDoc::GetPDFDoc() { |
320 return m_pPDFDoc; | 301 return m_pPDFDoc; |
321 } | 302 } |
322 | 303 |
323 CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName, | 304 CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName, |
Tom Sepez
2016/04/22 19:16:41
Should this just return a DIBDPI struct?
Tom Sepez
2016/04/22 21:51:40
Ah, lets just leave it for the moment.
| |
324 int32_t& iImageXDpi, | 305 int32_t& iImageXDpi, |
325 int32_t& iImageYDpi) { | 306 int32_t& iImageYDpi) { |
326 if (!m_pPDFDoc) | 307 if (!m_pPDFDoc) |
327 return nullptr; | 308 return nullptr; |
328 | 309 |
329 uint32_t dwHash = | 310 uint32_t dwHash = |
330 FX_HashCode_String_GetW(wsName.c_str(), wsName.GetLength(), FALSE); | 311 FX_HashCode_String_GetW(wsName.c_str(), wsName.GetLength(), FALSE); |
331 FX_IMAGEDIB_AND_DPI* imageDIBDpi = nullptr; | 312 auto it = m_HashToDibDpiMap.find(dwHash); |
332 if (m_mapNamedImages.Lookup((void*)(uintptr_t)dwHash, (void*&)imageDIBDpi)) { | 313 if (it != m_HashToDibDpiMap.end()) { |
333 iImageXDpi = imageDIBDpi->iImageXDpi; | 314 iImageXDpi = it->second.iImageXDpi; |
334 iImageYDpi = imageDIBDpi->iImageYDpi; | 315 iImageYDpi = it->second.iImageYDpi; |
335 return static_cast<CFX_DIBitmap*>(imageDIBDpi->pDibSource); | 316 return static_cast<CFX_DIBitmap*>(it->second.pDibSource); |
336 } | 317 } |
337 | 318 |
338 CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot(); | 319 CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot(); |
339 if (!pRoot) | 320 if (!pRoot) |
340 return nullptr; | 321 return nullptr; |
341 | 322 |
342 CPDF_Dictionary* pNames = pRoot->GetDictBy("Names"); | 323 CPDF_Dictionary* pNames = pRoot->GetDictBy("Names"); |
343 if (!pNames) | 324 if (!pNames) |
344 return nullptr; | 325 return nullptr; |
345 | 326 |
346 CPDF_Dictionary* pXFAImages = pNames->GetDictBy("XFAImages"); | 327 CPDF_Dictionary* pXFAImages = pNames->GetDictBy("XFAImages"); |
347 if (!pXFAImages) | 328 if (!pXFAImages) |
348 return nullptr; | 329 return nullptr; |
349 | 330 |
350 CPDF_NameTree nametree(pXFAImages); | 331 CPDF_NameTree nametree(pXFAImages); |
351 CFX_ByteString bsName = PDF_EncodeText(wsName.c_str(), wsName.GetLength()); | 332 CFX_ByteString bsName = PDF_EncodeText(wsName.c_str(), wsName.GetLength()); |
352 CPDF_Object* pObject = nametree.LookupValue(bsName); | 333 CPDF_Object* pObject = nametree.LookupValue(bsName); |
353 if (!pObject) { | 334 if (!pObject) { |
354 for (size_t i = 0; i < nametree.GetCount(); i++) { | 335 for (size_t i = 0; i < nametree.GetCount(); i++) { |
355 CFX_ByteString bsTemp; | 336 CFX_ByteString bsTemp; |
356 CPDF_Object* pTempObject = nametree.LookupValue(i, bsTemp); | 337 CPDF_Object* pTempObject = nametree.LookupValue(i, bsTemp); |
357 if (bsTemp == bsName) { | 338 if (bsTemp == bsName) { |
358 pObject = pTempObject; | 339 pObject = pTempObject; |
359 break; | 340 break; |
360 } | 341 } |
361 } | 342 } |
362 } | 343 } |
363 | 344 |
364 if (!pObject || !pObject->IsStream()) | 345 if (!pObject || !pObject->IsStream()) |
Lei Zhang
2016/04/22 23:37:50
CPDF_Stream* pStream = ToStream(pObject);
if (!pSt
Tom Sepez
2016/04/25 18:23:06
Done.
| |
365 return nullptr; | 346 return nullptr; |
366 | 347 |
367 if (!imageDIBDpi) { | 348 CPDF_StreamAcc streamAcc; |
368 imageDIBDpi = FX_Alloc(FX_IMAGEDIB_AND_DPI, 1); | 349 streamAcc.LoadAllData((CPDF_Stream*)pObject); |
369 imageDIBDpi->pDibSource = nullptr; | 350 |
370 imageDIBDpi->iImageXDpi = 0; | 351 IFX_FileRead* pImageFileRead = |
371 imageDIBDpi->iImageYDpi = 0; | 352 FX_CreateMemoryStream((uint8_t*)streamAcc.GetData(), streamAcc.GetSize()); |
372 CPDF_StreamAcc streamAcc; | 353 |
373 streamAcc.LoadAllData((CPDF_Stream*)pObject); | 354 CFX_DIBitmap* pDibSource = XFA_LoadImageFromBuffer( |
374 IFX_FileRead* pImageFileRead = FX_CreateMemoryStream( | 355 pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi); |
375 (uint8_t*)streamAcc.GetData(), streamAcc.GetSize()); | 356 m_HashToDibDpiMap[dwHash] = {pDibSource, iImageXDpi, iImageYDpi}; |
376 imageDIBDpi->pDibSource = XFA_LoadImageFromBuffer( | 357 pImageFileRead->Release(); |
377 pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi); | 358 return pDibSource; |
378 imageDIBDpi->iImageXDpi = iImageXDpi; | |
379 imageDIBDpi->iImageYDpi = iImageYDpi; | |
380 pImageFileRead->Release(); | |
381 } | |
382 m_mapNamedImages.SetAt((void*)(uintptr_t)dwHash, imageDIBDpi); | |
383 return (CFX_DIBitmap*)imageDIBDpi->pDibSource; | |
384 } | 359 } |
385 | 360 |
386 CFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) { | 361 CFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) { |
387 uint32_t packetHash = | 362 uint32_t packetHash = |
388 FX_HashCode_String_GetW(wsPackage.c_str(), wsPackage.GetLength()); | 363 FX_HashCode_String_GetW(wsPackage.c_str(), wsPackage.GetLength()); |
389 CXFA_Node* pNode = ToNode(m_pDocument->GetXFAObject(packetHash)); | 364 CXFA_Node* pNode = ToNode(m_pDocument->GetXFAObject(packetHash)); |
390 if (!pNode) { | 365 if (!pNode) { |
391 return NULL; | 366 return NULL; |
392 } | 367 } |
393 CFDE_XMLNode* pXMLNode = pNode->GetXMLMappingNode(); | 368 CFDE_XMLNode* pXMLNode = pNode->GetXMLMappingNode(); |
(...skipping 26 matching lines...) Expand all Loading... | |
420 } | 395 } |
421 pExport->Release(); | 396 pExport->Release(); |
422 return bFlags; | 397 return bFlags; |
423 } | 398 } |
424 FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) { | 399 FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) { |
425 std::unique_ptr<CXFA_DataImporter, ReleaseDeleter<CXFA_DataImporter>> | 400 std::unique_ptr<CXFA_DataImporter, ReleaseDeleter<CXFA_DataImporter>> |
426 importer(new CXFA_DataImporter(m_pDocument)); | 401 importer(new CXFA_DataImporter(m_pDocument)); |
427 | 402 |
428 return importer->ImportData(pStream); | 403 return importer->ImportData(pStream); |
429 } | 404 } |
OLD | NEW |