| Index: samples/pdfium_test.cc
|
| diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc
|
| index b78075e788c020992a3e231923811f59b5713ffb..a930f9435035dc05313b758657fffe8026c1f4f5 100644
|
| --- a/samples/pdfium_test.cc
|
| +++ b/samples/pdfium_test.cc
|
| @@ -54,14 +54,6 @@ enum OutputFormat {
|
| #endif
|
| };
|
|
|
| -// Hold a map of the currently loaded pages in order to avoid them
|
| -// to get loaded twice.
|
| -std::map<int, FPDF_PAGE> g_loadedPages;
|
| -
|
| -// Hold a global pointer of FPDF_FORMHANDLE so that PDFium
|
| -// app hooks can made use of it.
|
| -FPDF_FORMHANDLE g_formHandle;
|
| -
|
| struct Options {
|
| Options()
|
| : show_config(false), send_events(false), output_format(OUTPUT_NONE) {}
|
| @@ -75,6 +67,21 @@ struct Options {
|
| std::string font_directory;
|
| };
|
|
|
| +struct FPDF_FORMFILLINFO_PDFiumTest : public FPDF_FORMFILLINFO {
|
| + // Hold a map of the currently loaded pages in order to avoid them
|
| + // to get loaded twice.
|
| + std::map<int, FPDF_PAGE> loadedPages;
|
| +
|
| + // Hold a pointer of FPDF_FORMHANDLE so that PDFium app hooks can
|
| + // make use of it.
|
| + FPDF_FORMHANDLE formHandle;
|
| +};
|
| +
|
| +static FPDF_FORMFILLINFO_PDFiumTest* ToPDFiumTestFormFillInfo(
|
| + FPDF_FORMFILLINFO* formFillInfo) {
|
| + return static_cast<FPDF_FORMFILLINFO_PDFiumTest*>(formFillInfo);
|
| +}
|
| +
|
| static bool CheckDimensions(int stride, int width, int height) {
|
| if (stride < 0 || width < 0 || height < 0)
|
| return false;
|
| @@ -532,28 +539,34 @@ void SendPageEvents(const FPDF_FORMHANDLE& form,
|
| FPDF_PAGE GetPageForIndex(FPDF_FORMFILLINFO* param,
|
| FPDF_DOCUMENT doc,
|
| int index) {
|
| - auto iter = g_loadedPages.find(index);
|
| - if (iter != g_loadedPages.end())
|
| + FPDF_FORMFILLINFO_PDFiumTest* formFillInfo = ToPDFiumTestFormFillInfo(param);
|
| + auto& loadedPages = formFillInfo->loadedPages;
|
| +
|
| + auto iter = loadedPages.find(index);
|
| + if (iter != loadedPages.end())
|
| return iter->second;
|
|
|
| FPDF_PAGE page = FPDF_LoadPage(doc, index);
|
| if (!page)
|
| return nullptr;
|
|
|
| - FORM_OnAfterLoadPage(page, g_formHandle);
|
| - FORM_DoPageAAction(page, g_formHandle, FPDFPAGE_AACTION_OPEN);
|
| + FPDF_FORMHANDLE& formHandle = formFillInfo->formHandle;
|
| +
|
| + FORM_OnAfterLoadPage(page, formHandle);
|
| + FORM_DoPageAAction(page, formHandle, FPDFPAGE_AACTION_OPEN);
|
|
|
| - g_loadedPages[index] = page;
|
| + loadedPages[index] = page;
|
| return page;
|
| }
|
|
|
| bool RenderPage(const std::string& name,
|
| FPDF_DOCUMENT doc,
|
| FPDF_FORMHANDLE& form,
|
| + FPDF_FORMFILLINFO_PDFiumTest& formFillInfo,
|
| const int page_index,
|
| const Options& options,
|
| const std::string& events) {
|
| - FPDF_PAGE page = GetPageForIndex(nullptr, doc, page_index);
|
| + FPDF_PAGE page = GetPageForIndex(&formFillInfo, doc, page_index);
|
| if (!page)
|
| return false;
|
|
|
| @@ -619,7 +632,8 @@ bool RenderPage(const std::string& name,
|
| fprintf(stderr, "Page was too large to be rendered.\n");
|
| }
|
|
|
| - g_loadedPages.erase(page_index);
|
| + formFillInfo.loadedPages.erase(page_index);
|
| +
|
| FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE);
|
| FORM_OnBeforeClosePage(page, form);
|
| FPDFText_ClosePage(text_page);
|
| @@ -640,8 +654,7 @@ void RenderPdf(const std::string& name,
|
| platform_callbacks.Doc_gotoPage = ExampleDocGotoPage;
|
| platform_callbacks.Doc_mail = ExampleDocMail;
|
|
|
| - FPDF_FORMFILLINFO form_callbacks;
|
| - memset(&form_callbacks, '\0', sizeof(form_callbacks));
|
| + FPDF_FORMFILLINFO_PDFiumTest form_callbacks = {};
|
| #ifdef PDF_ENABLE_XFA
|
| form_callbacks.version = 2;
|
| #else // PDF_ENABLE_XFA
|
| @@ -731,8 +744,9 @@ void RenderPdf(const std::string& name,
|
|
|
| (void)FPDF_GetDocPermissions(doc);
|
|
|
| - FPDF_FORMHANDLE form = g_formHandle =
|
| - FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks);
|
| + FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks);
|
| + form_callbacks.formHandle = form;
|
| +
|
| #ifdef PDF_ENABLE_XFA
|
| int docType = DOCTYPE_PDF;
|
| if (FPDF_HasXFAField(doc, &docType) && docType != DOCTYPE_PDF &&
|
| @@ -761,7 +775,7 @@ void RenderPdf(const std::string& name,
|
| return;
|
| }
|
| }
|
| - if (RenderPage(name, doc, form, i, options, events))
|
| + if (RenderPage(name, doc, form, form_callbacks, i, options, events))
|
| ++rendered_pages;
|
| else
|
| ++bad_pages;
|
|
|