Index: samples/pdfium_test.cc |
diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc |
index 2ca31b08e9babbf6bfd69065981558611459bbe9..aa119c97e65cec4ea78f06374474f24751b567ac 100644 |
--- a/samples/pdfium_test.cc |
+++ b/samples/pdfium_test.cc |
@@ -54,9 +54,11 @@ enum OutputFormat { |
}; |
struct Options { |
- Options() : show_config(false), output_format(OUTPUT_NONE) {} |
+ Options() |
+ : show_config(false), send_events(false), output_format(OUTPUT_NONE) {} |
bool show_config; |
+ bool send_events; |
OutputFormat output_format; |
std::string scale_factor_as_string; |
std::string exe_path; |
@@ -338,6 +340,8 @@ bool ParseCommandLine(const std::vector<std::string>& args, |
const std::string& cur_arg = args[cur_idx]; |
if (cur_arg == "--show-config") { |
options->show_config = true; |
+ } else if (cur_arg == "--send-events") { |
+ options->send_events = true; |
} else if (cur_arg == "--ppm") { |
if (options->output_format != OUTPUT_NONE) { |
fprintf(stderr, "Duplicate or conflicting --ppm argument\n"); |
@@ -418,11 +422,73 @@ FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { |
void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) { |
} |
+void SendPageEvents(const FPDF_FORMHANDLE& form, |
+ const FPDF_PAGE& page, |
+ const std::string& events) { |
+ auto lines = StringSplit(events, '\n'); |
+ for (auto line : lines) { |
+ auto command = StringSplit(line, '#'); |
+ if (command[0].empty()) |
+ continue; |
+ auto tokens = StringSplit(command[0], ','); |
+ if (tokens[0] == "keycode") { |
+ if (tokens.size() == 2) { |
+ int keycode = atoi(tokens[1].c_str()); |
+ FORM_OnKeyDown(form, page, keycode, 0); |
+ FORM_OnKeyUp(form, page, keycode, 0); |
+ } else { |
+ fprintf(stderr, "keycode: bad args\n"); |
+ } |
+ } else if (tokens[0] == "mousedown") { |
+ if (tokens.size() == 4) { |
+ int x = atoi(tokens[2].c_str()); |
+ int y = atoi(tokens[3].c_str()); |
+ if (tokens[1] == "left") |
+ FORM_OnLButtonDown(form, page, 0, x, y); |
+#ifdef PDF_ENABLE_XFA |
+ else if (tokens[1] == "right") |
+ FORM_OnRButtonDown(form, page, 0, x, y); |
+#endif |
+ else |
+ fprintf(stderr, "mousedown: bad button name\n"); |
+ } else { |
+ fprintf(stderr, "mousedown: bad args\n"); |
+ } |
+ } else if (tokens[0] == "mouseup") { |
+ if (tokens.size() == 4) { |
+ int x = atoi(tokens[2].c_str()); |
+ int y = atoi(tokens[3].c_str()); |
+ if (tokens[1] == "left") |
+ FORM_OnLButtonUp(form, page, 0, x, y); |
+#ifdef PDF_ENABLE_XFA |
+ else if (tokens[1] == "right") |
+ FORM_OnRButtonUp(form, page, 0, x, y); |
+#endif |
+ else |
+ fprintf(stderr, "mouseup: bad button name\n"); |
+ } else { |
+ fprintf(stderr, "mouseup: bad args\n"); |
+ } |
+ } else if (tokens[0] == "mousemove") { |
+ if (tokens.size() == 3) { |
+ int x = atoi(tokens[1].c_str()); |
+ int y = atoi(tokens[2].c_str()); |
+ FORM_OnMouseMove(form, page, 0, x, y); |
+ } else { |
+ fprintf(stderr, "mousemove: bad args\n"); |
+ } |
+ } else { |
+ fprintf(stderr, "Unrecognized event: %s\n", tokens[0].c_str()); |
+ } |
+ } |
+} |
+ |
bool RenderPage(const std::string& name, |
const FPDF_DOCUMENT& doc, |
const FPDF_FORMHANDLE& form, |
const int page_index, |
- const Options& options) { |
+ const Options& options, |
+ const std::string& events) { |
FPDF_PAGE page = FPDF_LoadPage(doc, page_index); |
if (!page) { |
return false; |
@@ -431,6 +497,9 @@ bool RenderPage(const std::string& name, |
FORM_OnAfterLoadPage(page, form); |
FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN); |
+ if (options.send_events) |
+ SendPageEvents(doc, form, events); |
+ |
double scale = 1.0; |
if (!options.scale_factor_as_string.empty()) { |
std::stringstream(options.scale_factor_as_string) >> scale; |
@@ -490,8 +559,11 @@ bool RenderPage(const std::string& name, |
return true; |
} |
-void RenderPdf(const std::string& name, const char* pBuf, size_t len, |
- const Options& options) { |
+void RenderPdf(const std::string& name, |
+ const char* pBuf, |
+ size_t len, |
+ const Options& options, |
+ const std::string& events) { |
fprintf(stderr, "Rendering PDF file %s.\n", name.c_str()); |
IPDF_JSPLATFORM platform_callbacks; |
@@ -623,7 +695,7 @@ void RenderPdf(const std::string& name, const char* pBuf, size_t len, |
return; |
} |
} |
- if (RenderPage(name, doc, form, i, options)) { |
+ if (RenderPage(name, doc, form, i, options, events)) { |
++rendered_pages; |
} else { |
++bad_pages; |
@@ -744,8 +816,26 @@ int main(int argc, const char* argv[]) { |
size_t file_length = 0; |
std::unique_ptr<char, pdfium::FreeDeleter> file_contents = |
GetFileContents(filename.c_str(), &file_length); |
- if (file_contents) |
- RenderPdf(filename, file_contents.get(), file_length, options); |
+ if (!file_contents) |
+ continue; |
+ std::string events; |
+ if (options.send_events) { |
+ std::string event_filename = filename; |
+ size_t event_length = 0; |
+ size_t extension_pos = event_filename.find(".pdf"); |
+ if (extension_pos != std::string::npos) { |
+ event_filename.replace(extension_pos, 4, ".evt"); |
+ std::unique_ptr<char, pdfium::FreeDeleter> event_contents = |
+ GetFileContents(event_filename.c_str(), &event_length); |
+ if (event_contents) { |
+ events = std::string(event_contents.get(), event_length); |
+ } else { |
+ fprintf(stderr, "Warning: no event file: %s\n", |
+ event_filename.c_str()); |
+ } |
+ } |
+ } |
+ RenderPdf(filename, file_contents.get(), file_length, options, events); |
} |
FPDF_DestroyLibrary(); |