Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium 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 #include <limits.h> | 5 #include <limits.h> |
| 6 #include <stdio.h> | 6 #include <stdio.h> |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 47 OUTPUT_PNG, | 47 OUTPUT_PNG, |
| 48 #ifdef _WIN32 | 48 #ifdef _WIN32 |
| 49 OUTPUT_BMP, | 49 OUTPUT_BMP, |
| 50 OUTPUT_EMF, | 50 OUTPUT_EMF, |
| 51 #endif | 51 #endif |
| 52 #ifdef PDF_ENABLE_SKIA | 52 #ifdef PDF_ENABLE_SKIA |
| 53 OUTPUT_SKP, | 53 OUTPUT_SKP, |
| 54 #endif | 54 #endif |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 // Hold a map of the currently loaded pages in order to avoid them | |
| 58 // to get loaded twice. | |
| 59 std::map<int, FPDF_PAGE> g_loadedPages; | |
| 60 | |
| 61 // Hold a global pointer of FPDF_FORMHANDLE so that PDFium | |
| 62 // app hooks can made use of it. | |
| 63 FPDF_FORMHANDLE g_formHandle; | |
| 64 | |
| 65 struct Options { | 57 struct Options { |
| 66 Options() | 58 Options() |
| 67 : show_config(false), send_events(false), output_format(OUTPUT_NONE) {} | 59 : show_config(false), send_events(false), output_format(OUTPUT_NONE) {} |
| 68 | 60 |
| 69 bool show_config; | 61 bool show_config; |
| 70 bool send_events; | 62 bool send_events; |
| 71 OutputFormat output_format; | 63 OutputFormat output_format; |
| 72 std::string scale_factor_as_string; | 64 std::string scale_factor_as_string; |
| 73 std::string exe_path; | 65 std::string exe_path; |
| 74 std::string bin_directory; | 66 std::string bin_directory; |
| 75 std::string font_directory; | 67 std::string font_directory; |
| 76 }; | 68 }; |
| 77 | 69 |
| 70 typedef struct { | |
|
Tom Sepez
2016/09/12 17:19:41
nit: In C++, we can avoid "typedef" adn just write
tonikitoo
2016/09/12 23:41:55
Done.
| |
| 71 FPDF_FORMFILLINFO formInfo; | |
| 72 | |
| 73 // Hold a map of the currently loaded pages in order to avoid them | |
| 74 // to get loaded twice. | |
| 75 std::map<int, FPDF_PAGE> loadedPages; | |
| 76 | |
| 77 // Hold a pointer of FPDF_FORMHANDLE so that PDFium app hooks can | |
| 78 // make use of it. | |
| 79 FPDF_FORMHANDLE formHandle; | |
| 80 } PDFiumTest_FPDF_FORMFILLINFO; | |
| 81 | |
| 82 static PDFiumTest_FPDF_FORMFILLINFO* ToPDFiumTestFormFillInfo( | |
|
Tom Sepez
2016/09/12 17:19:40
It might be cleaner if PDFiumTest_FPDF_FORMFILLINF
tonikitoo
2016/09/12 23:41:55
Done.
| |
| 83 FPDF_FORMFILLINFO* formFillInfo) { | |
| 84 return reinterpret_cast<PDFiumTest_FPDF_FORMFILLINFO*>(formFillInfo); | |
| 85 } | |
| 86 | |
| 87 static FPDF_FORMFILLINFO* ToFormFillInfo( | |
| 88 PDFiumTest_FPDF_FORMFILLINFO* pdfiumTestFormFillInfo) { | |
| 89 return reinterpret_cast<FPDF_FORMFILLINFO*>(pdfiumTestFormFillInfo); | |
| 90 } | |
| 91 | |
| 78 static bool CheckDimensions(int stride, int width, int height) { | 92 static bool CheckDimensions(int stride, int width, int height) { |
| 79 if (stride < 0 || width < 0 || height < 0) | 93 if (stride < 0 || width < 0 || height < 0) |
| 80 return false; | 94 return false; |
| 81 if (height > 0 && width > INT_MAX / height) | 95 if (height > 0 && width > INT_MAX / height) |
| 82 return false; | 96 return false; |
| 83 return true; | 97 return true; |
| 84 } | 98 } |
| 85 | 99 |
| 86 static void WritePpm(const char* pdf_name, int num, const void* buffer_void, | 100 static void WritePpm(const char* pdf_name, int num, const void* buffer_void, |
| 87 int stride, int width, int height) { | 101 int stride, int width, int height) { |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 525 } | 539 } |
| 526 } else { | 540 } else { |
| 527 fprintf(stderr, "Unrecognized event: %s\n", tokens[0].c_str()); | 541 fprintf(stderr, "Unrecognized event: %s\n", tokens[0].c_str()); |
| 528 } | 542 } |
| 529 } | 543 } |
| 530 } | 544 } |
| 531 | 545 |
| 532 FPDF_PAGE GetPageForIndex(FPDF_FORMFILLINFO* param, | 546 FPDF_PAGE GetPageForIndex(FPDF_FORMFILLINFO* param, |
| 533 FPDF_DOCUMENT doc, | 547 FPDF_DOCUMENT doc, |
| 534 int index) { | 548 int index) { |
| 535 auto iter = g_loadedPages.find(index); | 549 PDFiumTest_FPDF_FORMFILLINFO* formFillInfo = ToPDFiumTestFormFillInfo(param); |
| 536 if (iter != g_loadedPages.end()) | 550 std::map<int, FPDF_PAGE>& loadedPages = formFillInfo->loadedPages; |
| 551 | |
| 552 auto iter = loadedPages.find(index); | |
| 553 if (iter != loadedPages.end()) | |
| 537 return iter->second; | 554 return iter->second; |
| 538 | 555 |
| 539 FPDF_PAGE page = FPDF_LoadPage(doc, index); | 556 FPDF_PAGE page = FPDF_LoadPage(doc, index); |
| 540 if (!page) | 557 if (!page) |
| 541 return nullptr; | 558 return nullptr; |
| 542 | 559 |
| 543 FORM_OnAfterLoadPage(page, g_formHandle); | 560 FPDF_FORMHANDLE& formHandle = formFillInfo->formHandle; |
| 544 FORM_DoPageAAction(page, g_formHandle, FPDFPAGE_AACTION_OPEN); | |
| 545 | 561 |
| 546 g_loadedPages[index] = page; | 562 FORM_OnAfterLoadPage(page, formHandle); |
| 563 FORM_DoPageAAction(page, formHandle, FPDFPAGE_AACTION_OPEN); | |
| 564 | |
| 565 loadedPages[index] = page; | |
| 547 return page; | 566 return page; |
| 548 } | 567 } |
| 549 | 568 |
| 550 bool RenderPage(const std::string& name, | 569 bool RenderPage(const std::string& name, |
| 551 FPDF_DOCUMENT doc, | 570 FPDF_DOCUMENT doc, |
| 552 FPDF_FORMHANDLE& form, | 571 FPDF_FORMHANDLE& form, |
| 572 FPDF_FORMFILLINFO& formFillInfo, | |
| 553 const int page_index, | 573 const int page_index, |
| 554 const Options& options, | 574 const Options& options, |
| 555 const std::string& events) { | 575 const std::string& events) { |
| 556 FPDF_PAGE page = GetPageForIndex(nullptr, doc, page_index); | 576 FPDF_PAGE page = GetPageForIndex(&formFillInfo, doc, page_index); |
| 557 if (!page) | 577 if (!page) |
| 558 return false; | 578 return false; |
| 559 | 579 |
| 560 FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); | 580 FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); |
| 561 | 581 |
| 562 if (options.send_events) | 582 if (options.send_events) |
| 563 SendPageEvents(form, page, events); | 583 SendPageEvents(form, page, events); |
| 564 | 584 |
| 565 double scale = 1.0; | 585 double scale = 1.0; |
| 566 if (!options.scale_factor_as_string.empty()) | 586 if (!options.scale_factor_as_string.empty()) |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 612 #endif | 632 #endif |
| 613 default: | 633 default: |
| 614 break; | 634 break; |
| 615 } | 635 } |
| 616 | 636 |
| 617 FPDFBitmap_Destroy(bitmap); | 637 FPDFBitmap_Destroy(bitmap); |
| 618 } else { | 638 } else { |
| 619 fprintf(stderr, "Page was too large to be rendered.\n"); | 639 fprintf(stderr, "Page was too large to be rendered.\n"); |
| 620 } | 640 } |
| 621 | 641 |
| 622 g_loadedPages.erase(page_index); | 642 PDFiumTest_FPDF_FORMFILLINFO* pdfiumTestFormFillInfo = |
| 643 ToPDFiumTestFormFillInfo(&formFillInfo); | |
| 644 pdfiumTestFormFillInfo->loadedPages.erase(page_index); | |
| 645 | |
| 623 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); | 646 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); |
| 624 FORM_OnBeforeClosePage(page, form); | 647 FORM_OnBeforeClosePage(page, form); |
| 625 FPDFText_ClosePage(text_page); | 648 FPDFText_ClosePage(text_page); |
| 626 FPDF_ClosePage(page); | 649 FPDF_ClosePage(page); |
| 627 return !!bitmap; | 650 return !!bitmap; |
| 628 } | 651 } |
| 629 | 652 |
| 630 void RenderPdf(const std::string& name, | 653 void RenderPdf(const std::string& name, |
| 631 const char* pBuf, | 654 const char* pBuf, |
| 632 size_t len, | 655 size_t len, |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 724 fprintf(stderr, "Unknown error %ld", err); | 747 fprintf(stderr, "Unknown error %ld", err); |
| 725 } | 748 } |
| 726 fprintf(stderr, ".\n"); | 749 fprintf(stderr, ".\n"); |
| 727 | 750 |
| 728 FPDFAvail_Destroy(pdf_avail); | 751 FPDFAvail_Destroy(pdf_avail); |
| 729 return; | 752 return; |
| 730 } | 753 } |
| 731 | 754 |
| 732 (void)FPDF_GetDocPermissions(doc); | 755 (void)FPDF_GetDocPermissions(doc); |
| 733 | 756 |
| 734 FPDF_FORMHANDLE form = g_formHandle = | 757 std::unique_ptr<PDFiumTest_FPDF_FORMFILLINFO> pdfiumTestFormFillInfo( |
| 735 FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks); | 758 new PDFiumTest_FPDF_FORMFILLINFO); |
| 759 pdfiumTestFormFillInfo->formInfo = form_callbacks; | |
| 760 | |
| 761 FPDF_FORMFILLINFO* formFillInfo = | |
| 762 ToFormFillInfo(pdfiumTestFormFillInfo.get()); | |
| 763 | |
| 764 FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, formFillInfo); | |
| 765 pdfiumTestFormFillInfo->formHandle = form; | |
| 766 | |
| 736 #ifdef PDF_ENABLE_XFA | 767 #ifdef PDF_ENABLE_XFA |
| 737 int docType = DOCTYPE_PDF; | 768 int docType = DOCTYPE_PDF; |
| 738 if (FPDF_HasXFAField(doc, &docType) && docType != DOCTYPE_PDF && | 769 if (FPDF_HasXFAField(doc, &docType) && docType != DOCTYPE_PDF && |
| 739 !FPDF_LoadXFA(doc)) { | 770 !FPDF_LoadXFA(doc)) { |
| 740 fprintf(stderr, "LoadXFA unsuccessful, continuing anyway.\n"); | 771 fprintf(stderr, "LoadXFA unsuccessful, continuing anyway.\n"); |
| 741 } | 772 } |
| 742 #endif // PDF_ENABLE_XFA | 773 #endif // PDF_ENABLE_XFA |
| 743 FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD); | 774 FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD); |
| 744 FPDF_SetFormFieldHighlightAlpha(form, 100); | 775 FPDF_SetFormFieldHighlightAlpha(form, 100); |
| 745 | 776 |
| 746 FORM_DoDocumentJSAction(form); | 777 FORM_DoDocumentJSAction(form); |
| 747 FORM_DoDocumentOpenAction(form); | 778 FORM_DoDocumentOpenAction(form); |
| 748 | 779 |
| 749 int page_count = FPDF_GetPageCount(doc); | 780 int page_count = FPDF_GetPageCount(doc); |
| 750 int rendered_pages = 0; | 781 int rendered_pages = 0; |
| 751 int bad_pages = 0; | 782 int bad_pages = 0; |
| 752 for (int i = 0; i < page_count; ++i) { | 783 for (int i = 0; i < page_count; ++i) { |
| 753 if (bIsLinearized) { | 784 if (bIsLinearized) { |
| 754 nRet = PDF_DATA_NOTAVAIL; | 785 nRet = PDF_DATA_NOTAVAIL; |
| 755 while (nRet == PDF_DATA_NOTAVAIL) | 786 while (nRet == PDF_DATA_NOTAVAIL) |
| 756 nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints); | 787 nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints); |
| 757 | 788 |
| 758 if (nRet == PDF_DATA_ERROR) { | 789 if (nRet == PDF_DATA_ERROR) { |
| 759 fprintf(stderr, "Unknown error in checking if page %d is available.\n", | 790 fprintf(stderr, "Unknown error in checking if page %d is available.\n", |
| 760 i); | 791 i); |
| 761 return; | 792 return; |
| 762 } | 793 } |
| 763 } | 794 } |
| 764 if (RenderPage(name, doc, form, i, options, events)) | 795 if (RenderPage(name, doc, form, *formFillInfo, i, options, events)) |
| 765 ++rendered_pages; | 796 ++rendered_pages; |
| 766 else | 797 else |
| 767 ++bad_pages; | 798 ++bad_pages; |
| 768 } | 799 } |
| 769 | 800 |
| 770 FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); | 801 FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); |
| 771 | 802 |
| 772 #ifdef PDF_ENABLE_XFA | 803 #ifdef PDF_ENABLE_XFA |
| 773 // Note: The shut down order here is the reverse of the non-XFA branch order. | 804 // Note: The shut down order here is the reverse of the non-XFA branch order. |
| 774 // Need to work out if this is required, and if it is, the lifetimes of | 805 // Need to work out if this is required, and if it is, the lifetimes of |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 910 delete platform; | 941 delete platform; |
| 911 | 942 |
| 912 #ifdef V8_USE_EXTERNAL_STARTUP_DATA | 943 #ifdef V8_USE_EXTERNAL_STARTUP_DATA |
| 913 free(const_cast<char*>(natives.data)); | 944 free(const_cast<char*>(natives.data)); |
| 914 free(const_cast<char*>(snapshot.data)); | 945 free(const_cast<char*>(snapshot.data)); |
| 915 #endif // V8_USE_EXTERNAL_STARTUP_DATA | 946 #endif // V8_USE_EXTERNAL_STARTUP_DATA |
| 916 #endif // PDF_ENABLE_V8 | 947 #endif // PDF_ENABLE_V8 |
| 917 | 948 |
| 918 return 0; | 949 return 0; |
| 919 } | 950 } |
| OLD | NEW |