| 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> |
| 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 "core/fdrm/crypto/fx_crypt.h" |
| 20 #include "public/fpdf_dataavail.h" | 21 #include "public/fpdf_dataavail.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 _WIN32 | 30 #ifdef _WIN32 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 60 #ifdef PDF_ENABLE_SKIA | 61 #ifdef PDF_ENABLE_SKIA |
| 61 OUTPUT_SKP, | 62 OUTPUT_SKP, |
| 62 #endif | 63 #endif |
| 63 }; | 64 }; |
| 64 | 65 |
| 65 struct Options { | 66 struct Options { |
| 66 Options() | 67 Options() |
| 67 : show_config(false), | 68 : show_config(false), |
| 68 send_events(false), | 69 send_events(false), |
| 69 pages(false), | 70 pages(false), |
| 71 md5(false), |
| 70 output_format(OUTPUT_NONE) {} | 72 output_format(OUTPUT_NONE) {} |
| 71 | 73 |
| 72 bool show_config; | 74 bool show_config; |
| 73 bool send_events; | 75 bool send_events; |
| 74 bool pages; | 76 bool pages; |
| 77 bool md5; |
| 75 OutputFormat output_format; | 78 OutputFormat output_format; |
| 76 std::string scale_factor_as_string; | 79 std::string scale_factor_as_string; |
| 77 std::string exe_path; | 80 std::string exe_path; |
| 78 std::string bin_directory; | 81 std::string bin_directory; |
| 79 std::string font_directory; | 82 std::string font_directory; |
| 80 // 0-based page numbers to be rendered. | 83 // 0-based page numbers to be rendered. |
| 81 int first_page; | 84 int first_page; |
| 82 int last_page; | 85 int last_page; |
| 83 }; | 86 }; |
| 84 | 87 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 102 } | 105 } |
| 103 | 106 |
| 104 static bool CheckDimensions(int stride, int width, int height) { | 107 static bool CheckDimensions(int stride, int width, int height) { |
| 105 if (stride < 0 || width < 0 || height < 0) | 108 if (stride < 0 || width < 0 || height < 0) |
| 106 return false; | 109 return false; |
| 107 if (height > 0 && width > INT_MAX / height) | 110 if (height > 0 && width > INT_MAX / height) |
| 108 return false; | 111 return false; |
| 109 return true; | 112 return true; |
| 110 } | 113 } |
| 111 | 114 |
| 112 static void WritePpm(const char* pdf_name, int num, const void* buffer_void, | 115 static void OutputMD5Hash(const char* file_name, const char* buffer, int len) { |
| 113 int stride, int width, int height) { | 116 // Get the MD5 hash and write it to stdout. |
| 117 uint8_t digest[16]; |
| 118 CRYPT_MD5Generate(reinterpret_cast<const uint8_t*>(buffer), len, digest); |
| 119 printf("MD5:%s:", file_name); |
| 120 for (int i = 0; i < 16; i++) |
| 121 printf("%02x", digest[i]); |
| 122 printf("\n"); |
| 123 } |
| 124 |
| 125 static std::string WritePpm(const char* pdf_name, |
| 126 int num, |
| 127 const void* buffer_void, |
| 128 int stride, |
| 129 int width, |
| 130 int height) { |
| 114 const char* buffer = reinterpret_cast<const char*>(buffer_void); | 131 const char* buffer = reinterpret_cast<const char*>(buffer_void); |
| 115 | 132 |
| 116 if (!CheckDimensions(stride, width, height)) | 133 if (!CheckDimensions(stride, width, height)) |
| 117 return; | 134 return ""; |
| 118 | 135 |
| 119 int out_len = width * height; | 136 int out_len = width * height; |
| 120 if (out_len > INT_MAX / 3) | 137 if (out_len > INT_MAX / 3) |
| 121 return; | 138 return ""; |
| 122 out_len *= 3; | 139 out_len *= 3; |
| 123 | 140 |
| 124 char filename[256]; | 141 char filename[256]; |
| 125 snprintf(filename, sizeof(filename), "%s.%d.ppm", pdf_name, num); | 142 snprintf(filename, sizeof(filename), "%s.%d.ppm", pdf_name, num); |
| 126 FILE* fp = fopen(filename, "wb"); | 143 FILE* fp = fopen(filename, "wb"); |
| 127 if (!fp) | 144 if (!fp) |
| 128 return; | 145 return ""; |
| 129 fprintf(fp, "P6\n# PDF test render\n%d %d\n255\n", width, height); | 146 fprintf(fp, "P6\n# PDF test render\n%d %d\n255\n", width, height); |
| 130 // Source data is B, G, R, unused. | 147 // Source data is B, G, R, unused. |
| 131 // Dest data is R, G, B. | 148 // Dest data is R, G, B. |
| 132 std::vector<char> result(out_len); | 149 std::vector<char> result(out_len); |
| 133 for (int h = 0; h < height; ++h) { | 150 for (int h = 0; h < height; ++h) { |
| 134 const char* src_line = buffer + (stride * h); | 151 const char* src_line = buffer + (stride * h); |
| 135 char* dest_line = result.data() + (width * h * 3); | 152 char* dest_line = result.data() + (width * h * 3); |
| 136 for (int w = 0; w < width; ++w) { | 153 for (int w = 0; w < width; ++w) { |
| 137 // R | 154 // R |
| 138 dest_line[w * 3] = src_line[(w * 4) + 2]; | 155 dest_line[w * 3] = src_line[(w * 4) + 2]; |
| 139 // G | 156 // G |
| 140 dest_line[(w * 3) + 1] = src_line[(w * 4) + 1]; | 157 dest_line[(w * 3) + 1] = src_line[(w * 4) + 1]; |
| 141 // B | 158 // B |
| 142 dest_line[(w * 3) + 2] = src_line[w * 4]; | 159 dest_line[(w * 3) + 2] = src_line[w * 4]; |
| 143 } | 160 } |
| 144 } | 161 } |
| 145 fwrite(result.data(), out_len, 1, fp); | 162 fwrite(result.data(), out_len, 1, fp); |
| 146 fclose(fp); | 163 fclose(fp); |
| 164 return std::string(filename); |
| 147 } | 165 } |
| 148 | 166 |
| 149 void WriteText(FPDF_PAGE page, const char* pdf_name, int num) { | 167 void WriteText(FPDF_PAGE page, const char* pdf_name, int num) { |
| 150 char filename[256]; | 168 char filename[256]; |
| 151 int chars_formatted = | 169 int chars_formatted = |
| 152 snprintf(filename, sizeof(filename), "%s.%d.txt", pdf_name, num); | 170 snprintf(filename, sizeof(filename), "%s.%d.txt", pdf_name, num); |
| 153 if (chars_formatted < 0 || | 171 if (chars_formatted < 0 || |
| 154 static_cast<size_t>(chars_formatted) >= sizeof(filename)) { | 172 static_cast<size_t>(chars_formatted) >= sizeof(filename)) { |
| 155 fprintf(stderr, "Filename %s is too long\n", filename); | 173 fprintf(stderr, "Filename %s is too long\n", filename); |
| 156 return; | 174 return; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 170 for (int i = 0; i < FPDFText_CountChars(textpage); i++) { | 188 for (int i = 0; i < FPDFText_CountChars(textpage); i++) { |
| 171 uint32_t c = FPDFText_GetUnicode(textpage, i); | 189 uint32_t c = FPDFText_GetUnicode(textpage, i); |
| 172 fwrite(&c, sizeof(c), 1, fp); | 190 fwrite(&c, sizeof(c), 1, fp); |
| 173 } | 191 } |
| 174 | 192 |
| 175 FPDFText_ClosePage(textpage); | 193 FPDFText_ClosePage(textpage); |
| 176 | 194 |
| 177 (void)fclose(fp); | 195 (void)fclose(fp); |
| 178 } | 196 } |
| 179 | 197 |
| 180 static void WritePng(const char* pdf_name, int num, const void* buffer_void, | 198 static std::string WritePng(const char* pdf_name, |
| 181 int stride, int width, int height) { | 199 int num, |
| 200 const void* buffer_void, |
| 201 int stride, |
| 202 int width, |
| 203 int height) { |
| 182 if (!CheckDimensions(stride, width, height)) | 204 if (!CheckDimensions(stride, width, height)) |
| 183 return; | 205 return ""; |
| 184 | 206 |
| 185 std::vector<unsigned char> png_encoding; | 207 std::vector<unsigned char> png_encoding; |
| 186 const unsigned char* buffer = static_cast<const unsigned char*>(buffer_void); | 208 const unsigned char* buffer = static_cast<const unsigned char*>(buffer_void); |
| 187 if (!image_diff_png::EncodeBGRAPNG( | 209 if (!image_diff_png::EncodeBGRAPNG( |
| 188 buffer, width, height, stride, false, &png_encoding)) { | 210 buffer, width, height, stride, false, &png_encoding)) { |
| 189 fprintf(stderr, "Failed to convert bitmap to PNG\n"); | 211 fprintf(stderr, "Failed to convert bitmap to PNG\n"); |
| 190 return; | 212 return ""; |
| 191 } | 213 } |
| 192 | 214 |
| 193 char filename[256]; | 215 char filename[256]; |
| 194 int chars_formatted = snprintf( | 216 int chars_formatted = snprintf( |
| 195 filename, sizeof(filename), "%s.%d.png", pdf_name, num); | 217 filename, sizeof(filename), "%s.%d.png", pdf_name, num); |
| 196 if (chars_formatted < 0 || | 218 if (chars_formatted < 0 || |
| 197 static_cast<size_t>(chars_formatted) >= sizeof(filename)) { | 219 static_cast<size_t>(chars_formatted) >= sizeof(filename)) { |
| 198 fprintf(stderr, "Filename %s is too long\n", filename); | 220 fprintf(stderr, "Filename %s is too long\n", filename); |
| 199 return; | 221 return ""; |
| 200 } | 222 } |
| 201 | 223 |
| 202 FILE* fp = fopen(filename, "wb"); | 224 FILE* fp = fopen(filename, "wb"); |
| 203 if (!fp) { | 225 if (!fp) { |
| 204 fprintf(stderr, "Failed to open %s for output\n", filename); | 226 fprintf(stderr, "Failed to open %s for output\n", filename); |
| 205 return; | 227 return ""; |
| 206 } | 228 } |
| 207 | 229 |
| 208 size_t bytes_written = fwrite( | 230 size_t bytes_written = fwrite( |
| 209 &png_encoding.front(), 1, png_encoding.size(), fp); | 231 &png_encoding.front(), 1, png_encoding.size(), fp); |
| 210 if (bytes_written != png_encoding.size()) | 232 if (bytes_written != png_encoding.size()) |
| 211 fprintf(stderr, "Failed to write to %s\n", filename); | 233 fprintf(stderr, "Failed to write to %s\n", filename); |
| 212 | 234 |
| 213 (void)fclose(fp); | 235 (void)fclose(fp); |
| 236 return std::string(filename); |
| 214 } | 237 } |
| 215 | 238 |
| 216 #ifdef _WIN32 | 239 #ifdef _WIN32 |
| 217 static void WriteBmp(const char* pdf_name, int num, const void* buffer, | 240 static std::string WriteBmp(const char* pdf_name, |
| 218 int stride, int width, int height) { | 241 int num, |
| 242 const void* buffer, |
| 243 int stride, |
| 244 int width, |
| 245 int height) { |
| 219 if (!CheckDimensions(stride, width, height)) | 246 if (!CheckDimensions(stride, width, height)) |
| 220 return; | 247 return ""; |
| 221 | 248 |
| 222 int out_len = stride * height; | 249 int out_len = stride * height; |
| 223 if (out_len > INT_MAX / 3) | 250 if (out_len > INT_MAX / 3) |
| 224 return; | 251 return ""; |
| 225 | 252 |
| 226 char filename[256]; | 253 char filename[256]; |
| 227 snprintf(filename, sizeof(filename), "%s.%d.bmp", pdf_name, num); | 254 snprintf(filename, sizeof(filename), "%s.%d.bmp", pdf_name, num); |
| 228 FILE* fp = fopen(filename, "wb"); | 255 FILE* fp = fopen(filename, "wb"); |
| 229 if (!fp) | 256 if (!fp) |
| 230 return; | 257 return ""; |
| 231 | 258 |
| 232 BITMAPINFO bmi = {}; | 259 BITMAPINFO bmi = {}; |
| 233 bmi.bmiHeader.biSize = sizeof(bmi) - sizeof(RGBQUAD); | 260 bmi.bmiHeader.biSize = sizeof(bmi) - sizeof(RGBQUAD); |
| 234 bmi.bmiHeader.biWidth = width; | 261 bmi.bmiHeader.biWidth = width; |
| 235 bmi.bmiHeader.biHeight = -height; // top-down image | 262 bmi.bmiHeader.biHeight = -height; // top-down image |
| 236 bmi.bmiHeader.biPlanes = 1; | 263 bmi.bmiHeader.biPlanes = 1; |
| 237 bmi.bmiHeader.biBitCount = 32; | 264 bmi.bmiHeader.biBitCount = 32; |
| 238 bmi.bmiHeader.biCompression = BI_RGB; | 265 bmi.bmiHeader.biCompression = BI_RGB; |
| 239 bmi.bmiHeader.biSizeImage = 0; | 266 bmi.bmiHeader.biSizeImage = 0; |
| 240 | 267 |
| 241 BITMAPFILEHEADER file_header = {}; | 268 BITMAPFILEHEADER file_header = {}; |
| 242 file_header.bfType = 0x4d42; | 269 file_header.bfType = 0x4d42; |
| 243 file_header.bfSize = sizeof(file_header) + bmi.bmiHeader.biSize + out_len; | 270 file_header.bfSize = sizeof(file_header) + bmi.bmiHeader.biSize + out_len; |
| 244 file_header.bfOffBits = file_header.bfSize - out_len; | 271 file_header.bfOffBits = file_header.bfSize - out_len; |
| 245 | 272 |
| 246 fwrite(&file_header, sizeof(file_header), 1, fp); | 273 fwrite(&file_header, sizeof(file_header), 1, fp); |
| 247 fwrite(&bmi, bmi.bmiHeader.biSize, 1, fp); | 274 fwrite(&bmi, bmi.bmiHeader.biSize, 1, fp); |
| 248 fwrite(buffer, out_len, 1, fp); | 275 fwrite(buffer, out_len, 1, fp); |
| 249 fclose(fp); | 276 fclose(fp); |
| 277 return std::string(filename); |
| 250 } | 278 } |
| 251 | 279 |
| 252 void WriteEmf(FPDF_PAGE page, const char* pdf_name, int num) { | 280 void WriteEmf(FPDF_PAGE page, const char* pdf_name, int num) { |
| 253 int width = static_cast<int>(FPDF_GetPageWidth(page)); | 281 int width = static_cast<int>(FPDF_GetPageWidth(page)); |
| 254 int height = static_cast<int>(FPDF_GetPageHeight(page)); | 282 int height = static_cast<int>(FPDF_GetPageHeight(page)); |
| 255 | 283 |
| 256 char filename[256]; | 284 char filename[256]; |
| 257 snprintf(filename, sizeof(filename), "%s.%d.emf", pdf_name, num); | 285 snprintf(filename, sizeof(filename), "%s.%d.emf", pdf_name, num); |
| 258 | 286 |
| 259 HDC dc = CreateEnhMetaFileA(nullptr, filename, nullptr, nullptr); | 287 HDC dc = CreateEnhMetaFileA(nullptr, filename, nullptr, nullptr); |
| 260 | 288 |
| 261 HRGN rgn = CreateRectRgn(0, 0, width, height); | 289 HRGN rgn = CreateRectRgn(0, 0, width, height); |
| 262 SelectClipRgn(dc, rgn); | 290 SelectClipRgn(dc, rgn); |
| 263 DeleteObject(rgn); | 291 DeleteObject(rgn); |
| 264 | 292 |
| 265 SelectObject(dc, GetStockObject(NULL_PEN)); | 293 SelectObject(dc, GetStockObject(NULL_PEN)); |
| 266 SelectObject(dc, GetStockObject(WHITE_BRUSH)); | 294 SelectObject(dc, GetStockObject(WHITE_BRUSH)); |
| 267 // If a PS_NULL pen is used, the dimensions of the rectangle are 1 pixel less. | 295 // If a PS_NULL pen is used, the dimensions of the rectangle are 1 pixel less. |
| 268 Rectangle(dc, 0, 0, width + 1, height + 1); | 296 Rectangle(dc, 0, 0, width + 1, height + 1); |
| 269 | 297 |
| 270 FPDF_RenderPage(dc, page, 0, 0, width, height, 0, | 298 FPDF_RenderPage(dc, page, 0, 0, width, height, 0, |
| 271 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); | 299 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); |
| 272 | 300 |
| 273 DeleteEnhMetaFile(CloseEnhMetaFile(dc)); | 301 DeleteEnhMetaFile(CloseEnhMetaFile(dc)); |
| 274 } | 302 } |
| 275 #endif | 303 #endif |
| 276 | 304 |
| 277 #ifdef PDF_ENABLE_SKIA | 305 #ifdef PDF_ENABLE_SKIA |
| 278 void WriteSkp(const char* pdf_name, int num, SkPictureRecorder* recorder) { | 306 static std::string WriteSkp(const char* pdf_name, |
| 307 int num, |
| 308 SkPictureRecorder* recorder) { |
| 279 char filename[256]; | 309 char filename[256]; |
| 280 int chars_formatted = | 310 int chars_formatted = |
| 281 snprintf(filename, sizeof(filename), "%s.%d.skp", pdf_name, num); | 311 snprintf(filename, sizeof(filename), "%s.%d.skp", pdf_name, num); |
| 282 | 312 |
| 283 if (chars_formatted < 0 || | 313 if (chars_formatted < 0 || |
| 284 static_cast<size_t>(chars_formatted) >= sizeof(filename)) { | 314 static_cast<size_t>(chars_formatted) >= sizeof(filename)) { |
| 285 fprintf(stderr, "Filename %s is too long\n", filename); | 315 fprintf(stderr, "Filename %s is too long\n", filename); |
| 286 return; | 316 return ""; |
| 287 } | 317 } |
| 288 | 318 |
| 289 sk_sp<SkPicture> picture(recorder->finishRecordingAsPicture()); | 319 sk_sp<SkPicture> picture(recorder->finishRecordingAsPicture()); |
| 290 SkFILEWStream wStream(filename); | 320 SkFILEWStream wStream(filename); |
| 291 picture->serialize(&wStream); | 321 picture->serialize(&wStream); |
| 322 return std::string(filename); |
| 292 } | 323 } |
| 293 #endif | 324 #endif |
| 294 | 325 |
| 295 // These example JS platform callback handlers are entirely optional, | 326 // These example JS platform callback handlers are entirely optional, |
| 296 // and exist here to show the flow of information from a document back | 327 // and exist here to show the flow of information from a document back |
| 297 // to the embedder. | 328 // to the embedder. |
| 298 int ExampleAppAlert(IPDF_JSPLATFORM*, | 329 int ExampleAppAlert(IPDF_JSPLATFORM*, |
| 299 FPDF_WIDESTRING msg, | 330 FPDF_WIDESTRING msg, |
| 300 FPDF_WIDESTRING title, | 331 FPDF_WIDESTRING title, |
| 301 int type, | 332 int type, |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 size_t first_dash = pages_string.find("-"); | 514 size_t first_dash = pages_string.find("-"); |
| 484 if (first_dash == std::string::npos) { | 515 if (first_dash == std::string::npos) { |
| 485 std::stringstream(pages_string) >> options->first_page; | 516 std::stringstream(pages_string) >> options->first_page; |
| 486 options->last_page = options->first_page; | 517 options->last_page = options->first_page; |
| 487 } else { | 518 } else { |
| 488 std::stringstream(pages_string.substr(0, first_dash)) >> | 519 std::stringstream(pages_string.substr(0, first_dash)) >> |
| 489 options->first_page; | 520 options->first_page; |
| 490 std::stringstream(pages_string.substr(first_dash + 1)) >> | 521 std::stringstream(pages_string.substr(first_dash + 1)) >> |
| 491 options->last_page; | 522 options->last_page; |
| 492 } | 523 } |
| 524 } else if (cur_arg == "--md5") { |
| 525 options->md5 = true; |
| 493 } else if (cur_arg.size() >= 2 && cur_arg[0] == '-' && cur_arg[1] == '-') { | 526 } else if (cur_arg.size() >= 2 && cur_arg[0] == '-' && cur_arg[1] == '-') { |
| 494 fprintf(stderr, "Unrecognized argument %s\n", cur_arg.c_str()); | 527 fprintf(stderr, "Unrecognized argument %s\n", cur_arg.c_str()); |
| 495 return false; | 528 return false; |
| 496 } else { | 529 } else { |
| 497 break; | 530 break; |
| 498 } | 531 } |
| 499 } | 532 } |
| 500 for (size_t i = cur_idx; i < args.size(); i++) | 533 for (size_t i = cur_idx; i < args.size(); i++) |
| 501 files->push_back(args[i]); | 534 files->push_back(args[i]); |
| 502 | 535 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 621 if (bitmap) { | 654 if (bitmap) { |
| 622 FPDF_DWORD fill_color = alpha ? 0x00000000 : 0xFFFFFFFF; | 655 FPDF_DWORD fill_color = alpha ? 0x00000000 : 0xFFFFFFFF; |
| 623 FPDFBitmap_FillRect(bitmap, 0, 0, width, height, fill_color); | 656 FPDFBitmap_FillRect(bitmap, 0, 0, width, height, fill_color); |
| 624 FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, FPDF_ANNOT); | 657 FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, FPDF_ANNOT); |
| 625 | 658 |
| 626 FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, FPDF_ANNOT); | 659 FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, FPDF_ANNOT); |
| 627 int stride = FPDFBitmap_GetStride(bitmap); | 660 int stride = FPDFBitmap_GetStride(bitmap); |
| 628 const char* buffer = | 661 const char* buffer = |
| 629 reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap)); | 662 reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap)); |
| 630 | 663 |
| 664 std::string&& image_file_name = ""; |
| 631 switch (options.output_format) { | 665 switch (options.output_format) { |
| 632 #ifdef _WIN32 | 666 #ifdef _WIN32 |
| 633 case OUTPUT_BMP: | 667 case OUTPUT_BMP: |
| 634 WriteBmp(name.c_str(), page_index, buffer, stride, width, height); | 668 image_file_name = |
| 669 WriteBmp(name.c_str(), page_index, buffer, stride, width, height); |
| 635 break; | 670 break; |
| 636 | 671 |
| 637 case OUTPUT_EMF: | 672 case OUTPUT_EMF: |
| 638 WriteEmf(page, name.c_str(), page_index); | 673 WriteEmf(page, name.c_str(), page_index); |
| 639 break; | 674 break; |
| 640 #endif | 675 #endif |
| 641 case OUTPUT_TEXT: | 676 case OUTPUT_TEXT: |
| 642 WriteText(page, name.c_str(), page_index); | 677 WriteText(page, name.c_str(), page_index); |
| 643 break; | 678 break; |
| 644 | 679 |
| 645 case OUTPUT_PNG: | 680 case OUTPUT_PNG: |
| 646 WritePng(name.c_str(), page_index, buffer, stride, width, height); | 681 image_file_name = |
| 682 WritePng(name.c_str(), page_index, buffer, stride, width, height); |
| 647 break; | 683 break; |
| 648 | 684 |
| 649 case OUTPUT_PPM: | 685 case OUTPUT_PPM: |
| 650 WritePpm(name.c_str(), page_index, buffer, stride, width, height); | 686 image_file_name = |
| 687 WritePpm(name.c_str(), page_index, buffer, stride, width, height); |
| 651 break; | 688 break; |
| 652 | 689 |
| 653 #ifdef PDF_ENABLE_SKIA | 690 #ifdef PDF_ENABLE_SKIA |
| 654 case OUTPUT_SKP: { | 691 case OUTPUT_SKP: { |
| 655 std::unique_ptr<SkPictureRecorder> recorder( | 692 std::unique_ptr<SkPictureRecorder> recorder( |
| 656 reinterpret_cast<SkPictureRecorder*>( | 693 reinterpret_cast<SkPictureRecorder*>( |
| 657 FPDF_RenderPageSkp(page, width, height))); | 694 FPDF_RenderPageSkp(page, width, height))); |
| 658 FPDF_FFLRecord(form, recorder.get(), page, 0, 0, width, height, 0, 0); | 695 FPDF_FFLRecord(form, recorder.get(), page, 0, 0, width, height, 0, 0); |
| 659 WriteSkp(name.c_str(), page_index, recorder.get()); | 696 image_file_name = WriteSkp(name.c_str(), page_index, recorder.get()); |
| 660 } break; | 697 } break; |
| 661 #endif | 698 #endif |
| 662 default: | 699 default: |
| 663 break; | 700 break; |
| 664 } | 701 } |
| 665 | 702 |
| 703 // Write the filename and the MD5 of the buffer to stdout if we wrote a |
| 704 // file. |
| 705 if (options.md5 && image_file_name != "") |
| 706 OutputMD5Hash(image_file_name.c_str(), buffer, stride * height); |
| 707 |
| 666 FPDFBitmap_Destroy(bitmap); | 708 FPDFBitmap_Destroy(bitmap); |
| 667 } else { | 709 } else { |
| 668 fprintf(stderr, "Page was too large to be rendered.\n"); | 710 fprintf(stderr, "Page was too large to be rendered.\n"); |
| 669 } | 711 } |
| 670 | 712 |
| 671 form_fill_info.loaded_pages.erase(page_index); | 713 form_fill_info.loaded_pages.erase(page_index); |
| 672 | 714 |
| 673 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); | 715 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); |
| 674 FORM_OnBeforeClosePage(page, form); | 716 FORM_OnBeforeClosePage(page, form); |
| 675 FPDFText_ClosePage(text_page); | 717 FPDFText_ClosePage(text_page); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 #ifdef _WIN32 | 907 #ifdef _WIN32 |
| 866 " --bmp - write page images <pdf-name>.<page-number>.bmp\n" | 908 " --bmp - write page images <pdf-name>.<page-number>.bmp\n" |
| 867 " --emf - write page meta files <pdf-name>.<page-number>.emf\n" | 909 " --emf - write page meta files <pdf-name>.<page-number>.emf\n" |
| 868 #endif // _WIN32 | 910 #endif // _WIN32 |
| 869 " --txt - write page text in UTF32-LE <pdf-name>.<page-number>.txt\n" | 911 " --txt - write page text in UTF32-LE <pdf-name>.<page-number>.txt\n" |
| 870 " --png - write page images <pdf-name>.<page-number>.png\n" | 912 " --png - write page images <pdf-name>.<page-number>.png\n" |
| 871 " --ppm - write page images <pdf-name>.<page-number>.ppm\n" | 913 " --ppm - write page images <pdf-name>.<page-number>.ppm\n" |
| 872 #ifdef PDF_ENABLE_SKIA | 914 #ifdef PDF_ENABLE_SKIA |
| 873 " --skp - write page images <pdf-name>.<page-number>.skp\n" | 915 " --skp - write page images <pdf-name>.<page-number>.skp\n" |
| 874 #endif | 916 #endif |
| 917 " --md5 - write output image paths and their md5 hashes to stdout.\n" |
| 875 ""; | 918 ""; |
| 876 | 919 |
| 877 int main(int argc, const char* argv[]) { | 920 int main(int argc, const char* argv[]) { |
| 878 std::vector<std::string> args(argv, argv + argc); | 921 std::vector<std::string> args(argv, argv + argc); |
| 879 Options options; | 922 Options options; |
| 880 std::vector<std::string> files; | 923 std::vector<std::string> files; |
| 881 if (!ParseCommandLine(args, &options, &files)) { | 924 if (!ParseCommandLine(args, &options, &files)) { |
| 882 fprintf(stderr, "%s", kUsageString); | 925 fprintf(stderr, "%s", kUsageString); |
| 883 return 1; | 926 return 1; |
| 884 } | 927 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 961 delete platform; | 1004 delete platform; |
| 962 | 1005 |
| 963 #ifdef V8_USE_EXTERNAL_STARTUP_DATA | 1006 #ifdef V8_USE_EXTERNAL_STARTUP_DATA |
| 964 free(const_cast<char*>(natives.data)); | 1007 free(const_cast<char*>(natives.data)); |
| 965 free(const_cast<char*>(snapshot.data)); | 1008 free(const_cast<char*>(snapshot.data)); |
| 966 #endif // V8_USE_EXTERNAL_STARTUP_DATA | 1009 #endif // V8_USE_EXTERNAL_STARTUP_DATA |
| 967 #endif // PDF_ENABLE_V8 | 1010 #endif // PDF_ENABLE_V8 |
| 968 | 1011 |
| 969 return 0; | 1012 return 0; |
| 970 } | 1013 } |
| OLD | NEW |