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 "public/fpdfview.h" | 7 #include "public/fpdfview.h" |
8 | 8 |
9 #ifdef PDF_ENABLE_XFA | |
9 #include "../include/fpdfxfa/fpdfxfa_app.h" | 10 #include "../include/fpdfxfa/fpdfxfa_app.h" |
10 #include "../include/fpdfxfa/fpdfxfa_doc.h" | 11 #include "../include/fpdfxfa/fpdfxfa_doc.h" |
11 #include "../include/fpdfxfa/fpdfxfa_page.h" | 12 #include "../include/fpdfxfa/fpdfxfa_page.h" |
12 #include "../include/fpdfxfa/fpdfxfa_util.h" | 13 #include "../include/fpdfxfa/fpdfxfa_util.h" |
13 #include "core/include/fpdfapi/fpdf_module.h" | 14 #include "core/include/fpdfapi/fpdf_module.h" |
15 #endif | |
14 #include "core/include/fxcodec/fx_codec.h" | 16 #include "core/include/fxcodec/fx_codec.h" |
15 #include "core/include/fxcrt/fx_safe_types.h" | 17 #include "core/include/fxcrt/fx_safe_types.h" |
16 #include "fpdfsdk/include/fsdk_define.h" | 18 #include "fpdfsdk/include/fsdk_define.h" |
17 #include "fpdfsdk/include/fsdk_mgr.h" | 19 #include "fpdfsdk/include/fsdk_mgr.h" |
18 #include "fpdfsdk/include/fsdk_rendercontext.h" | 20 #include "fpdfsdk/include/fsdk_rendercontext.h" |
19 #include "fpdfsdk/include/javascript/IJavaScript.h" | 21 #include "fpdfsdk/include/javascript/IJavaScript.h" |
20 #include "public/fpdf_ext.h" | 22 #include "public/fpdf_ext.h" |
23 #ifdef PDF_ENABLE_XFA | |
21 #include "public/fpdf_formfill.h" | 24 #include "public/fpdf_formfill.h" |
25 #endif | |
22 #include "public/fpdf_progressive.h" | 26 #include "public/fpdf_progressive.h" |
23 #include "third_party/base/nonstd_unique_ptr.h" | 27 #include "third_party/base/nonstd_unique_ptr.h" |
24 #include "third_party/base/numerics/safe_conversions_impl.h" | 28 #include "third_party/base/numerics/safe_conversions_impl.h" |
25 | 29 |
26 UnderlyingDocumentType* UnderlyingFromFPDFDocument(FPDF_DOCUMENT doc) { | 30 UnderlyingDocumentType* UnderlyingFromFPDFDocument(FPDF_DOCUMENT doc) { |
27 return static_cast<UnderlyingDocumentType*>(doc); | 31 return static_cast<UnderlyingDocumentType*>(doc); |
28 } | 32 } |
29 | 33 |
30 FPDF_DOCUMENT FPDFDocumentFromUnderlying(UnderlyingDocumentType* doc) { | 34 FPDF_DOCUMENT FPDFDocumentFromUnderlying(UnderlyingDocumentType* doc) { |
31 return static_cast<FPDF_DOCUMENT>(doc); | 35 return static_cast<FPDF_DOCUMENT>(doc); |
32 } | 36 } |
33 | 37 |
34 UnderlyingPageType* UnderlyingFromFPDFPage(FPDF_PAGE page) { | 38 UnderlyingPageType* UnderlyingFromFPDFPage(FPDF_PAGE page) { |
35 return static_cast<UnderlyingPageType*>(page); | 39 return static_cast<UnderlyingPageType*>(page); |
36 } | 40 } |
37 | 41 |
38 CPDF_Document* CPDFDocumentFromFPDFDocument(FPDF_DOCUMENT doc) { | 42 CPDF_Document* CPDFDocumentFromFPDFDocument(FPDF_DOCUMENT doc) { |
43 #ifndef PDF_ENABLE_XFA | |
44 return UnderlyingFromFPDFDocument(doc); | |
45 #else | |
39 return doc ? UnderlyingFromFPDFDocument(doc)->GetPDFDoc() : nullptr; | 46 return doc ? UnderlyingFromFPDFDocument(doc)->GetPDFDoc() : nullptr; |
47 #endif | |
40 } | 48 } |
41 | 49 |
42 FPDF_DOCUMENT FPDFDocumentFromCPDFDocument(CPDF_Document* doc) { | 50 FPDF_DOCUMENT FPDFDocumentFromCPDFDocument(CPDF_Document* doc) { |
51 #ifndef PDF_ENABLE_XFA | |
52 return FPDFDocumentFromUnderlying(doc); | |
53 #else | |
43 return doc ? FPDFDocumentFromUnderlying( | 54 return doc ? FPDFDocumentFromUnderlying( |
44 new CPDFXFA_Document(doc, CPDFXFA_App::GetInstance())) | 55 new CPDFXFA_Document(doc, CPDFXFA_App::GetInstance())) |
45 : nullptr; | 56 : nullptr; |
57 #endif | |
46 } | 58 } |
47 | 59 |
48 CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page) { | 60 CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page) { |
61 #ifndef PDF_ENABLE_XFA | |
62 return UnderlyingFromFPDFPage(page); | |
63 #else | |
49 return page ? UnderlyingFromFPDFPage(page)->GetPDFPage() : nullptr; | 64 return page ? UnderlyingFromFPDFPage(page)->GetPDFPage() : nullptr; |
Lei Zhang
2015/11/25 00:34:30
#endif here, and another #if PDF_ENABLE_XFA for CF
Tom Sepez
2015/11/25 21:45:30
Yup, manual cleanup to follow. diff is too good a
| |
50 } | 65 } |
51 | 66 |
52 CFPDF_FileStream::CFPDF_FileStream(FPDF_FILEHANDLER* pFS) { | 67 CFPDF_FileStream::CFPDF_FileStream(FPDF_FILEHANDLER* pFS) { |
53 m_pFS = pFS; | 68 m_pFS = pFS; |
54 m_nCurPos = 0; | 69 m_nCurPos = 0; |
55 } | 70 } |
56 | 71 |
57 IFX_FileStream* CFPDF_FileStream::Retain() { | 72 IFX_FileStream* CFPDF_FileStream::Retain() { |
58 return this; | 73 return this; |
59 } | 74 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
119 return TRUE; | 134 return TRUE; |
120 } | 135 } |
121 return FALSE; | 136 return FALSE; |
122 } | 137 } |
123 | 138 |
124 FX_BOOL CFPDF_FileStream::Flush() { | 139 FX_BOOL CFPDF_FileStream::Flush() { |
125 if (!m_pFS || !m_pFS->Flush) | 140 if (!m_pFS || !m_pFS->Flush) |
126 return TRUE; | 141 return TRUE; |
127 | 142 |
128 return m_pFS->Flush(m_pFS->clientData) == 0; | 143 return m_pFS->Flush(m_pFS->clientData) == 0; |
144 #endif | |
129 } | 145 } |
130 | 146 |
131 CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess) { | 147 CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess) { |
132 m_FileAccess = *pFileAccess; | 148 m_FileAccess = *pFileAccess; |
149 #ifdef PDF_ENABLE_XFA | |
133 m_BufferOffset = (FX_DWORD)-1; | 150 m_BufferOffset = (FX_DWORD)-1; |
134 } | 151 } |
135 | 152 |
136 FX_BOOL CPDF_CustomAccess::GetByte(FX_DWORD pos, uint8_t& ch) { | 153 FX_BOOL CPDF_CustomAccess::GetByte(FX_DWORD pos, uint8_t& ch) { |
137 if (pos >= m_FileAccess.m_FileLen) | 154 if (pos >= m_FileAccess.m_FileLen) |
138 return FALSE; | 155 return FALSE; |
139 if (m_BufferOffset == (FX_DWORD)-1 || pos < m_BufferOffset || | 156 if (m_BufferOffset == (FX_DWORD)-1 || pos < m_BufferOffset || |
140 pos >= m_BufferOffset + 512) { | 157 pos >= m_BufferOffset + 512) { |
141 // Need to read from file access | 158 // Need to read from file access |
142 m_BufferOffset = pos; | 159 m_BufferOffset = pos; |
143 int size = 512; | 160 int size = 512; |
144 if (pos + 512 > m_FileAccess.m_FileLen) | 161 if (pos + 512 > m_FileAccess.m_FileLen) |
145 size = m_FileAccess.m_FileLen - pos; | 162 size = m_FileAccess.m_FileLen - pos; |
146 if (!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, m_BufferOffset, m_Buffer, | 163 if (!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, m_BufferOffset, m_Buffer, |
147 size)) | 164 size)) |
148 return FALSE; | 165 return FALSE; |
149 } | 166 } |
150 ch = m_Buffer[pos - m_BufferOffset]; | 167 ch = m_Buffer[pos - m_BufferOffset]; |
151 return TRUE; | 168 return TRUE; |
152 } | 169 } |
153 | 170 |
154 FX_BOOL CPDF_CustomAccess::GetBlock(FX_DWORD pos, | 171 FX_BOOL CPDF_CustomAccess::GetBlock(FX_DWORD pos, |
155 uint8_t* pBuf, | 172 uint8_t* pBuf, |
156 FX_DWORD size) { | 173 FX_DWORD size) { |
157 if (pos + size > m_FileAccess.m_FileLen) | 174 if (pos + size > m_FileAccess.m_FileLen) |
158 return FALSE; | 175 return FALSE; |
159 return m_FileAccess.m_GetBlock(m_FileAccess.m_Param, pos, pBuf, size); | 176 return m_FileAccess.m_GetBlock(m_FileAccess.m_Param, pos, pBuf, size); |
177 #endif | |
160 } | 178 } |
161 | 179 |
162 FX_BOOL CPDF_CustomAccess::ReadBlock(void* buffer, | 180 FX_BOOL CPDF_CustomAccess::ReadBlock(void* buffer, |
163 FX_FILESIZE offset, | 181 FX_FILESIZE offset, |
164 size_t size) { | 182 size_t size) { |
165 if (offset < 0) { | 183 if (offset < 0) { |
166 return FALSE; | 184 return FALSE; |
167 } | 185 } |
168 FX_SAFE_FILESIZE newPos = | 186 FX_SAFE_FILESIZE newPos = |
169 pdfium::base::checked_cast<FX_FILESIZE, size_t>(size); | 187 pdfium::base::checked_cast<FX_FILESIZE, size_t>(size); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
210 const FPDF_LIBRARY_CONFIG* cfg) { | 228 const FPDF_LIBRARY_CONFIG* cfg) { |
211 g_pCodecModule = new CCodec_ModuleMgr(); | 229 g_pCodecModule = new CCodec_ModuleMgr(); |
212 | 230 |
213 CFX_GEModule::Create(cfg ? cfg->m_pUserFontPaths : nullptr); | 231 CFX_GEModule::Create(cfg ? cfg->m_pUserFontPaths : nullptr); |
214 CFX_GEModule::Get()->SetCodecModule(g_pCodecModule); | 232 CFX_GEModule::Get()->SetCodecModule(g_pCodecModule); |
215 | 233 |
216 CPDF_ModuleMgr::Create(); | 234 CPDF_ModuleMgr::Create(); |
217 CPDF_ModuleMgr::Get()->SetCodecModule(g_pCodecModule); | 235 CPDF_ModuleMgr::Get()->SetCodecModule(g_pCodecModule); |
218 CPDF_ModuleMgr::Get()->InitPageModule(); | 236 CPDF_ModuleMgr::Get()->InitPageModule(); |
219 CPDF_ModuleMgr::Get()->InitRenderModule(); | 237 CPDF_ModuleMgr::Get()->InitRenderModule(); |
238 #ifndef PDF_ENABLE_XFA | |
239 CPDF_ModuleMgr* pModuleMgr = CPDF_ModuleMgr::Get(); | |
240 if (pModuleMgr) { | |
Lei Zhang
2015/11/25 00:34:30
Always true, given the lines above.
Tom Sepez
2015/11/25 21:45:30
Done.
| |
241 pModuleMgr->LoadEmbeddedGB1CMaps(); | |
242 pModuleMgr->LoadEmbeddedJapan1CMaps(); | |
243 pModuleMgr->LoadEmbeddedCNS1CMaps(); | |
244 pModuleMgr->LoadEmbeddedKorea1CMaps(); | |
245 } | |
246 #else | |
220 CPDFXFA_App::GetInstance()->Initialize(); | 247 CPDFXFA_App::GetInstance()->Initialize(); |
248 #endif | |
221 if (cfg && cfg->version >= 2) | 249 if (cfg && cfg->version >= 2) |
222 IJS_Runtime::Initialize(cfg->m_v8EmbedderSlot, cfg->m_pIsolate); | 250 IJS_Runtime::Initialize(cfg->m_v8EmbedderSlot, cfg->m_pIsolate); |
223 } | 251 } |
224 | 252 |
225 DLLEXPORT void STDCALL FPDF_DestroyLibrary() { | 253 DLLEXPORT void STDCALL FPDF_DestroyLibrary() { |
254 #ifdef PDF_ENABLE_XFA | |
226 CPDFXFA_App::ReleaseInstance(); | 255 CPDFXFA_App::ReleaseInstance(); |
256 #endif | |
227 CPDF_ModuleMgr::Destroy(); | 257 CPDF_ModuleMgr::Destroy(); |
228 CFX_GEModule::Destroy(); | 258 CFX_GEModule::Destroy(); |
229 | 259 |
230 delete g_pCodecModule; | 260 delete g_pCodecModule; |
231 g_pCodecModule = nullptr; | 261 g_pCodecModule = nullptr; |
232 } | 262 } |
233 | 263 |
234 #ifndef _WIN32 | 264 #ifndef _WIN32 |
235 int g_LastError; | 265 int g_LastError; |
236 void SetLastError(int err) { | 266 void SetLastError(int err) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
277 | 307 |
278 CPDF_Parser* pParser = new CPDF_Parser; | 308 CPDF_Parser* pParser = new CPDF_Parser; |
279 pParser->SetPassword(password); | 309 pParser->SetPassword(password); |
280 | 310 |
281 FX_DWORD err_code = pParser->StartParse(pFileAccess); | 311 FX_DWORD err_code = pParser->StartParse(pFileAccess); |
282 if (err_code) { | 312 if (err_code) { |
283 delete pParser; | 313 delete pParser; |
284 ProcessParseError(err_code); | 314 ProcessParseError(err_code); |
285 return NULL; | 315 return NULL; |
286 } | 316 } |
317 #ifndef PDF_ENABLE_XFA | |
318 return pParser->GetDocument(); | |
319 #else | |
287 CPDF_Document* pPDFDoc = pParser->GetDocument(); | 320 CPDF_Document* pPDFDoc = pParser->GetDocument(); |
288 if (!pPDFDoc) | 321 if (!pPDFDoc) |
289 return NULL; | 322 return NULL; |
290 | 323 |
291 CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance(); | 324 CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance(); |
292 return new CPDFXFA_Document(pPDFDoc, pProvider); | 325 return new CPDFXFA_Document(pPDFDoc, pProvider); |
293 } | 326 } |
294 | 327 |
295 DLLEXPORT FPDF_BOOL STDCALL FPDF_HasXFAField(FPDF_DOCUMENT document, | 328 DLLEXPORT FPDF_BOOL STDCALL FPDF_HasXFAField(FPDF_DOCUMENT document, |
296 int* docType) { | 329 int* docType) { |
(...skipping 22 matching lines...) Expand all Loading... | |
319 if (bDynamicXFA) | 352 if (bDynamicXFA) |
320 *docType = DOCTYPE_DYNIMIC_XFA; | 353 *docType = DOCTYPE_DYNIMIC_XFA; |
321 else | 354 else |
322 *docType = DOCTYPE_STATIC_XFA; | 355 *docType = DOCTYPE_STATIC_XFA; |
323 | 356 |
324 return TRUE; | 357 return TRUE; |
325 } | 358 } |
326 | 359 |
327 DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document) { | 360 DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document) { |
328 return document && (static_cast<CPDFXFA_Document*>(document))->LoadXFADoc(); | 361 return document && (static_cast<CPDFXFA_Document*>(document))->LoadXFADoc(); |
362 #endif | |
329 } | 363 } |
330 | 364 |
331 class CMemFile final : public IFX_FileRead { | 365 class CMemFile final : public IFX_FileRead { |
332 public: | 366 public: |
333 CMemFile(uint8_t* pBuf, FX_FILESIZE size) : m_pBuf(pBuf), m_size(size) {} | 367 CMemFile(uint8_t* pBuf, FX_FILESIZE size) : m_pBuf(pBuf), m_size(size) {} |
334 | 368 |
335 void Release() override { delete this; } | 369 void Release() override { delete this; } |
336 FX_FILESIZE GetSize() override { return m_size; } | 370 FX_FILESIZE GetSize() override { return m_size; } |
337 FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { | 371 FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { |
338 if (offset < 0) { | 372 if (offset < 0) { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
407 | 441 |
408 *fileVersion = pParser->GetFileVersion(); | 442 *fileVersion = pParser->GetFileVersion(); |
409 return TRUE; | 443 return TRUE; |
410 } | 444 } |
411 | 445 |
412 // jabdelmalek: changed return type from FX_DWORD to build on Linux (and match | 446 // jabdelmalek: changed return type from FX_DWORD to build on Linux (and match |
413 // header). | 447 // header). |
414 DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document) { | 448 DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document) { |
415 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 449 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
416 if (!pDoc) | 450 if (!pDoc) |
451 #ifndef PDF_ENABLE_XFA | |
452 return 0; | |
Lei Zhang
2015/11/25 00:34:30
This is a weird discrepancy.
Tom Sepez
2015/11/25 21:45:30
Sure is. It looks like its been this way since be
| |
453 #else | |
417 return (FX_DWORD)-1; | 454 return (FX_DWORD)-1; |
455 #endif | |
418 | 456 |
419 CPDF_Dictionary* pDict = pDoc->GetParser()->GetEncryptDict(); | 457 CPDF_Dictionary* pDict = pDoc->GetParser()->GetEncryptDict(); |
420 return pDict ? pDict->GetInteger("P") : (FX_DWORD)-1; | 458 return pDict ? pDict->GetInteger("P") : (FX_DWORD)-1; |
421 } | 459 } |
422 | 460 |
423 DLLEXPORT int STDCALL FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document) { | 461 DLLEXPORT int STDCALL FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document) { |
424 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 462 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
425 if (!pDoc) | 463 if (!pDoc) |
426 return -1; | 464 return -1; |
427 | 465 |
428 CPDF_Dictionary* pDict = pDoc->GetParser()->GetEncryptDict(); | 466 CPDF_Dictionary* pDict = pDoc->GetParser()->GetEncryptDict(); |
429 return pDict ? pDict->GetInteger("R") : -1; | 467 return pDict ? pDict->GetInteger("R") : -1; |
430 } | 468 } |
431 | 469 |
432 DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document) { | 470 DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document) { |
433 UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); | 471 UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); |
434 return pDoc ? pDoc->GetPageCount() : 0; | 472 return pDoc ? pDoc->GetPageCount() : 0; |
435 } | 473 } |
436 | 474 |
437 DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, | 475 DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, |
438 int page_index) { | 476 int page_index) { |
439 UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); | 477 UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); |
440 if (!pDoc) | 478 if (!pDoc) |
441 return nullptr; | 479 return nullptr; |
480 #ifndef PDF_ENABLE_XFA | |
481 | |
Lei Zhang
2015/11/25 00:34:30
blank
Tom Sepez
2015/11/25 21:45:30
Done.
| |
482 #endif | |
442 if (page_index < 0 || page_index >= pDoc->GetPageCount()) | 483 if (page_index < 0 || page_index >= pDoc->GetPageCount()) |
443 return nullptr; | 484 return nullptr; |
444 | 485 |
486 #ifndef PDF_ENABLE_XFA | |
487 CPDF_Dictionary* pDict = pDoc->GetPage(page_index); | |
488 if (pDict == NULL) | |
489 return NULL; | |
490 CPDF_Page* pPage = new CPDF_Page; | |
491 pPage->Load(pDoc, pDict); | |
492 pPage->ParseContent(); | |
493 return pPage; | |
494 #else | |
445 return pDoc->GetPage(page_index); | 495 return pDoc->GetPage(page_index); |
496 #endif | |
446 } | 497 } |
447 | 498 |
448 DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page) { | 499 DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page) { |
449 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); | 500 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); |
450 return pPage ? pPage->GetPageWidth() : 0.0; | 501 return pPage ? pPage->GetPageWidth() : 0.0; |
451 } | 502 } |
452 | 503 |
453 DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page) { | 504 DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page) { |
454 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); | 505 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); |
455 return pPage ? pPage->GetPageHeight() : 0.0; | 506 return pPage ? pPage->GetPageHeight() : 0.0; |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
660 FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, | 711 FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, |
661 rotate, flags, TRUE, NULL); | 712 rotate, flags, TRUE, NULL); |
662 | 713 |
663 delete pContext; | 714 delete pContext; |
664 pPage->RemovePrivateData((void*)1); | 715 pPage->RemovePrivateData((void*)1); |
665 } | 716 } |
666 | 717 |
667 DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page) { | 718 DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page) { |
668 if (!page) | 719 if (!page) |
669 return; | 720 return; |
721 #ifndef PDF_ENABLE_XFA | |
722 CPDFSDK_PageView* pPageView = | |
723 (CPDFSDK_PageView*)(((CPDF_Page*)page))->GetPrivateData((void*)page); | |
724 if (pPageView && pPageView->IsLocked()) { | |
725 pPageView->TakeOverPage(); | |
726 return; | |
727 } | |
728 delete (CPDF_Page*)page; | |
729 #else | |
670 | 730 |
671 CPDFXFA_Page* pPage = (CPDFXFA_Page*)page; | 731 CPDFXFA_Page* pPage = (CPDFXFA_Page*)page; |
672 pPage->Release(); | 732 pPage->Release(); |
733 #endif | |
673 } | 734 } |
674 | 735 |
675 DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document) { | 736 DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document) { |
737 #ifndef PDF_ENABLE_XFA | |
738 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | |
739 if (!pDoc) | |
740 return; | |
741 | |
742 CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser(); | |
743 if (!pParser) { | |
744 delete pDoc; | |
745 return; | |
746 } | |
747 delete pParser; | |
748 #else | |
676 delete CPDFDocumentFromFPDFDocument(document); | 749 delete CPDFDocumentFromFPDFDocument(document); |
750 #endif | |
677 } | 751 } |
678 | 752 |
679 DLLEXPORT unsigned long STDCALL FPDF_GetLastError() { | 753 DLLEXPORT unsigned long STDCALL FPDF_GetLastError() { |
680 return GetLastError(); | 754 return GetLastError(); |
681 } | 755 } |
682 | 756 |
683 DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, | 757 DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, |
684 int start_x, | 758 int start_x, |
685 int start_y, | 759 int start_y, |
686 int size_x, | 760 int size_x, |
687 int size_y, | 761 int size_y, |
688 int rotate, | 762 int rotate, |
689 int device_x, | 763 int device_x, |
690 int device_y, | 764 int device_y, |
691 double* page_x, | 765 double* page_x, |
692 double* page_y) { | 766 double* page_y) { |
693 if (page == NULL || page_x == NULL || page_y == NULL) | 767 if (page == NULL || page_x == NULL || page_y == NULL) |
694 return; | 768 return; |
695 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); | 769 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); |
770 #ifndef PDF_ENABLE_XFA | |
771 | |
772 CPDF_Matrix page2device; | |
773 pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, | |
774 rotate); | |
775 CPDF_Matrix device2page; | |
776 device2page.SetReverse(page2device); | |
777 | |
778 FX_FLOAT page_x_f, page_y_f; | |
779 device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, | |
780 page_y_f); | |
781 | |
782 *page_x = (page_x_f); | |
783 *page_y = (page_y_f); | |
784 #else | |
696 pPage->DeviceToPage(start_x, start_y, size_x, size_y, rotate, device_x, | 785 pPage->DeviceToPage(start_x, start_y, size_x, size_y, rotate, device_x, |
697 device_y, page_x, page_y); | 786 device_y, page_x, page_y); |
787 #endif | |
698 } | 788 } |
699 | 789 |
700 DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, | 790 DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, |
701 int start_x, | 791 int start_x, |
702 int start_y, | 792 int start_y, |
703 int size_x, | 793 int size_x, |
704 int size_y, | 794 int size_y, |
705 int rotate, | 795 int rotate, |
706 double page_x, | 796 double page_x, |
707 double page_y, | 797 double page_y, |
708 int* device_x, | 798 int* device_x, |
709 int* device_y) { | 799 int* device_y) { |
710 if (!device_x || !device_y) | 800 if (!device_x || !device_y) |
711 return; | 801 return; |
712 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); | 802 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); |
713 if (!pPage) | 803 if (!pPage) |
714 return; | 804 return; |
805 #ifndef PDF_ENABLE_XFA | |
806 CPDF_Matrix page2device; | |
807 pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, | |
808 rotate); | |
809 | |
810 FX_FLOAT device_x_f, device_y_f; | |
811 page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, | |
812 device_y_f); | |
813 | |
814 *device_x = FXSYS_round(device_x_f); | |
815 *device_y = FXSYS_round(device_y_f); | |
816 #else | |
715 pPage->PageToDevice(start_x, start_y, size_x, size_y, rotate, page_x, page_y, | 817 pPage->PageToDevice(start_x, start_y, size_x, size_y, rotate, page_x, page_y, |
716 device_x, device_y); | 818 device_x, device_y); |
819 #endif | |
717 } | 820 } |
718 | 821 |
719 DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, | 822 DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, |
720 int height, | 823 int height, |
721 int alpha) { | 824 int alpha) { |
722 nonstd::unique_ptr<CFX_DIBitmap> pBitmap(new CFX_DIBitmap); | 825 nonstd::unique_ptr<CFX_DIBitmap> pBitmap(new CFX_DIBitmap); |
723 if (!pBitmap->Create(width, height, alpha ? FXDIB_Argb : FXDIB_Rgb32)) { | 826 if (!pBitmap->Create(width, height, alpha ? FXDIB_Argb : FXDIB_Rgb32)) { |
724 return NULL; | 827 return NULL; |
725 } | 828 } |
726 return pBitmap.release(); | 829 return pBitmap.release(); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
821 if (flags & FPDF_LCD_TEXT) | 924 if (flags & FPDF_LCD_TEXT) |
822 pContext->m_pOptions->m_Flags |= RENDER_CLEARTYPE; | 925 pContext->m_pOptions->m_Flags |= RENDER_CLEARTYPE; |
823 else | 926 else |
824 pContext->m_pOptions->m_Flags &= ~RENDER_CLEARTYPE; | 927 pContext->m_pOptions->m_Flags &= ~RENDER_CLEARTYPE; |
825 if (flags & FPDF_NO_NATIVETEXT) | 928 if (flags & FPDF_NO_NATIVETEXT) |
826 pContext->m_pOptions->m_Flags |= RENDER_NO_NATIVETEXT; | 929 pContext->m_pOptions->m_Flags |= RENDER_NO_NATIVETEXT; |
827 if (flags & FPDF_RENDER_LIMITEDIMAGECACHE) | 930 if (flags & FPDF_RENDER_LIMITEDIMAGECACHE) |
828 pContext->m_pOptions->m_Flags |= RENDER_LIMITEDIMAGECACHE; | 931 pContext->m_pOptions->m_Flags |= RENDER_LIMITEDIMAGECACHE; |
829 if (flags & FPDF_RENDER_FORCEHALFTONE) | 932 if (flags & FPDF_RENDER_FORCEHALFTONE) |
830 pContext->m_pOptions->m_Flags |= RENDER_FORCE_HALFTONE; | 933 pContext->m_pOptions->m_Flags |= RENDER_FORCE_HALFTONE; |
934 #ifndef PDF_ENABLE_XFA | |
935 if (flags & FPDF_RENDER_NO_SMOOTHTEXT) | |
936 pContext->m_pOptions->m_Flags |= RENDER_NOTEXTSMOOTH; | |
937 if (flags & FPDF_RENDER_NO_SMOOTHIMAGE) | |
938 pContext->m_pOptions->m_Flags |= RENDER_NOIMAGESMOOTH; | |
939 if (flags & FPDF_RENDER_NO_SMOOTHPATH) | |
940 pContext->m_pOptions->m_Flags |= RENDER_NOPATHSMOOTH; | |
941 #endif | |
831 // Grayscale output | 942 // Grayscale output |
832 if (flags & FPDF_GRAYSCALE) { | 943 if (flags & FPDF_GRAYSCALE) { |
833 pContext->m_pOptions->m_ColorMode = RENDER_COLOR_GRAY; | 944 pContext->m_pOptions->m_ColorMode = RENDER_COLOR_GRAY; |
834 pContext->m_pOptions->m_ForeColor = 0; | 945 pContext->m_pOptions->m_ForeColor = 0; |
835 pContext->m_pOptions->m_BackColor = 0xffffff; | 946 pContext->m_pOptions->m_BackColor = 0xffffff; |
836 } | 947 } |
837 const CPDF_OCContext::UsageType usage = | 948 const CPDF_OCContext::UsageType usage = |
838 (flags & FPDF_PRINTING) ? CPDF_OCContext::Print : CPDF_OCContext::View; | 949 (flags & FPDF_PRINTING) ? CPDF_OCContext::Print : CPDF_OCContext::View; |
839 pContext->m_pOptions->m_AddFlags = flags >> 8; | 950 pContext->m_pOptions->m_AddFlags = flags >> 8; |
840 pContext->m_pOptions->m_pOCContext = | 951 pContext->m_pOptions->m_pOCContext = |
(...skipping 29 matching lines...) Expand all Loading... | |
870 } | 981 } |
871 | 982 |
872 DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, | 983 DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, |
873 int page_index, | 984 int page_index, |
874 double* width, | 985 double* width, |
875 double* height) { | 986 double* height) { |
876 UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); | 987 UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); |
877 if (!pDoc) | 988 if (!pDoc) |
878 return FALSE; | 989 return FALSE; |
879 | 990 |
991 #ifndef PDF_ENABLE_XFA | |
992 CPDF_Dictionary* pDict = pDoc->GetPage(page_index); | |
Lei Zhang
2015/11/25 00:34:30
More readable to combine all the XFA path into one
Tom Sepez
2015/11/25 21:45:30
Manual task for later. diff is too smart here.
| |
993 if (!pDict) | |
994 #else | |
880 int count = pDoc->GetPageCount(); | 995 int count = pDoc->GetPageCount(); |
881 if (page_index < 0 || page_index >= count) | 996 if (page_index < 0 || page_index >= count) |
997 #endif | |
882 return FALSE; | 998 return FALSE; |
883 | 999 |
1000 #ifndef PDF_ENABLE_XFA | |
1001 CPDF_Page page; | |
1002 page.Load(pDoc, pDict); | |
1003 *width = page.GetPageWidth(); | |
1004 *height = page.GetPageHeight(); | |
1005 #else | |
884 CPDFXFA_Page* pPage = pDoc->GetPage(page_index); | 1006 CPDFXFA_Page* pPage = pDoc->GetPage(page_index); |
885 if (!pPage) | 1007 if (!pPage) |
886 return FALSE; | 1008 return FALSE; |
887 | 1009 |
888 *width = pPage->GetPageWidth(); | 1010 *width = pPage->GetPageWidth(); |
889 *height = pPage->GetPageHeight(); | 1011 *height = pPage->GetPageHeight(); |
1012 #endif | |
890 | 1013 |
891 return TRUE; | 1014 return TRUE; |
892 } | 1015 } |
893 | 1016 |
894 DLLEXPORT FPDF_BOOL STDCALL | 1017 DLLEXPORT FPDF_BOOL STDCALL |
895 FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document) { | 1018 FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document) { |
896 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 1019 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
897 if (!pDoc) | 1020 if (!pDoc) |
898 return TRUE; | 1021 return TRUE; |
899 CPDF_ViewerPreferences viewRef(pDoc); | 1022 CPDF_ViewerPreferences viewRef(pDoc); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
956 return nullptr; | 1079 return nullptr; |
957 | 1080 |
958 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 1081 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
959 if (!pDoc) | 1082 if (!pDoc) |
960 return nullptr; | 1083 return nullptr; |
961 | 1084 |
962 CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests")); | 1085 CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests")); |
963 return name_tree.LookupNamedDest(pDoc, name); | 1086 return name_tree.LookupNamedDest(pDoc, name); |
964 } | 1087 } |
965 | 1088 |
1089 #ifdef PDF_ENABLE_XFA | |
966 FPDF_RESULT FPDF_BStr_Init(FPDF_BSTR* str) { | 1090 FPDF_RESULT FPDF_BStr_Init(FPDF_BSTR* str) { |
967 if (!str) | 1091 if (!str) |
968 return -1; | 1092 return -1; |
969 | 1093 |
970 FXSYS_memset(str, 0, sizeof(FPDF_BSTR)); | 1094 FXSYS_memset(str, 0, sizeof(FPDF_BSTR)); |
971 return 0; | 1095 return 0; |
972 } | 1096 } |
973 | 1097 |
974 FPDF_RESULT FPDF_BStr_Set(FPDF_BSTR* str, FPDF_LPCSTR bstr, int length) { | 1098 FPDF_RESULT FPDF_BStr_Set(FPDF_BSTR* str, FPDF_LPCSTR bstr, int length) { |
975 if (!str) | 1099 if (!str) |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1008 return -1; | 1132 return -1; |
1009 | 1133 |
1010 if (str->str) { | 1134 if (str->str) { |
1011 FX_Free(str->str); | 1135 FX_Free(str->str); |
1012 str->str = NULL; | 1136 str->str = NULL; |
1013 } | 1137 } |
1014 str->len = 0; | 1138 str->len = 0; |
1015 return 0; | 1139 return 0; |
1016 } | 1140 } |
1017 | 1141 |
1142 #endif | |
1018 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, | 1143 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, |
1019 int index, | 1144 int index, |
1020 void* buffer, | 1145 void* buffer, |
1021 long* buflen) { | 1146 long* buflen) { |
1022 if (!buffer) | 1147 if (!buffer) |
1023 *buflen = 0; | 1148 *buflen = 0; |
1024 | 1149 |
1025 if (index < 0) | 1150 if (index < 0) |
1026 return nullptr; | 1151 return nullptr; |
1027 | 1152 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1073 if (!buffer) { | 1198 if (!buffer) { |
1074 *buflen = len; | 1199 *buflen = len; |
1075 } else if (*buflen >= len) { | 1200 } else if (*buflen >= len) { |
1076 memcpy(buffer, utf16Name.c_str(), len); | 1201 memcpy(buffer, utf16Name.c_str(), len); |
1077 *buflen = len; | 1202 *buflen = len; |
1078 } else { | 1203 } else { |
1079 *buflen = -1; | 1204 *buflen = -1; |
1080 } | 1205 } |
1081 return (FPDF_DEST)pDestObj; | 1206 return (FPDF_DEST)pDestObj; |
1082 } | 1207 } |
OLD | NEW |