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 <list> | 10 #include <list> |
11 #include <sstream> | 11 #include <sstream> |
12 #include <string> | 12 #include <string> |
13 #include <utility> | 13 #include <utility> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #if defined PDF_ENABLE_SKIA && !defined _SKIA_SUPPORT_ | 16 #if defined PDF_ENABLE_SKIA && !defined _SKIA_SUPPORT_ |
17 #define _SKIA_SUPPORT_ | 17 #define _SKIA_SUPPORT_ |
18 #endif | 18 #endif |
19 | 19 |
20 #include "public/fpdf_dataavail.h" | 20 #include "public/fpdf_dataavail.h" |
21 #include "public/fpdf_doc.h" | |
21 #include "public/fpdf_edit.h" | 22 #include "public/fpdf_edit.h" |
22 #include "public/fpdf_ext.h" | 23 #include "public/fpdf_ext.h" |
23 #include "public/fpdf_formfill.h" | 24 #include "public/fpdf_formfill.h" |
24 #include "public/fpdf_text.h" | 25 #include "public/fpdf_text.h" |
25 #include "public/fpdfview.h" | 26 #include "public/fpdfview.h" |
26 #include "samples/image_diff_png.h" | 27 #include "samples/image_diff_png.h" |
27 #include "testing/test_support.h" | 28 #include "testing/test_support.h" |
28 | 29 |
29 #ifdef PDF_ENABLE_V8 | 30 #ifdef PDF_ENABLE_V8 |
30 #include "v8/include/libplatform/libplatform.h" | 31 #include "v8/include/libplatform/libplatform.h" |
(...skipping 17 matching lines...) Expand all Loading... | |
48 OUTPUT_BMP, | 49 OUTPUT_BMP, |
49 OUTPUT_EMF, | 50 OUTPUT_EMF, |
50 #endif | 51 #endif |
51 #ifdef PDF_ENABLE_SKIA | 52 #ifdef PDF_ENABLE_SKIA |
52 OUTPUT_SKP, | 53 OUTPUT_SKP, |
53 #endif | 54 #endif |
54 }; | 55 }; |
55 | 56 |
56 struct Options { | 57 struct Options { |
57 Options() | 58 Options() |
58 : show_config(false), send_events(false), output_format(OUTPUT_NONE) {} | 59 : show_config(false), |
60 send_events(false), | |
61 show_annotations(false), | |
62 output_format(OUTPUT_NONE) {} | |
59 | 63 |
60 bool show_config; | 64 bool show_config; |
61 bool send_events; | 65 bool send_events; |
66 bool show_annotations; | |
62 OutputFormat output_format; | 67 OutputFormat output_format; |
63 std::string scale_factor_as_string; | 68 std::string scale_factor_as_string; |
64 std::string exe_path; | 69 std::string exe_path; |
65 std::string bin_directory; | 70 std::string bin_directory; |
66 std::string font_directory; | 71 std::string font_directory; |
67 }; | 72 }; |
68 | 73 |
69 static bool CheckDimensions(int stride, int width, int height) { | 74 static bool CheckDimensions(int stride, int width, int height) { |
70 if (stride < 0 || width < 0 || height < 0) | 75 if (stride < 0 || width < 0 || height < 0) |
71 return false; | 76 return false; |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
335 return false; | 340 return false; |
336 } | 341 } |
337 options->exe_path = args[0]; | 342 options->exe_path = args[0]; |
338 size_t cur_idx = 1; | 343 size_t cur_idx = 1; |
339 for (; cur_idx < args.size(); ++cur_idx) { | 344 for (; cur_idx < args.size(); ++cur_idx) { |
340 const std::string& cur_arg = args[cur_idx]; | 345 const std::string& cur_arg = args[cur_idx]; |
341 if (cur_arg == "--show-config") { | 346 if (cur_arg == "--show-config") { |
342 options->show_config = true; | 347 options->show_config = true; |
343 } else if (cur_arg == "--send-events") { | 348 } else if (cur_arg == "--send-events") { |
344 options->send_events = true; | 349 options->send_events = true; |
350 } else if (cur_arg == "--show-annotations") { | |
351 options->show_annotations = true; | |
345 } else if (cur_arg == "--ppm") { | 352 } else if (cur_arg == "--ppm") { |
346 if (options->output_format != OUTPUT_NONE) { | 353 if (options->output_format != OUTPUT_NONE) { |
347 fprintf(stderr, "Duplicate or conflicting --ppm argument\n"); | 354 fprintf(stderr, "Duplicate or conflicting --ppm argument\n"); |
348 return false; | 355 return false; |
349 } | 356 } |
350 options->output_format = OUTPUT_PPM; | 357 options->output_format = OUTPUT_PPM; |
351 } else if (cur_arg == "--png") { | 358 } else if (cur_arg == "--png") { |
352 if (options->output_format != OUTPUT_NONE) { | 359 if (options->output_format != OUTPUT_NONE) { |
353 fprintf(stderr, "Duplicate or conflicting --png argument\n"); | 360 fprintf(stderr, "Duplicate or conflicting --png argument\n"); |
354 return false; | 361 return false; |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
476 FORM_OnMouseMove(form, page, 0, x, y); | 483 FORM_OnMouseMove(form, page, 0, x, y); |
477 } else { | 484 } else { |
478 fprintf(stderr, "mousemove: bad args\n"); | 485 fprintf(stderr, "mousemove: bad args\n"); |
479 } | 486 } |
480 } else { | 487 } else { |
481 fprintf(stderr, "Unrecognized event: %s\n", tokens[0].c_str()); | 488 fprintf(stderr, "Unrecognized event: %s\n", tokens[0].c_str()); |
482 } | 489 } |
483 } | 490 } |
484 } | 491 } |
485 | 492 |
493 void ShowAnnotations(const FPDF_DOCUMENT& doc, const int page_index) { | |
494 FPDF_PAGE page = FPDF_LoadPage(doc, page_index); | |
Lei Zhang
2016/05/23 16:47:33
Why not put the ShowAnnotations() call inside Rend
| |
495 if (!page) { | |
496 fprintf(stderr, "bad page %d\n", page_index); | |
497 return; | |
498 } | |
499 printf("page %d [%g,%g]:\n", page_index, FPDF_GetPageWidth(page), | |
500 FPDF_GetPageHeight(page)); | |
501 int startPos = 0; | |
502 FPDF_LINK linkAnnot; | |
503 while (FPDFLink_Enumerate(page, &startPos, &linkAnnot)) { | |
504 FS_RECTF rect = {0.0f, 0.0f, 0.0f, 0.0f}; | |
505 (void)FPDFLink_GetAnnotRect(linkAnnot, &rect); | |
506 FPDF_ACTION action = FPDFLink_GetAction(linkAnnot); | |
507 if (action && PDFACTION_URI == FPDFAction_GetType(action)) { | |
508 auto len = FPDFAction_GetURIPath(doc, action, nullptr, 0); | |
Lei Zhang
2016/05/23 16:47:33
write out unsigned int instead of using auto?
| |
509 std::vector<char> buffer(len); | |
510 (void)FPDFAction_GetURIPath(doc, action, &buffer[0], buffer.size()); | |
511 printf(" <%g,%g,%g,%g> uri: \"%.*s\"\n", rect.left, rect.top, | |
Lei Zhang
2016/05/23 16:47:32
I see 5 conversion specifiers and 6 variables.
| |
512 rect.right, rect.bottom, (int)buffer.size(), &buffer[0]); | |
Lei Zhang
2016/05/23 16:47:33
Borrow PRIuS from base/format_macros.h for size_t
| |
513 } else if (FPDF_DEST dest = FPDFLink_GetDest(doc, linkAnnot)) { | |
514 unsigned long dest_page = FPDFDest_GetPageIndex(doc, dest); | |
515 FS_FLOAT x = 0.0f; | |
516 FS_FLOAT y = 0.0f; | |
517 (void)FPDFDest_GetLocationInPage(dest, &x, &y); | |
518 printf(" <%g,%g,%g,%g> page: %lu; point: (%g,%g)\n", rect.left, | |
519 rect.top, rect.right, rect.bottom, dest_page, x, y); | |
520 } | |
521 } | |
522 FPDF_ClosePage(page); | |
523 printf("\n"); | |
524 } | |
525 | |
486 bool RenderPage(const std::string& name, | 526 bool RenderPage(const std::string& name, |
487 const FPDF_DOCUMENT& doc, | 527 const FPDF_DOCUMENT& doc, |
488 const FPDF_FORMHANDLE& form, | 528 const FPDF_FORMHANDLE& form, |
489 const int page_index, | 529 const int page_index, |
490 const Options& options, | 530 const Options& options, |
491 const std::string& events) { | 531 const std::string& events) { |
492 FPDF_PAGE page = FPDF_LoadPage(doc, page_index); | 532 FPDF_PAGE page = FPDF_LoadPage(doc, page_index); |
493 if (!page) { | 533 if (!page) { |
494 return false; | 534 return false; |
495 } | 535 } |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
689 fprintf(stderr, "Unknown error in checking if page %d is available.\n", | 729 fprintf(stderr, "Unknown error in checking if page %d is available.\n", |
690 i); | 730 i); |
691 return; | 731 return; |
692 } | 732 } |
693 } | 733 } |
694 if (RenderPage(name, doc, form, i, options, events)) { | 734 if (RenderPage(name, doc, form, i, options, events)) { |
695 ++rendered_pages; | 735 ++rendered_pages; |
696 } else { | 736 } else { |
697 ++bad_pages; | 737 ++bad_pages; |
698 } | 738 } |
739 if (options.show_annotations) { | |
740 ShowAnnotations(doc, i); | |
741 } | |
699 } | 742 } |
700 | 743 |
701 FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); | 744 FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); |
702 | 745 |
703 #ifdef PDF_ENABLE_XFA | 746 #ifdef PDF_ENABLE_XFA |
704 // Note: The shut down order here is the reverse of the non-XFA branch order. | 747 // Note: The shut down order here is the reverse of the non-XFA branch order. |
705 // Need to work out if this is required, and if it is, the lifetimes of | 748 // Need to work out if this is required, and if it is, the lifetimes of |
706 // objects owned by |doc| that |form| reference. | 749 // objects owned by |doc| that |form| reference. |
707 FPDF_CloseDocument(doc); | 750 FPDF_CloseDocument(doc); |
708 FPDFDOC_ExitFormFillEnvironment(form); | 751 FPDFDOC_ExitFormFillEnvironment(form); |
(...skipping 25 matching lines...) Expand all Loading... | |
734 #ifdef PDF_ENABLE_XFA | 777 #ifdef PDF_ENABLE_XFA |
735 config.append(maybe_comma); | 778 config.append(maybe_comma); |
736 config.append("XFA"); | 779 config.append("XFA"); |
737 maybe_comma = ","; | 780 maybe_comma = ","; |
738 #endif // PDF_ENABLE_XFA | 781 #endif // PDF_ENABLE_XFA |
739 printf("%s\n", config.c_str()); | 782 printf("%s\n", config.c_str()); |
740 } | 783 } |
741 | 784 |
742 static const char usage_string[] = | 785 static const char usage_string[] = |
743 "Usage: pdfium_test [OPTION] [FILE]...\n" | 786 "Usage: pdfium_test [OPTION] [FILE]...\n" |
744 " --show-config - print build options and exit\n" | 787 " --show-config - print build options and exit\n" |
745 " --send-events - send input described by .evt file\n" | 788 " --send-events - send input described by .evt file\n" |
746 " --bin-dir=<path> - override path to v8 external data\n" | 789 " --bin-dir=<path> - override path to v8 external data\n" |
747 " --font-dir=<path> - override path to external fonts\n" | 790 " --font-dir=<path> - override path to external fonts\n" |
748 " --scale=<number> - scale output size by number (e.g. 0.5)\n" | 791 " --show-annotations - print information about URL and internal\n" |
792 " link annotations in the document.\n" | |
793 " --scale=<number> - scale output size by number (e.g. 0.5)\n" | |
749 #ifdef _WIN32 | 794 #ifdef _WIN32 |
750 " --bmp - write page images <pdf-name>.<page-number>.bmp\n" | 795 " --bmp - write page images <pdf-name>.<page-number>.bmp\n" |
751 " --emf - write page meta files <pdf-name>.<page-number>.emf\n" | 796 " --emf - write page meta files <pdf-name>.<page-number>.emf\n" |
752 #endif // _WIN32 | 797 #endif // _WIN32 |
753 " --png - write page images <pdf-name>.<page-number>.png\n" | 798 " --png - write page images <pdf-name>.<page-number>.png\n" |
754 #ifdef PDF_ENABLE_SKIA | 799 #ifdef PDF_ENABLE_SKIA |
755 " --skp - write page images <pdf-name>.<page-number>.skp\n" | 800 " --skp - write page images <pdf-name>.<page-number>.skp\n" |
756 #endif | 801 #endif |
757 ""; | 802 ""; |
758 | 803 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
836 } | 881 } |
837 | 882 |
838 FPDF_DestroyLibrary(); | 883 FPDF_DestroyLibrary(); |
839 #ifdef PDF_ENABLE_V8 | 884 #ifdef PDF_ENABLE_V8 |
840 v8::V8::ShutdownPlatform(); | 885 v8::V8::ShutdownPlatform(); |
841 delete platform; | 886 delete platform; |
842 #endif // PDF_ENABLE_V8 | 887 #endif // PDF_ENABLE_V8 |
843 | 888 |
844 return 0; | 889 return 0; |
845 } | 890 } |
OLD | NEW |