blob: 7d6275dfa5fb0ef4016e1bc89f9d88beee951524 [file] [log] [blame]
junov@chromium.org777442d2012-06-12 14:56:36 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
junov@chromium.org777442d2012-06-12 14:56:36 +00008#include "SkBitmap.h"
9#include "SkCanvas.h"
keyar@chromium.org472b3792012-07-20 22:34:27 +000010#include "SkDevice.h"
borenet@google.com10ef79e2012-09-10 17:19:06 +000011#include "SkGraphics.h"
scroggo@google.com5a7c6be2012-10-04 21:46:08 +000012#include "SkImageDecoder.h"
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000013#include "SkMath.h"
junov@chromium.org777442d2012-06-12 14:56:36 +000014#include "SkOSFile.h"
15#include "SkPicture.h"
16#include "SkStream.h"
17#include "SkString.h"
senorblanco@chromium.org3cbbb542012-07-13 18:55:53 +000018#include "SkTArray.h"
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000019#include "PictureRenderer.h"
twiz@google.coma31b8bb2012-06-22 18:24:56 +000020#include "picture_utils.h"
junov@chromium.org777442d2012-06-12 14:56:36 +000021
junov@chromium.org777442d2012-06-12 14:56:36 +000022static void usage(const char* argv0) {
23 SkDebugf("SkPicture rendering tool\n");
24 SkDebugf("\n"
25"Usage: \n"
borenet@google.com070d3542012-10-26 13:26:55 +000026" %s <input>... \n"
27" [-w <outputDir>]"
scroggo@google.comb6e806b2012-10-03 17:32:33 +000028" [--mode pow2tile minWidth height[%] | simple\n"
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000029" | tile width[%] height[%]]\n"
scroggo@google.comb6e806b2012-10-03 17:32:33 +000030" [--pipe]\n"
31" [--multi count]\n"
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000032" [--device bitmap"
33#if SK_SUPPORT_GPU
34" | gpu"
35#endif
36"]"
junov@chromium.org777442d2012-06-12 14:56:36 +000037, argv0);
keyar@chromium.org472b3792012-07-20 22:34:27 +000038 SkDebugf("\n\n");
junov@chromium.org777442d2012-06-12 14:56:36 +000039 SkDebugf(
keyar@chromium.org795cd472012-08-02 18:57:53 +000040" input: A list of directories and files to use as input. Files are\n"
41" expected to have the .skp extension.\n\n");
junov@chromium.org777442d2012-06-12 14:56:36 +000042 SkDebugf(
keyar@chromium.org795cd472012-08-02 18:57:53 +000043" outputDir: directory to write the rendered images.\n\n");
keyar@chromium.org472b3792012-07-20 22:34:27 +000044 SkDebugf(
scroggo@google.coma9e3a362012-11-07 17:52:48 +000045" --mode pow2tile minWidth height[%] | simple | rerecord\n"
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000046" | tile width[%] height[%]: Run in the corresponding mode.\n"
47" Default is simple.\n");
keyar@chromium.org472b3792012-07-20 22:34:27 +000048 SkDebugf(
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000049" pow2tile minWidth height[%], Creates tiles with widths\n"
50" that are all a power of two\n"
51" such that they minimize the\n"
52" amount of wasted tile space.\n"
53" minWidth is the minimum width\n"
54" of these tiles and must be a\n"
55" power of two. A simple render\n"
56" is done with these tiles.\n");
57 SkDebugf(
scroggo@google.coma9e3a362012-11-07 17:52:48 +000058" simple, Render using the default rendering method.\n"
59" rerecord, Record the picture as a new skp, with the bitmaps PNG encoded.\n"
60 );
keyar@chromium.org795cd472012-08-02 18:57:53 +000061 SkDebugf(
62" tile width[%] height[%], Do a simple render using tiles\n"
63" with the given dimensions.\n");
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000064 SkDebugf("\n");
65 SkDebugf(
scroggo@google.comb6e806b2012-10-03 17:32:33 +000066" --multi count : Set the number of threads for multi threaded drawing. Must be greater\n"
67" than 1. Only works with tiled rendering.\n"
scroggo@google.coma62da2f2012-11-02 21:28:12 +000068" --pipe: Benchmark SkGPipe rendering. Currently incompatible with \"mode\".\n");
scroggo@google.comb6e806b2012-10-03 17:32:33 +000069 SkDebugf(
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000070" --device bitmap"
71#if SK_SUPPORT_GPU
72" | gpu"
73#endif
74": Use the corresponding device. Default is bitmap.\n");
75 SkDebugf(
76" bitmap, Render to a bitmap.\n");
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000077#if SK_SUPPORT_GPU
keyar@chromium.orga40c20d2012-08-20 15:04:12 +000078 SkDebugf(
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000079" gpu, Render to the GPU.\n");
80#endif
junov@chromium.org777442d2012-06-12 14:56:36 +000081}
82
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +000083static void make_output_filepath(SkString* path, const SkString& dir,
junov@chromium.org777442d2012-06-12 14:56:36 +000084 const SkString& name) {
twiz@google.coma31b8bb2012-06-22 18:24:56 +000085 sk_tools::make_filepath(path, dir, name);
scroggo@google.com81f9d2e2012-09-20 14:54:21 +000086 // Remove ".skp"
87 path->remove(path->size() - 4, 4);
junov@chromium.org777442d2012-06-12 14:56:36 +000088}
89
borenet@google.com070d3542012-10-26 13:26:55 +000090static bool render_picture(const SkString& inputPath, const SkString* outputDir,
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000091 sk_tools::PictureRenderer& renderer) {
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +000092 SkString inputFilename;
93 sk_tools::get_basename(&inputFilename, inputPath);
twiz@google.coma31b8bb2012-06-22 18:24:56 +000094
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +000095 SkFILEStream inputStream;
twiz@google.coma31b8bb2012-06-22 18:24:56 +000096 inputStream.setPath(inputPath.c_str());
97 if (!inputStream.isValid()) {
98 SkDebugf("Could not open file %s\n", inputPath.c_str());
borenet@google.com66bcbd12012-09-17 18:26:06 +000099 return false;
twiz@google.coma31b8bb2012-06-22 18:24:56 +0000100 }
101
borenet@google.com66bcbd12012-09-17 18:26:06 +0000102 bool success = false;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +0000103 SkPicture picture(&inputStream, &success, &SkImageDecoder::DecodeStream);
borenet@google.com66bcbd12012-09-17 18:26:06 +0000104 if (!success) {
105 SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str());
106 return false;
107 }
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000108
borenet@google.com2d2b9a02012-09-20 18:54:04 +0000109 SkDebugf("drawing... [%i %i] %s\n", picture.width(), picture.height(),
borenet@google.com03fcee82012-09-10 18:18:38 +0000110 inputPath.c_str());
skia.committer@gmail.com1d225f22012-09-14 02:01:10 +0000111
borenet@google.com2d2b9a02012-09-20 18:54:04 +0000112 renderer.init(&picture);
scroggo@google.comb4773b42012-10-01 20:06:09 +0000113 renderer.setup();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000114
borenet@google.com070d3542012-10-26 13:26:55 +0000115 SkString* outputPath = NULL;
116 if (NULL != outputDir) {
117 outputPath = SkNEW(SkString);
118 make_output_filepath(outputPath, *outputDir, inputFilename);
119 }
120 success = renderer.render(outputPath);
121 if (outputPath) {
122 if (!success) {
123 SkDebugf("Could not write to file %s\n", outputPath->c_str());
124 }
125 SkDELETE(outputPath);
scroggo@google.com81f9d2e2012-09-20 14:54:21 +0000126 }
scroggo@google.com9a412522012-09-07 15:21:18 +0000127
128 renderer.resetState();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000129
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000130 renderer.end();
borenet@google.com66bcbd12012-09-17 18:26:06 +0000131 return success;
junov@chromium.org777442d2012-06-12 14:56:36 +0000132}
133
borenet@google.com070d3542012-10-26 13:26:55 +0000134static int process_input(const SkString& input, const SkString* outputDir,
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000135 sk_tools::PictureRenderer& renderer) {
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000136 SkOSFile::Iter iter(input.c_str(), "skp");
junov@chromium.org777442d2012-06-12 14:56:36 +0000137 SkString inputFilename;
borenet@google.com66bcbd12012-09-17 18:26:06 +0000138 int failures = 0;
borenet@google.com070d3542012-10-26 13:26:55 +0000139 SkDebugf("process_input, %s\n", input.c_str());
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000140 if (iter.next(&inputFilename)) {
141 do {
142 SkString inputPath;
143 sk_tools::make_filepath(&inputPath, input, inputFilename);
borenet@google.com57837bf2012-09-19 17:28:29 +0000144 if (!render_picture(inputPath, outputDir, renderer)) {
145 ++failures;
146 }
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000147 } while(iter.next(&inputFilename));
borenet@google.com57837bf2012-09-19 17:28:29 +0000148 } else if (SkStrEndsWith(input.c_str(), ".skp")) {
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000149 SkString inputPath(input);
borenet@google.com57837bf2012-09-19 17:28:29 +0000150 if (!render_picture(inputPath, outputDir, renderer)) {
151 ++failures;
152 }
153 } else {
154 SkString warning;
155 warning.printf("Warning: skipping %s\n", input.c_str());
156 SkDebugf(warning.c_str());
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000157 }
borenet@google.com66bcbd12012-09-17 18:26:06 +0000158 return failures;
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000159}
160
161static void parse_commandline(int argc, char* const argv[], SkTArray<SkString>* inputs,
borenet@google.com070d3542012-10-26 13:26:55 +0000162 sk_tools::PictureRenderer*& renderer, SkString*& outputDir){
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000163 const char* argv0 = argv[0];
164 char* const* stop = argv + argc;
165
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000166 sk_tools::PictureRenderer::SkDeviceTypes deviceType =
167 sk_tools::PictureRenderer::kBitmap_DeviceType;
168
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000169 bool usePipe = false;
170 int numThreads = 1;
171 bool useTiles = false;
172 const char* widthString = NULL;
173 const char* heightString = NULL;
174 bool isPowerOf2Mode = false;
175 const char* mode = NULL;
176
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000177 for (++argv; argv < stop; ++argv) {
keyar@chromium.org795cd472012-08-02 18:57:53 +0000178 if (0 == strcmp(*argv, "--mode")) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000179 if (renderer != NULL) {
180 renderer->unref();
181 SkDebugf("Cannot combine modes.\n");
182 usage(argv0);
183 exit(-1);
184 }
keyar@chromium.org795cd472012-08-02 18:57:53 +0000185
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000186 ++argv;
keyar@chromium.org795cd472012-08-02 18:57:53 +0000187 if (argv >= stop) {
188 SkDebugf("Missing mode for --mode\n");
189 usage(argv0);
190 exit(-1);
191 }
192
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000193 if (0 == strcmp(*argv, "simple")) {
keyar@chromium.org795cd472012-08-02 18:57:53 +0000194 renderer = SkNEW(sk_tools::SimplePictureRenderer);
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000195 } else if ((0 == strcmp(*argv, "tile")) || (0 == strcmp(*argv, "pow2tile"))) {
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000196 useTiles = true;
197 mode = *argv;
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000198
199 if (0 == strcmp(*argv, "pow2tile")) {
200 isPowerOf2Mode = true;
201 }
202
keyar@chromium.org795cd472012-08-02 18:57:53 +0000203 ++argv;
204 if (argv >= stop) {
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000205 SkDebugf("Missing width for --mode %s\n", mode);
keyar@chromium.org795cd472012-08-02 18:57:53 +0000206 usage(argv0);
207 exit(-1);
208 }
209
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000210 widthString = *argv;
keyar@chromium.org795cd472012-08-02 18:57:53 +0000211 ++argv;
212 if (argv >= stop) {
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000213 SkDebugf("Missing height for --mode tile\n");
keyar@chromium.org795cd472012-08-02 18:57:53 +0000214 usage(argv0);
215 exit(-1);
216 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000217 heightString = *argv;
scroggo@google.coma9e3a362012-11-07 17:52:48 +0000218 } else if (0 == strcmp(*argv, "rerecord")) {
219 renderer = SkNEW(sk_tools::RecordPictureRenderer);
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000220 } else {
keyar@chromium.org795cd472012-08-02 18:57:53 +0000221 SkDebugf("%s is not a valid mode for --mode\n", *argv);
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000222 usage(argv0);
223 exit(-1);
224 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000225 } else if (0 == strcmp(*argv, "--pipe")) {
226 usePipe = true;
227 } else if (0 == strcmp(*argv, "--multi")) {
228 ++argv;
229 if (argv >= stop) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000230 SkSafeUnref(renderer);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000231 SkDebugf("Missing arg for --multi\n");
232 usage(argv0);
233 exit(-1);
234 }
235 numThreads = atoi(*argv);
236 if (numThreads < 2) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000237 SkSafeUnref(renderer);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000238 SkDebugf("Number of threads must be at least 2.\n");
239 usage(argv0);
240 exit(-1);
241 }
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000242 } else if (0 == strcmp(*argv, "--device")) {
243 ++argv;
244 if (argv >= stop) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000245 SkSafeUnref(renderer);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000246 SkDebugf("Missing mode for --device\n");
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000247 usage(argv0);
248 exit(-1);
249 }
250
251 if (0 == strcmp(*argv, "bitmap")) {
252 deviceType = sk_tools::PictureRenderer::kBitmap_DeviceType;
253 }
254#if SK_SUPPORT_GPU
255 else if (0 == strcmp(*argv, "gpu")) {
256 deviceType = sk_tools::PictureRenderer::kGPU_DeviceType;
257 }
258#endif
259 else {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000260 SkSafeUnref(renderer);
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000261 SkDebugf("%s is not a valid mode for --device\n", *argv);
262 usage(argv0);
263 exit(-1);
264 }
265
keyar@chromium.org472b3792012-07-20 22:34:27 +0000266 } else if ((0 == strcmp(*argv, "-h")) || (0 == strcmp(*argv, "--help"))) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000267 SkSafeUnref(renderer);
keyar@chromium.org472b3792012-07-20 22:34:27 +0000268 usage(argv0);
269 exit(-1);
borenet@google.com070d3542012-10-26 13:26:55 +0000270 } else if (0 == strcmp(*argv, "-w")) {
271 ++argv;
272 if (argv >= stop) {
273 SkDebugf("Missing output directory for -w\n");
274 usage(argv0);
275 exit(-1);
276 }
277 outputDir = SkNEW_ARGS(SkString, (*argv));
keyar@chromium.orga2333d92012-07-16 17:29:16 +0000278 } else {
279 inputs->push_back(SkString(*argv));
280 }
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000281 }
keyar@chromium.org472b3792012-07-20 22:34:27 +0000282
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000283 if (numThreads > 1 && !useTiles) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000284 SkSafeUnref(renderer);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000285 SkDebugf("Multithreaded drawing requires tiled rendering.\n");
286 usage(argv0);
287 exit(-1);
288 }
289
290 if (useTiles) {
291 SkASSERT(NULL == renderer);
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000292 sk_tools::TiledPictureRenderer* tiledRenderer;
293 if (numThreads > 1) {
294 tiledRenderer = SkNEW_ARGS(sk_tools::MultiCorePictureRenderer, (numThreads));
295 } else {
296 tiledRenderer = SkNEW(sk_tools::TiledPictureRenderer);
297 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000298 if (isPowerOf2Mode) {
299 int minWidth = atoi(widthString);
300 if (!SkIsPow2(minWidth) || minWidth < 0) {
301 tiledRenderer->unref();
302 SkString err;
303 err.printf("-mode %s must be given a width"
304 " value that is a power of two\n", mode);
305 SkDebugf(err.c_str());
306 usage(argv0);
307 exit(-1);
308 }
309 tiledRenderer->setTileMinPowerOf2Width(minWidth);
310 } else if (sk_tools::is_percentage(widthString)) {
311 tiledRenderer->setTileWidthPercentage(atof(widthString));
312 if (!(tiledRenderer->getTileWidthPercentage() > 0)) {
313 tiledRenderer->unref();
314 SkDebugf("--mode tile must be given a width percentage > 0\n");
315 usage(argv0);
316 exit(-1);
317 }
318 } else {
319 tiledRenderer->setTileWidth(atoi(widthString));
320 if (!(tiledRenderer->getTileWidth() > 0)) {
321 tiledRenderer->unref();
322 SkDebugf("--mode tile must be given a width > 0\n");
323 usage(argv0);
324 exit(-1);
325 }
326 }
327
328 if (sk_tools::is_percentage(heightString)) {
329 tiledRenderer->setTileHeightPercentage(atof(heightString));
330 if (!(tiledRenderer->getTileHeightPercentage() > 0)) {
331 tiledRenderer->unref();
332 SkDebugf("--mode tile must be given a height percentage > 0\n");
333 usage(argv0);
334 exit(-1);
335 }
336 } else {
337 tiledRenderer->setTileHeight(atoi(heightString));
338 if (!(tiledRenderer->getTileHeight() > 0)) {
339 tiledRenderer->unref();
340 SkDebugf("--mode tile must be given a height > 0\n");
341 usage(argv0);
342 exit(-1);
343 }
344 }
345 if (numThreads > 1) {
346#if SK_SUPPORT_GPU
347 if (sk_tools::PictureRenderer::kGPU_DeviceType == deviceType) {
348 tiledRenderer->unref();
349 SkDebugf("GPU not compatible with multithreaded tiling.\n");
350 usage(argv0);
351 exit(-1);
352 }
353#endif
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000354 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000355 renderer = tiledRenderer;
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000356 if (usePipe) {
357 SkDebugf("Pipe rendering is currently not compatible with tiling.\n"
358 "Turning off pipe.\n");
359 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000360 } else if (usePipe) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000361 if (renderer != NULL) {
362 renderer->unref();
363 SkDebugf("Pipe is incompatible with other modes.\n");
364 usage(argv0);
365 exit(-1);
366 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000367 renderer = SkNEW(sk_tools::PipePictureRenderer);
368 }
369
borenet@google.com070d3542012-10-26 13:26:55 +0000370 if (inputs->empty()) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000371 SkSafeUnref(renderer);
borenet@google.com070d3542012-10-26 13:26:55 +0000372 if (NULL != outputDir) {
373 SkDELETE(outputDir);
374 }
keyar@chromium.org472b3792012-07-20 22:34:27 +0000375 usage(argv0);
376 exit(-1);
377 }
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000378
379 if (NULL == renderer) {
380 renderer = SkNEW(sk_tools::SimplePictureRenderer);
381 }
keyar@chromium.org4ea96c52012-08-20 15:03:29 +0000382
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000383 renderer->setDeviceType(deviceType);
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000384}
385
caryclark@google.com5987f582012-10-02 18:33:14 +0000386int tool_main(int argc, char** argv);
387int tool_main(int argc, char** argv) {
borenet@google.com66bcbd12012-09-17 18:26:06 +0000388 SkAutoGraphics ag;
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000389 SkTArray<SkString> inputs;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000390 sk_tools::PictureRenderer* renderer = NULL;
borenet@google.com070d3542012-10-26 13:26:55 +0000391 SkString* outputDir = NULL;
392 parse_commandline(argc, argv, &inputs, renderer, outputDir);
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000393 SkASSERT(renderer);
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000394
borenet@google.com66bcbd12012-09-17 18:26:06 +0000395 int failures = 0;
borenet@google.com070d3542012-10-26 13:26:55 +0000396 for (int i = 0; i < inputs.count(); i ++) {
borenet@google.com66bcbd12012-09-17 18:26:06 +0000397 failures += process_input(inputs[i], outputDir, *renderer);
junov@chromium.org777442d2012-06-12 14:56:36 +0000398 }
borenet@google.com66bcbd12012-09-17 18:26:06 +0000399 if (failures != 0) {
400 SkDebugf("Failed to render %i pictures.\n", failures);
401 return 1;
402 }
robertphillips@google.com163c84b2012-09-13 15:40:37 +0000403#if SK_SUPPORT_GPU
404#if GR_CACHE_STATS
405 if (renderer->isUsingGpuDevice()) {
406 GrContext* ctx = renderer->getGrContext();
407
408 ctx->printCacheStats();
409 }
410#endif
411#endif
borenet@google.com070d3542012-10-26 13:26:55 +0000412 if (NULL != outputDir) {
413 SkDELETE(outputDir);
414 }
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000415 SkDELETE(renderer);
caryclark@google.com868e1f62012-10-02 20:00:03 +0000416 return 0;
junov@chromium.org777442d2012-06-12 14:56:36 +0000417}
caryclark@google.com5987f582012-10-02 18:33:14 +0000418
419#if !defined SK_BUILD_FOR_IOS
420int main(int argc, char * const argv[]) {
421 return tool_main(argc, (char**) argv);
422}
423#endif