Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(971)

Side by Side Diff: samples/pdfium_test.cc

Issue 1898993002: Allow pdfium_test to send simple events to each page. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | testing/test_support.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <list> 10 #include <list>
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 #ifdef _WIN32 47 #ifdef _WIN32
48 OUTPUT_BMP, 48 OUTPUT_BMP,
49 OUTPUT_EMF, 49 OUTPUT_EMF,
50 #endif 50 #endif
51 #ifdef PDF_ENABLE_SKIA 51 #ifdef PDF_ENABLE_SKIA
52 OUTPUT_SKP, 52 OUTPUT_SKP,
53 #endif 53 #endif
54 }; 54 };
55 55
56 struct Options { 56 struct Options {
57 Options() : show_config(false), output_format(OUTPUT_NONE) {} 57 Options()
58 : show_config(false), send_events(false), output_format(OUTPUT_NONE) {}
58 59
59 bool show_config; 60 bool show_config;
61 bool send_events;
60 OutputFormat output_format; 62 OutputFormat output_format;
61 std::string scale_factor_as_string; 63 std::string scale_factor_as_string;
62 std::string exe_path; 64 std::string exe_path;
63 std::string bin_directory; 65 std::string bin_directory;
64 std::string font_directory; 66 std::string font_directory;
65 }; 67 };
66 68
67 static bool CheckDimensions(int stride, int width, int height) { 69 static bool CheckDimensions(int stride, int width, int height) {
68 if (stride < 0 || width < 0 || height < 0) 70 if (stride < 0 || width < 0 || height < 0)
69 return false; 71 return false;
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 Options* options, std::list<std::string>* files) { 333 Options* options, std::list<std::string>* files) {
332 if (args.empty()) { 334 if (args.empty()) {
333 return false; 335 return false;
334 } 336 }
335 options->exe_path = args[0]; 337 options->exe_path = args[0];
336 size_t cur_idx = 1; 338 size_t cur_idx = 1;
337 for (; cur_idx < args.size(); ++cur_idx) { 339 for (; cur_idx < args.size(); ++cur_idx) {
338 const std::string& cur_arg = args[cur_idx]; 340 const std::string& cur_arg = args[cur_idx];
339 if (cur_arg == "--show-config") { 341 if (cur_arg == "--show-config") {
340 options->show_config = true; 342 options->show_config = true;
343 } else if (cur_arg == "--send-events") {
344 options->send_events = true;
341 } else if (cur_arg == "--ppm") { 345 } else if (cur_arg == "--ppm") {
342 if (options->output_format != OUTPUT_NONE) { 346 if (options->output_format != OUTPUT_NONE) {
343 fprintf(stderr, "Duplicate or conflicting --ppm argument\n"); 347 fprintf(stderr, "Duplicate or conflicting --ppm argument\n");
344 return false; 348 return false;
345 } 349 }
346 options->output_format = OUTPUT_PPM; 350 options->output_format = OUTPUT_PPM;
347 } else if (cur_arg == "--png") { 351 } else if (cur_arg == "--png") {
348 if (options->output_format != OUTPUT_NONE) { 352 if (options->output_format != OUTPUT_NONE) {
349 fprintf(stderr, "Duplicate or conflicting --png argument\n"); 353 fprintf(stderr, "Duplicate or conflicting --png argument\n");
350 return false; 354 return false;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 return true; 415 return true;
412 } 416 }
413 417
414 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { 418 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) {
415 return true; 419 return true;
416 } 420 }
417 421
418 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) { 422 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {
419 } 423 }
420 424
425 void SendPageEvents(const FPDF_FORMHANDLE& form,
426 const FPDF_PAGE& page,
427 const std::string& events) {
428 auto lines = StringSplit(events, '\n');
429 for (auto line : lines) {
430 auto command = StringSplit(line, '#');
431 if (command[0].empty())
432 continue;
433 auto tokens = StringSplit(command[0], ',');
434 if (tokens[0] == "keycode") {
435 if (tokens.size() == 2) {
436 int keycode = atoi(tokens[1].c_str());
437 FORM_OnKeyDown(form, page, keycode, 0);
438 FORM_OnKeyUp(form, page, keycode, 0);
439 } else {
440 fprintf(stderr, "keycode: bad args\n");
441 }
442 } else if (tokens[0] == "mousedown") {
443 if (tokens.size() == 4) {
444 int x = atoi(tokens[2].c_str());
445 int y = atoi(tokens[3].c_str());
446 if (tokens[1] == "left")
447 FORM_OnLButtonDown(form, page, 0, x, y);
448 else if (tokens[1] == "right")
449 FORM_OnRButtonDown(form, page, 0, x, y);
450 else
451 fprintf(stderr, "mousedown: bad button name\n");
452 } else {
453 fprintf(stderr, "mousedown: bad args\n");
454 }
455 } else if (tokens[0] == "mouseup") {
456 if (tokens.size() == 4) {
457 int x = atoi(tokens[2].c_str());
458 int y = atoi(tokens[3].c_str());
459 if (tokens[1] == "left")
460 FORM_OnLButtonUp(form, page, 0, x, y);
461 else if (tokens[1] == "right")
462 FORM_OnRButtonUp(form, page, 0, x, y);
463 else
464 fprintf(stderr, "mouseup: bad button name\n");
465 } else {
466 fprintf(stderr, "mouseup: bad args\n");
467 }
468 } else if (tokens[0] == "mousemove") {
469 if (tokens.size() == 3) {
470 int x = atoi(tokens[1].c_str());
471 int y = atoi(tokens[2].c_str());
472 FORM_OnMouseMove(form, page, 0, x, y);
473 } else {
474 fprintf(stderr, "mousemove: bad args\n");
475 }
476 } else {
477 fprintf(stderr, "Unrecognined event: %s\n", tokens[0].c_str());
Lei Zhang 2016/04/18 22:49:10 typo
Tom Sepez 2016/04/18 23:02:11 Done.
478 }
479 }
480 }
481
421 bool RenderPage(const std::string& name, 482 bool RenderPage(const std::string& name,
422 const FPDF_DOCUMENT& doc, 483 const FPDF_DOCUMENT& doc,
423 const FPDF_FORMHANDLE& form, 484 const FPDF_FORMHANDLE& form,
424 const int page_index, 485 const int page_index,
425 const Options& options) { 486 const Options& options,
487 const std::string& events) {
426 FPDF_PAGE page = FPDF_LoadPage(doc, page_index); 488 FPDF_PAGE page = FPDF_LoadPage(doc, page_index);
427 if (!page) { 489 if (!page) {
428 return false; 490 return false;
429 } 491 }
430 FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); 492 FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
431 FORM_OnAfterLoadPage(page, form); 493 FORM_OnAfterLoadPage(page, form);
432 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN); 494 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN);
433 495
496 if (options.send_events)
497 SendPageEvents(doc, form, events);
498
434 double scale = 1.0; 499 double scale = 1.0;
435 if (!options.scale_factor_as_string.empty()) { 500 if (!options.scale_factor_as_string.empty()) {
436 std::stringstream(options.scale_factor_as_string) >> scale; 501 std::stringstream(options.scale_factor_as_string) >> scale;
437 } 502 }
438 int width = static_cast<int>(FPDF_GetPageWidth(page) * scale); 503 int width = static_cast<int>(FPDF_GetPageWidth(page) * scale);
439 int height = static_cast<int>(FPDF_GetPageHeight(page) * scale); 504 int height = static_cast<int>(FPDF_GetPageHeight(page) * scale);
440 int alpha = FPDFPage_HasTransparency(page) ? 1 : 0; 505 int alpha = FPDFPage_HasTransparency(page) ? 1 : 0;
441 FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, alpha); 506 FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, alpha);
442 if (!bitmap) { 507 if (!bitmap) {
443 fprintf(stderr, "Page was too large to be rendered.\n"); 508 fprintf(stderr, "Page was too large to be rendered.\n");
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 } 548 }
484 549
485 FPDFBitmap_Destroy(bitmap); 550 FPDFBitmap_Destroy(bitmap);
486 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); 551 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE);
487 FORM_OnBeforeClosePage(page, form); 552 FORM_OnBeforeClosePage(page, form);
488 FPDFText_ClosePage(text_page); 553 FPDFText_ClosePage(text_page);
489 FPDF_ClosePage(page); 554 FPDF_ClosePage(page);
490 return true; 555 return true;
491 } 556 }
492 557
493 void RenderPdf(const std::string& name, const char* pBuf, size_t len, 558 void RenderPdf(const std::string& name,
494 const Options& options) { 559 const char* pBuf,
560 size_t len,
561 const Options& options,
562 const std::string& events) {
495 fprintf(stderr, "Rendering PDF file %s.\n", name.c_str()); 563 fprintf(stderr, "Rendering PDF file %s.\n", name.c_str());
496 564
497 IPDF_JSPLATFORM platform_callbacks; 565 IPDF_JSPLATFORM platform_callbacks;
498 memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); 566 memset(&platform_callbacks, '\0', sizeof(platform_callbacks));
499 platform_callbacks.version = 3; 567 platform_callbacks.version = 3;
500 platform_callbacks.app_alert = ExampleAppAlert; 568 platform_callbacks.app_alert = ExampleAppAlert;
501 platform_callbacks.app_response = ExampleAppResponse; 569 platform_callbacks.app_response = ExampleAppResponse;
502 platform_callbacks.Doc_gotoPage = ExampleDocGotoPage; 570 platform_callbacks.Doc_gotoPage = ExampleDocGotoPage;
503 platform_callbacks.Doc_mail = ExampleDocMail; 571 platform_callbacks.Doc_mail = ExampleDocMail;
504 572
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 nRet = PDF_DATA_NOTAVAIL; 684 nRet = PDF_DATA_NOTAVAIL;
617 while (nRet == PDF_DATA_NOTAVAIL) { 685 while (nRet == PDF_DATA_NOTAVAIL) {
618 nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints); 686 nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints);
619 } 687 }
620 if (nRet == PDF_DATA_ERROR) { 688 if (nRet == PDF_DATA_ERROR) {
621 fprintf(stderr, "Unknown error in checking if page %d is available.\n", 689 fprintf(stderr, "Unknown error in checking if page %d is available.\n",
622 i); 690 i);
623 return; 691 return;
624 } 692 }
625 } 693 }
626 if (RenderPage(name, doc, form, i, options)) { 694 if (RenderPage(name, doc, form, i, options, events)) {
627 ++rendered_pages; 695 ++rendered_pages;
628 } else { 696 } else {
629 ++bad_pages; 697 ++bad_pages;
630 } 698 }
631 } 699 }
632 700
633 FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); 701 FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC);
634 702
635 #ifdef PDF_ENABLE_XFA 703 #ifdef PDF_ENABLE_XFA
636 // Note: The shut down order here is the reverse of the non-XFA branch order. 704 // Note: The shut down order here is the reverse of the non-XFA branch order.
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 unsuppored_info.FSDK_UnSupport_Handler = ExampleUnsupportedHandler; 805 unsuppored_info.FSDK_UnSupport_Handler = ExampleUnsupportedHandler;
738 806
739 FSDK_SetUnSpObjProcessHandler(&unsuppored_info); 807 FSDK_SetUnSpObjProcessHandler(&unsuppored_info);
740 808
741 while (!files.empty()) { 809 while (!files.empty()) {
742 std::string filename = files.front(); 810 std::string filename = files.front();
743 files.pop_front(); 811 files.pop_front();
744 size_t file_length = 0; 812 size_t file_length = 0;
745 std::unique_ptr<char, pdfium::FreeDeleter> file_contents = 813 std::unique_ptr<char, pdfium::FreeDeleter> file_contents =
746 GetFileContents(filename.c_str(), &file_length); 814 GetFileContents(filename.c_str(), &file_length);
747 if (file_contents) 815 if (!file_contents)
748 RenderPdf(filename, file_contents.get(), file_length, options); 816 continue;
817 std::string events;
818 if (options.send_events) {
819 std::string event_filename = filename;
820 size_t event_length = 0;
821 size_t extension_pos = event_filename.find(".pdf");
822 if (extension_pos != std::string::npos) {
823 event_filename.replace(extension_pos, 4, ".evt");
824 std::unique_ptr<char, pdfium::FreeDeleter> event_contents =
825 GetFileContents(event_filename.c_str(), &event_length);
826 if (event_contents)
827 events = std::string(event_contents.get(), event_length);
828 else
Lei Zhang 2016/04/18 22:49:10 braces
829 fprintf(stderr, "Warning: no event file: %s\n",
830 event_filename.c_str());
831 }
832 }
833 RenderPdf(filename, file_contents.get(), file_length, options, events);
749 } 834 }
750 835
751 FPDF_DestroyLibrary(); 836 FPDF_DestroyLibrary();
752 #ifdef PDF_ENABLE_V8 837 #ifdef PDF_ENABLE_V8
753 v8::V8::ShutdownPlatform(); 838 v8::V8::ShutdownPlatform();
754 delete platform; 839 delete platform;
755 #endif // PDF_ENABLE_V8 840 #endif // PDF_ENABLE_V8
756 841
757 return 0; 842 return 0;
758 } 843 }
OLDNEW
« no previous file with comments | « no previous file | testing/test_support.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698