1c319abeeef205627dafd52d977157beafd409313edisonn@google.com/*
2c319abeeef205627dafd52d977157beafd409313edisonn@google.com * Copyright 2012 Google Inc.
3c319abeeef205627dafd52d977157beafd409313edisonn@google.com *
4c319abeeef205627dafd52d977157beafd409313edisonn@google.com * Use of this source code is governed by a BSD-style license that can be
5c319abeeef205627dafd52d977157beafd409313edisonn@google.com * found in the LICENSE file.
6c319abeeef205627dafd52d977157beafd409313edisonn@google.com */
7c319abeeef205627dafd52d977157beafd409313edisonn@google.com
8c319abeeef205627dafd52d977157beafd409313edisonn@google.com#include "SkCanvas.h"
9c319abeeef205627dafd52d977157beafd409313edisonn@google.com#include "SkDevice.h"
107def5e1630d47cdbfa4b58a9c86bc060693c4d79scroggo@google.com#include "SkForceLinking.h"
11c319abeeef205627dafd52d977157beafd409313edisonn@google.com#include "SkGraphics.h"
12d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com#include "SkImageEncoder.h"
13c319abeeef205627dafd52d977157beafd409313edisonn@google.com#include "SkOSFile.h"
14c319abeeef205627dafd52d977157beafd409313edisonn@google.com#include "SkPicture.h"
15608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org#include "SkPixelRef.h"
16c319abeeef205627dafd52d977157beafd409313edisonn@google.com#include "SkStream.h"
17c319abeeef205627dafd52d977157beafd409313edisonn@google.com#include "SkTArray.h"
18c319abeeef205627dafd52d977157beafd409313edisonn@google.com#include "PdfRenderer.h"
19c319abeeef205627dafd52d977157beafd409313edisonn@google.com#include "picture_utils.h"
20c319abeeef205627dafd52d977157beafd409313edisonn@google.com
217def5e1630d47cdbfa4b58a9c86bc060693c4d79scroggo@google.com__SK_FORCE_IMAGE_DECODER_LINKING;
227def5e1630d47cdbfa4b58a9c86bc060693c4d79scroggo@google.com
23184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com#ifdef SK_USE_CDB
24184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com#include "win_dbghelp.h"
25184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com#endif
26184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com
27c319abeeef205627dafd52d977157beafd409313edisonn@google.com/**
28c319abeeef205627dafd52d977157beafd409313edisonn@google.com * render_pdfs
29c319abeeef205627dafd52d977157beafd409313edisonn@google.com *
30c319abeeef205627dafd52d977157beafd409313edisonn@google.com * Given list of directories and files to use as input, expects to find .skp
31c319abeeef205627dafd52d977157beafd409313edisonn@google.com * files and it will convert them to .pdf files writing them in the output
32c319abeeef205627dafd52d977157beafd409313edisonn@google.com * directory.
33c319abeeef205627dafd52d977157beafd409313edisonn@google.com *
34c319abeeef205627dafd52d977157beafd409313edisonn@google.com * Returns zero exit code if all .skp files were converted successfully,
35c319abeeef205627dafd52d977157beafd409313edisonn@google.com * otherwise returns error code 1.
36c319abeeef205627dafd52d977157beafd409313edisonn@google.com */
37c319abeeef205627dafd52d977157beafd409313edisonn@google.com
38c319abeeef205627dafd52d977157beafd409313edisonn@google.comstatic const char PDF_FILE_EXTENSION[] = "pdf";
39c319abeeef205627dafd52d977157beafd409313edisonn@google.comstatic const char SKP_FILE_EXTENSION[] = "skp";
40c319abeeef205627dafd52d977157beafd409313edisonn@google.com
41c319abeeef205627dafd52d977157beafd409313edisonn@google.comstatic void usage(const char* argv0) {
42c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkDebugf("SKP to PDF rendering tool\n");
43c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkDebugf("\n"
44c319abeeef205627dafd52d977157beafd409313edisonn@google.com"Usage: \n"
45d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com"     %s <input>... [-w <outputDir>] [--jpegQuality N] \n"
46c319abeeef205627dafd52d977157beafd409313edisonn@google.com, argv0);
47c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkDebugf("\n\n");
48c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkDebugf(
49c319abeeef205627dafd52d977157beafd409313edisonn@google.com"     input:     A list of directories and files to use as input. Files are\n"
50c319abeeef205627dafd52d977157beafd409313edisonn@google.com"                expected to have the .skp extension.\n\n");
51c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkDebugf(
52c319abeeef205627dafd52d977157beafd409313edisonn@google.com"     outputDir: directory to write the rendered pdfs.\n\n");
53c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkDebugf("\n");
54d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com        SkDebugf(
55d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com"     jpegQuality N: encodes images in JPEG at quality level N, which can\n"
56d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com"                    be in range 0-100).\n"
57d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com"                    N = -1 will disable JPEG compression.\n"
58d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com"                    Default is N = 100, maximum quality.\n\n");
59d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com    SkDebugf("\n");
60c319abeeef205627dafd52d977157beafd409313edisonn@google.com}
61c319abeeef205627dafd52d977157beafd409313edisonn@google.com
62c319abeeef205627dafd52d977157beafd409313edisonn@google.com/** Replaces the extension of a file.
63c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param path File name whose extension will be changed.
64c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param old_extension The old extension.
65c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param new_extension The new extension.
66c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @returns false if the file did not has the expected extension.
67c319abeeef205627dafd52d977157beafd409313edisonn@google.com *  if false is returned, contents of path are undefined.
68c319abeeef205627dafd52d977157beafd409313edisonn@google.com */
69c319abeeef205627dafd52d977157beafd409313edisonn@google.comstatic bool replace_filename_extension(SkString* path,
70c319abeeef205627dafd52d977157beafd409313edisonn@google.com                                       const char old_extension[],
71c319abeeef205627dafd52d977157beafd409313edisonn@google.com                                       const char new_extension[]) {
72c319abeeef205627dafd52d977157beafd409313edisonn@google.com    if (path->endsWith(old_extension)) {
73c319abeeef205627dafd52d977157beafd409313edisonn@google.com        path->remove(path->size() - strlen(old_extension),
74c319abeeef205627dafd52d977157beafd409313edisonn@google.com                     strlen(old_extension));
75c319abeeef205627dafd52d977157beafd409313edisonn@google.com        if (!path->endsWith(".")) {
76c319abeeef205627dafd52d977157beafd409313edisonn@google.com            return false;
77c319abeeef205627dafd52d977157beafd409313edisonn@google.com        }
78c319abeeef205627dafd52d977157beafd409313edisonn@google.com        path->append(new_extension);
79c319abeeef205627dafd52d977157beafd409313edisonn@google.com        return true;
80c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
81c319abeeef205627dafd52d977157beafd409313edisonn@google.com    return false;
82c319abeeef205627dafd52d977157beafd409313edisonn@google.com}
83c319abeeef205627dafd52d977157beafd409313edisonn@google.com
84d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.comint gJpegQuality = 100;
85672588b684d484dce6ae251e9e163e4a46924322reed@google.com// the size_t* parameter is deprecated, so we ignore it
86672588b684d484dce6ae251e9e163e4a46924322reed@google.comstatic SkData* encode_to_dct_data(size_t*, const SkBitmap& bitmap) {
87608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org    if (gJpegQuality == -1) {
88608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org        return NULL;
89608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org    }
9083f0d302e8eaa054d0b20303131f953181dd4f47skia.committer@gmail.com
91608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org    SkBitmap bm = bitmap;
92d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com#if defined(SK_BUILD_FOR_MAC)
93608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org    // Workaround bug #1043 where bitmaps with referenced pixels cause
94608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org    // CGImageDestinationFinalize to crash
95608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org    SkBitmap copy;
96d5f032d46baa42f836d06d7372fba8f022a20dfacommit-bot@chromium.org    bitmap.deepCopyTo(&copy);
97608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org    bm = copy;
98d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com#endif
99d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com
100608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org    return SkImageEncoder::EncodeData(bm,
101608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org                                      SkImageEncoder::kJPEG_Type,
102608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org                                      gJpegQuality);
103d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com}
104d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com
105760f2d95dd22efce0066b663421aa604812c447fskia.committer@gmail.com/** Builds the output filename. path = dir/name, and it replaces expected
106c319abeeef205627dafd52d977157beafd409313edisonn@google.com * .skp extension with .pdf extention.
107c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param path Output filename.
108c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param name The name of the file.
109c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @returns false if the file did not has the expected extension.
110c319abeeef205627dafd52d977157beafd409313edisonn@google.com *  if false is returned, contents of path are undefined.
111c319abeeef205627dafd52d977157beafd409313edisonn@google.com */
112c319abeeef205627dafd52d977157beafd409313edisonn@google.comstatic bool make_output_filepath(SkString* path, const SkString& dir,
113c319abeeef205627dafd52d977157beafd409313edisonn@google.com                                 const SkString& name) {
114da4ed3289ec05a7155d5669c90a743a829574ea6tfarina    *path = SkOSPath::SkPathJoin(dir.c_str(), name.c_str());
115c319abeeef205627dafd52d977157beafd409313edisonn@google.com    return replace_filename_extension(path,
116c319abeeef205627dafd52d977157beafd409313edisonn@google.com                                      SKP_FILE_EXTENSION,
117c319abeeef205627dafd52d977157beafd409313edisonn@google.com                                      PDF_FILE_EXTENSION);
118c319abeeef205627dafd52d977157beafd409313edisonn@google.com}
119c319abeeef205627dafd52d977157beafd409313edisonn@google.com
120c319abeeef205627dafd52d977157beafd409313edisonn@google.com/** Write the output of pdf renderer to a file.
121c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param outputDir Output dir.
122c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param inputFilename The skp file that was read.
123c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param renderer The object responsible to write the pdf file.
124c319abeeef205627dafd52d977157beafd409313edisonn@google.com */
1255e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.orgstatic SkWStream* open_stream(const SkString& outputDir,
1265e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org                              const SkString& inputFilename) {
1274fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com    if (outputDir.isEmpty()) {
1285e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org        return SkNEW(SkDynamicMemoryWStream);
1294fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com    }
1304fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com
131c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkString outputPath;
132c319abeeef205627dafd52d977157beafd409313edisonn@google.com    if (!make_output_filepath(&outputPath, outputDir, inputFilename)) {
1335e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org        return NULL;
134c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
1354fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com
1365e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (outputPath.c_str()));
1375e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    if (!stream->isValid()) {
138c319abeeef205627dafd52d977157beafd409313edisonn@google.com        SkDebugf("Could not write to file %s\n", outputPath.c_str());
1395e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org        return NULL;
140c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
1414fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com
1425e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    return stream;
143c319abeeef205627dafd52d977157beafd409313edisonn@google.com}
144c319abeeef205627dafd52d977157beafd409313edisonn@google.com
145c319abeeef205627dafd52d977157beafd409313edisonn@google.com/** Reads an skp file, renders it to pdf and writes the output to a pdf file
146c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param inputPath The skp file to be read.
147c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param outputDir Output dir.
148c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param renderer The object responsible to render the skp object into pdf.
149c319abeeef205627dafd52d977157beafd409313edisonn@google.com */
150c319abeeef205627dafd52d977157beafd409313edisonn@google.comstatic bool render_pdf(const SkString& inputPath, const SkString& outputDir,
151c319abeeef205627dafd52d977157beafd409313edisonn@google.com                       sk_tools::PdfRenderer& renderer) {
1521c99ea8ed80ca492397717b57e2735869be38c69tfarina    SkString inputFilename = SkOSPath::SkBasename(inputPath.c_str());
153c319abeeef205627dafd52d977157beafd409313edisonn@google.com
154c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkFILEStream inputStream;
155c319abeeef205627dafd52d977157beafd409313edisonn@google.com    inputStream.setPath(inputPath.c_str());
156c319abeeef205627dafd52d977157beafd409313edisonn@google.com    if (!inputStream.isValid()) {
157c319abeeef205627dafd52d977157beafd409313edisonn@google.com        SkDebugf("Could not open file %s\n", inputPath.c_str());
158c319abeeef205627dafd52d977157beafd409313edisonn@google.com        return false;
159c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
160c319abeeef205627dafd52d977157beafd409313edisonn@google.com
161f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream));
162c319abeeef205627dafd52d977157beafd409313edisonn@google.com
163f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    if (NULL == picture.get()) {
164c319abeeef205627dafd52d977157beafd409313edisonn@google.com        SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str());
165c319abeeef205627dafd52d977157beafd409313edisonn@google.com        return false;
166c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
167c319abeeef205627dafd52d977157beafd409313edisonn@google.com
168c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkDebugf("exporting... [%i %i] %s\n", picture->width(), picture->height(),
169c319abeeef205627dafd52d977157beafd409313edisonn@google.com             inputPath.c_str());
170c319abeeef205627dafd52d977157beafd409313edisonn@google.com
1715e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    SkWStream* stream(open_stream(outputDir, inputFilename));
172c319abeeef205627dafd52d977157beafd409313edisonn@google.com
1735e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    if (!stream) {
1745e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org        return false;
1755e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    }
176c319abeeef205627dafd52d977157beafd409313edisonn@google.com
1775e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    renderer.init(picture, stream);
1785e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org
1795e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    bool success = renderer.render();
1805e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    SkDELETE(stream);
181c319abeeef205627dafd52d977157beafd409313edisonn@google.com
182c319abeeef205627dafd52d977157beafd409313edisonn@google.com    renderer.end();
1835e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org
184c319abeeef205627dafd52d977157beafd409313edisonn@google.com    return success;
185c319abeeef205627dafd52d977157beafd409313edisonn@google.com}
186c319abeeef205627dafd52d977157beafd409313edisonn@google.com
187c319abeeef205627dafd52d977157beafd409313edisonn@google.com/** For each file in the directory or for the file passed in input, call
188c319abeeef205627dafd52d977157beafd409313edisonn@google.com * render_pdf.
189c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param input A directory or an skp file.
190c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param outputDir Output dir.
191c319abeeef205627dafd52d977157beafd409313edisonn@google.com * @param renderer The object responsible to render the skp object into pdf.
192c319abeeef205627dafd52d977157beafd409313edisonn@google.com */
193c319abeeef205627dafd52d977157beafd409313edisonn@google.comstatic int process_input(const SkString& input, const SkString& outputDir,
194c319abeeef205627dafd52d977157beafd409313edisonn@google.com                         sk_tools::PdfRenderer& renderer) {
195c319abeeef205627dafd52d977157beafd409313edisonn@google.com    int failures = 0;
196c319abeeef205627dafd52d977157beafd409313edisonn@google.com    if (sk_isdir(input.c_str())) {
197c319abeeef205627dafd52d977157beafd409313edisonn@google.com        SkOSFile::Iter iter(input.c_str(), SKP_FILE_EXTENSION);
198c319abeeef205627dafd52d977157beafd409313edisonn@google.com        SkString inputFilename;
199c319abeeef205627dafd52d977157beafd409313edisonn@google.com        while (iter.next(&inputFilename)) {
200da4ed3289ec05a7155d5669c90a743a829574ea6tfarina            SkString inputPath = SkOSPath::SkPathJoin(input.c_str(), inputFilename.c_str());
201c319abeeef205627dafd52d977157beafd409313edisonn@google.com            if (!render_pdf(inputPath, outputDir, renderer)) {
202c319abeeef205627dafd52d977157beafd409313edisonn@google.com                ++failures;
203c319abeeef205627dafd52d977157beafd409313edisonn@google.com            }
204c319abeeef205627dafd52d977157beafd409313edisonn@google.com        }
205c319abeeef205627dafd52d977157beafd409313edisonn@google.com    } else {
206c319abeeef205627dafd52d977157beafd409313edisonn@google.com        SkString inputPath(input);
207c319abeeef205627dafd52d977157beafd409313edisonn@google.com        if (!render_pdf(inputPath, outputDir, renderer)) {
208c319abeeef205627dafd52d977157beafd409313edisonn@google.com            ++failures;
209c319abeeef205627dafd52d977157beafd409313edisonn@google.com        }
210c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
211c319abeeef205627dafd52d977157beafd409313edisonn@google.com    return failures;
212c319abeeef205627dafd52d977157beafd409313edisonn@google.com}
213c319abeeef205627dafd52d977157beafd409313edisonn@google.com
214c319abeeef205627dafd52d977157beafd409313edisonn@google.comstatic void parse_commandline(int argc, char* const argv[],
2154fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com                              SkTArray<SkString>* inputs,
2164fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com                              SkString* outputDir) {
217c319abeeef205627dafd52d977157beafd409313edisonn@google.com    const char* argv0 = argv[0];
218c319abeeef205627dafd52d977157beafd409313edisonn@google.com    char* const* stop = argv + argc;
219c319abeeef205627dafd52d977157beafd409313edisonn@google.com
220c319abeeef205627dafd52d977157beafd409313edisonn@google.com    for (++argv; argv < stop; ++argv) {
221c319abeeef205627dafd52d977157beafd409313edisonn@google.com        if ((0 == strcmp(*argv, "-h")) || (0 == strcmp(*argv, "--help"))) {
222c319abeeef205627dafd52d977157beafd409313edisonn@google.com            usage(argv0);
223c319abeeef205627dafd52d977157beafd409313edisonn@google.com            exit(-1);
2244fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com        } else if (0 == strcmp(*argv, "-w")) {
2254fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com            ++argv;
2264fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com            if (argv >= stop) {
2274fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com                SkDebugf("Missing outputDir for -w\n");
2284fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com                usage(argv0);
2294fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com                exit(-1);
2304fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com            }
2314fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com            *outputDir = SkString(*argv);
232d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com        } else if (0 == strcmp(*argv, "--jpegQuality")) {
233d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com            ++argv;
234d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com            if (argv >= stop) {
235d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com                SkDebugf("Missing argument for --jpegQuality\n");
236d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com                usage(argv0);
237d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com                exit(-1);
238d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com            }
239d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com            gJpegQuality = atoi(*argv);
240d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com            if (gJpegQuality < -1 || gJpegQuality > 100) {
241d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com                SkDebugf("Invalid argument for --jpegQuality\n");
242d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com                usage(argv0);
24383f0d302e8eaa054d0b20303131f953181dd4f47skia.committer@gmail.com                exit(-1);
244d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com            }
245c319abeeef205627dafd52d977157beafd409313edisonn@google.com        } else {
246c319abeeef205627dafd52d977157beafd409313edisonn@google.com            inputs->push_back(SkString(*argv));
247c319abeeef205627dafd52d977157beafd409313edisonn@google.com        }
248c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
249c319abeeef205627dafd52d977157beafd409313edisonn@google.com
2504fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com    if (inputs->count() < 1) {
251c319abeeef205627dafd52d977157beafd409313edisonn@google.com        usage(argv0);
252c319abeeef205627dafd52d977157beafd409313edisonn@google.com        exit(-1);
253c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
254c319abeeef205627dafd52d977157beafd409313edisonn@google.com}
255c319abeeef205627dafd52d977157beafd409313edisonn@google.com
256184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.comint tool_main_core(int argc, char** argv);
257184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.comint tool_main_core(int argc, char** argv) {
258c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkAutoGraphics ag;
259c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkTArray<SkString> inputs;
260c319abeeef205627dafd52d977157beafd409313edisonn@google.com
261c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkAutoTUnref<sk_tools::PdfRenderer>
262608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org        renderer(SkNEW_ARGS(sk_tools::SimplePdfRenderer, (encode_to_dct_data)));
263c319abeeef205627dafd52d977157beafd409313edisonn@google.com    SkASSERT(renderer.get());
264c319abeeef205627dafd52d977157beafd409313edisonn@google.com
2654fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com    SkString outputDir;
2664fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com    parse_commandline(argc, argv, &inputs, &outputDir);
267c319abeeef205627dafd52d977157beafd409313edisonn@google.com
268c319abeeef205627dafd52d977157beafd409313edisonn@google.com    int failures = 0;
2694fa566b34ac19d1b8bbddd75d284c9db6eefab5bedisonn@google.com    for (int i = 0; i < inputs.count(); i ++) {
270c319abeeef205627dafd52d977157beafd409313edisonn@google.com        failures += process_input(inputs[i], outputDir, *renderer);
271c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
272c319abeeef205627dafd52d977157beafd409313edisonn@google.com
273c319abeeef205627dafd52d977157beafd409313edisonn@google.com    if (failures != 0) {
274c319abeeef205627dafd52d977157beafd409313edisonn@google.com        SkDebugf("Failed to render %i PDFs.\n", failures);
275c319abeeef205627dafd52d977157beafd409313edisonn@google.com        return 1;
276c319abeeef205627dafd52d977157beafd409313edisonn@google.com    }
277184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com
278184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com    return 0;
279184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com}
280184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com
281184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.comint tool_main(int argc, char** argv);
282184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.comint tool_main(int argc, char** argv) {
283184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com#ifdef SK_USE_CDB
284184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com    setUpDebuggingFromArgs(argv[0]);
285184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com    __try {
286184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com#endif
287184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com      return tool_main_core(argc, argv);
288184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com#ifdef SK_USE_CDB
289184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com    }
290184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com    __except(GenerateDumpAndPrintCallstack(GetExceptionInformation()))
291184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com    {
292184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com        return -1;
293184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com    }
294184487c8083e4e3958f9efe6fb6a9b1d4865fdf5edisonn@google.com#endif
295f286329ad13b43a8e398df3e0c376403882f1690humper@google.com    return 0;
296c319abeeef205627dafd52d977157beafd409313edisonn@google.com}
297c319abeeef205627dafd52d977157beafd409313edisonn@google.com
2989cf5b28648fa9d14bc407dda52477f3292d31d0dedisonn@google.com#if !defined SK_BUILD_FOR_IOS
2999cf5b28648fa9d14bc407dda52477f3292d31d0dedisonn@google.comint main(int argc, char * const argv[]) {
3009cf5b28648fa9d14bc407dda52477f3292d31d0dedisonn@google.com    return tool_main(argc, (char**) argv);
3019cf5b28648fa9d14bc407dda52477f3292d31d0dedisonn@google.com}
3029cf5b28648fa9d14bc407dda52477f3292d31d0dedisonn@google.com#endif
303