| Index: experimental/PdfViewer/pdf_viewer_main.cpp
|
| ===================================================================
|
| --- experimental/PdfViewer/pdf_viewer_main.cpp (revision 9970)
|
| +++ experimental/PdfViewer/pdf_viewer_main.cpp (working copy)
|
| @@ -11,7 +11,7 @@
|
| #include "SkTArray.h"
|
| #include "picture_utils.h"
|
|
|
| -#include "SkPdfParser.h"
|
| +#include "SkPdfRenderer.h"
|
|
|
| /**
|
| * Given list of directories and files to use as input, expects to find .pdf
|
| @@ -30,7 +30,7 @@
|
| SkDebugf("PDF to PNG rendering tool\n");
|
| SkDebugf("\n"
|
| "Usage: \n"
|
| -" %s <input>... -w <outputDir> \n"
|
| +" %s <input>... [-w <outputDir>] [-n | --no-page-ext] \n"
|
| , argv0);
|
| SkDebugf("\n\n");
|
| SkDebugf(
|
| @@ -38,6 +38,8 @@
|
| " expected to have the .skp extension.\n\n");
|
| SkDebugf(
|
| " outputDir: directory to write the rendered pdfs.\n\n");
|
| + SkDebugf(
|
| +" -n: no page extension if only one page.\n\n");
|
| SkDebugf("\n");
|
| }
|
|
|
| @@ -48,8 +50,7 @@
|
| * @returns false if the file did not has the expected extension.
|
| * if false is returned, contents of path are undefined.
|
| */
|
| -/*
|
| -static bool replace_filename_extension(SkString* path,
|
| +static bool add_page_and_replace_filename_extension(SkString* path, int page,
|
| const char old_extension[],
|
| const char new_extension[]) {
|
| if (path->endsWith(old_extension)) {
|
| @@ -58,12 +59,15 @@
|
| if (!path->endsWith(".")) {
|
| return false;
|
| }
|
| + if (page >= 0) {
|
| + path->appendf("%i.", page);
|
| + }
|
| path->append(new_extension);
|
| return true;
|
| }
|
| return false;
|
| }
|
| -*/
|
| +
|
| /** Builds the output filename. path = dir/name, and it replaces expected
|
| * .skp extension with .pdf extention.
|
| * @param path Output filename.
|
| @@ -72,52 +76,76 @@
|
| * if false is returned, contents of path are undefined.
|
| */
|
|
|
| -/*
|
| +
|
| static bool make_output_filepath(SkString* path, const SkString& dir,
|
| - const SkString& name) {
|
| + const SkString& name,
|
| + int page) {
|
| sk_tools::make_filepath(path, dir, name);
|
| - return replace_filename_extension(path,
|
| - PDF_FILE_EXTENSION,
|
| - PNG_FILE_EXTENSION);
|
| + return add_page_and_replace_filename_extension(path, page,
|
| + PDF_FILE_EXTENSION,
|
| + PNG_FILE_EXTENSION);
|
| }
|
| -*/
|
| +
|
| +static void setup_bitmap(SkBitmap* bitmap, int width, int height, SkColor color = SK_ColorWHITE) {
|
| + bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height);
|
| +
|
| + bitmap->allocPixels();
|
| + bitmap->eraseColor(color);
|
| +}
|
| +
|
| /** Write the output of pdf renderer to a file.
|
| * @param outputDir Output dir.
|
| * @param inputFilename The skp file that was read.
|
| * @param renderer The object responsible to write the pdf file.
|
| */
|
| -/*
|
| -static bool write_output(const SkString& outputDir,
|
| +
|
| +static bool render_page(const SkString& outputDir,
|
| const SkString& inputFilename,
|
| - const SkPdfViewer& renderer) {
|
| + const SkPdfRenderer& renderer,
|
| + int page) {
|
| if (outputDir.isEmpty()) {
|
| - SkDynamicMemoryWStream stream;
|
| - renderer.write(&stream);
|
| - return true;
|
| + SkBitmap bitmap;
|
| + setup_bitmap(&bitmap, 1, 1);
|
| + SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (bitmap)));
|
| + SkCanvas canvas(device);
|
| + return renderer.renderPage(page < 0 ? 0 : page, &canvas);
|
| }
|
|
|
| SkString outputPath;
|
| - if (!make_output_filepath(&outputPath, outputDir, inputFilename)) {
|
| + if (!make_output_filepath(&outputPath, outputDir, inputFilename, page)) {
|
| return false;
|
| }
|
|
|
| - SkFILEWStream stream(outputPath.c_str());
|
| - if (!stream.isValid()) {
|
| - SkDebugf("Could not write to file %s\n", outputPath.c_str());
|
| - return false;
|
| - }
|
| - renderer.write(&stream);
|
| + SkRect rect = renderer.MediaBox(page);
|
|
|
| + SkBitmap bitmap;
|
| +#ifdef PDF_DEBUG_3X
|
| + setup_bitmap(&bitmap, 3 * (int)SkScalarToDouble(rect.width()), 3 * (int)SkScalarToDouble(rect.height()));
|
| +#else
|
| + setup_bitmap(&bitmap, (int)SkScalarToDouble(rect.width()), (int)SkScalarToDouble(rect.height()));
|
| +#endif
|
| + SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (bitmap)));
|
| + SkCanvas canvas(device);
|
| +
|
| + gDumpBitmap = &bitmap;
|
| +
|
| + gDumpCanvas = &canvas;
|
| + renderer.renderPage(page, &canvas);
|
| +
|
| + SkImageEncoder::EncodeFile(outputPath.c_str(), bitmap, SkImageEncoder::kPNG_Type, 100);
|
| +
|
| return true;
|
| }
|
| -*/
|
| +
|
| /** Reads an skp file, renders it to pdf and writes the output to a pdf file
|
| * @param inputPath The skp file to be read.
|
| * @param outputDir Output dir.
|
| * @param renderer The object responsible to render the skp object into pdf.
|
| */
|
| -static bool parse_pdf(const SkString& inputPath, const SkString& outputDir,
|
| - SkPdfViewer& renderer) {
|
| +static bool process_pdf(const SkString& inputPath, const SkString& outputDir,
|
| + SkPdfRenderer& renderer, bool noPageExt) {
|
| + SkDebugf("Loading PDF: %s\n", inputPath.c_str());
|
| +
|
| SkString inputFilename;
|
| sk_tools::get_basename(&inputFilename, inputPath);
|
|
|
| @@ -130,12 +158,20 @@
|
|
|
| bool success = false;
|
|
|
| - success = renderer.load(inputPath, NULL);
|
| + success = renderer.load(inputPath);
|
|
|
| + if (success) {
|
| + if (!renderer.pages())
|
| + {
|
| + SkDebugf("ERROR: Empty PDF Document %s\n", inputPath.c_str());
|
| + return false;
|
| + } else {
|
| + for (int pn = 0; pn < renderer.pages(); ++pn) {
|
| + success = render_page(outputDir, inputFilename, renderer, noPageExt && renderer.pages() == 1 ? -1 : pn) && success;
|
| + }
|
| + }
|
| + }
|
|
|
| -// success = write_output(outputDir, inputFilename, renderer);
|
| -
|
| - //renderer.end();
|
| return success;
|
| }
|
|
|
| @@ -146,7 +182,7 @@
|
| * @param renderer The object responsible to render the skp object into pdf.
|
| */
|
| static int process_input(const SkString& input, const SkString& outputDir,
|
| - SkPdfViewer& renderer) {
|
| + SkPdfRenderer& renderer, bool noPageExt) {
|
| int failures = 0;
|
| if (sk_isdir(input.c_str())) {
|
| SkOSFile::Iter iter(input.c_str(), PDF_FILE_EXTENSION);
|
| @@ -154,13 +190,13 @@
|
| while (iter.next(&inputFilename)) {
|
| SkString inputPath;
|
| sk_tools::make_filepath(&inputPath, input, inputFilename);
|
| - if (!parse_pdf(inputPath, outputDir, renderer)) {
|
| + if (!process_pdf(inputPath, outputDir, renderer, noPageExt)) {
|
| ++failures;
|
| }
|
| }
|
| } else {
|
| SkString inputPath(input);
|
| - if (!parse_pdf(inputPath, outputDir, renderer)) {
|
| + if (!process_pdf(inputPath, outputDir, renderer, noPageExt)) {
|
| ++failures;
|
| }
|
| }
|
| @@ -169,7 +205,7 @@
|
|
|
| static void parse_commandline(int argc, char* const argv[],
|
| SkTArray<SkString>* inputs,
|
| - SkString* outputDir) {
|
| + SkString* outputDir, bool* noPageExt) {
|
| const char* argv0 = argv[0];
|
| char* const* stop = argv + argc;
|
|
|
| @@ -177,6 +213,8 @@
|
| if ((0 == strcmp(*argv, "-h")) || (0 == strcmp(*argv, "--help"))) {
|
| usage(argv0);
|
| exit(-1);
|
| + } else if ((0 == strcmp(*argv, "-n")) || (0 == strcmp(*argv, "--no-page-ext"))) {
|
| + *noPageExt = true;
|
| } else if (0 == strcmp(*argv, "-w")) {
|
| ++argv;
|
| if (argv >= stop) {
|
| @@ -201,16 +239,16 @@
|
| SkAutoGraphics ag;
|
| SkTArray<SkString> inputs;
|
|
|
| - SkAutoTUnref<SkPdfViewer>
|
| - renderer(SkNEW(SkPdfViewer));
|
| - SkASSERT(renderer.get());
|
| + SkPdfRenderer renderer;
|
|
|
| SkString outputDir;
|
| - parse_commandline(argc, argv, &inputs, &outputDir);
|
| + bool noPageExt = false;
|
| + parse_commandline(argc, argv, &inputs, &outputDir, &noPageExt);
|
|
|
| int failures = 0;
|
| for (int i = 0; i < inputs.count(); i ++) {
|
| - failures += process_input(inputs[i], outputDir, *renderer);
|
| + failures += process_input(inputs[i], outputDir, renderer, noPageExt);
|
| + renderer.unload();
|
| }
|
|
|
| reportPdfRenderStats();
|
|
|