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(©); 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