blob: d43e1c439b1ffa2a1198f93ecf7fd9ba99e3217b [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
scroggo@google.com4a26d9d2012-11-07 18:01:46 +00008#include "CopyTilesRenderer.h"
junov@chromium.org777442d2012-06-12 14:56:36 +00009#include "SkBitmap.h"
10#include "SkCanvas.h"
keyar@chromium.org472b3792012-07-20 22:34:27 +000011#include "SkDevice.h"
borenet@google.com10ef79e2012-09-10 17:19:06 +000012#include "SkGraphics.h"
scroggo@google.com5a7c6be2012-10-04 21:46:08 +000013#include "SkImageDecoder.h"
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000014#include "SkMath.h"
junov@chromium.org777442d2012-06-12 14:56:36 +000015#include "SkOSFile.h"
16#include "SkPicture.h"
17#include "SkStream.h"
18#include "SkString.h"
senorblanco@chromium.org3cbbb542012-07-13 18:55:53 +000019#include "SkTArray.h"
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000020#include "PictureRenderer.h"
twiz@google.coma31b8bb2012-06-22 18:24:56 +000021#include "picture_utils.h"
junov@chromium.org777442d2012-06-12 14:56:36 +000022
junov@chromium.org777442d2012-06-12 14:56:36 +000023static void usage(const char* argv0) {
24 SkDebugf("SkPicture rendering tool\n");
25 SkDebugf("\n"
26"Usage: \n"
borenet@google.com070d3542012-10-26 13:26:55 +000027" %s <input>... \n"
scroggo@google.com4a26d9d2012-11-07 18:01:46 +000028" [-w <outputDir>]\n"
29" [--mode pow2tile minWidth height | copyTile width height | simple\n"
30" | tile width height]\n"
scroggo@google.comb6e806b2012-10-03 17:32:33 +000031" [--pipe]\n"
32" [--multi count]\n"
scroggo@google.comc0d5e542012-12-13 21:40:48 +000033" [--viewport width height]\n"
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000034" [--device bitmap"
35#if SK_SUPPORT_GPU
36" | gpu"
37#endif
38"]"
junov@chromium.org777442d2012-06-12 14:56:36 +000039, argv0);
keyar@chromium.org472b3792012-07-20 22:34:27 +000040 SkDebugf("\n\n");
junov@chromium.org777442d2012-06-12 14:56:36 +000041 SkDebugf(
keyar@chromium.org795cd472012-08-02 18:57:53 +000042" input: A list of directories and files to use as input. Files are\n"
43" expected to have the .skp extension.\n\n");
junov@chromium.org777442d2012-06-12 14:56:36 +000044 SkDebugf(
keyar@chromium.org795cd472012-08-02 18:57:53 +000045" outputDir: directory to write the rendered images.\n\n");
keyar@chromium.org472b3792012-07-20 22:34:27 +000046 SkDebugf(
scroggo@google.com4a26d9d2012-11-07 18:01:46 +000047" --mode pow2tile minWidth height | copyTile width height | simple\n"
48" | tile width height | rerecord: Run in the corresponding mode.\n"
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000049" Default is simple.\n");
keyar@chromium.org472b3792012-07-20 22:34:27 +000050 SkDebugf(
scroggo@google.com4a26d9d2012-11-07 18:01:46 +000051" pow2tile minWidth height, Creates tiles with widths\n"
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000052" that are all a power of two\n"
53" such that they minimize the\n"
54" amount of wasted tile space.\n"
55" minWidth is the minimum width\n"
56" of these tiles and must be a\n"
57" power of two. A simple render\n"
58" is done with these tiles.\n");
59 SkDebugf(
scroggo@google.coma9e3a362012-11-07 17:52:48 +000060" simple, Render using the default rendering method.\n"
61" rerecord, Record the picture as a new skp, with the bitmaps PNG encoded.\n"
62 );
keyar@chromium.org795cd472012-08-02 18:57:53 +000063 SkDebugf(
scroggo@google.com4a26d9d2012-11-07 18:01:46 +000064" tile width height, Do a simple render using tiles\n"
65" with the given dimensions.\n"
66" copyTile width height, Draw the picture, then copy it into tiles.\n"
67" Does not support percentages.\n"
68" If the picture is large enough, breaks it into\n"
69" larger tiles (and draws the picture once per\n"
70" larger tile) to avoid creating a large canvas.\n"
71" Add --tiles x y to specify the number of tiles\n"
72" per larger tile in the x and y direction.\n"
73 );
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000074 SkDebugf("\n");
75 SkDebugf(
scroggo@google.comb6e806b2012-10-03 17:32:33 +000076" --multi count : Set the number of threads for multi threaded drawing. Must be greater\n"
77" than 1. Only works with tiled rendering.\n"
scroggo@google.comc0d5e542012-12-13 21:40:48 +000078" --viewport width height : Set the viewport.\n"
scroggo@google.coma62da2f2012-11-02 21:28:12 +000079" --pipe: Benchmark SkGPipe rendering. Currently incompatible with \"mode\".\n");
scroggo@google.comb6e806b2012-10-03 17:32:33 +000080 SkDebugf(
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000081" --device bitmap"
82#if SK_SUPPORT_GPU
83" | gpu"
84#endif
85": Use the corresponding device. Default is bitmap.\n");
86 SkDebugf(
87" bitmap, Render to a bitmap.\n");
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000088#if SK_SUPPORT_GPU
keyar@chromium.orga40c20d2012-08-20 15:04:12 +000089 SkDebugf(
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000090" gpu, Render to the GPU.\n");
91#endif
junov@chromium.org777442d2012-06-12 14:56:36 +000092}
93
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +000094static void make_output_filepath(SkString* path, const SkString& dir,
junov@chromium.org777442d2012-06-12 14:56:36 +000095 const SkString& name) {
twiz@google.coma31b8bb2012-06-22 18:24:56 +000096 sk_tools::make_filepath(path, dir, name);
scroggo@google.com81f9d2e2012-09-20 14:54:21 +000097 // Remove ".skp"
98 path->remove(path->size() - 4, 4);
junov@chromium.org777442d2012-06-12 14:56:36 +000099}
100
borenet@google.com070d3542012-10-26 13:26:55 +0000101static bool render_picture(const SkString& inputPath, const SkString* outputDir,
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000102 sk_tools::PictureRenderer& renderer) {
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000103 SkString inputFilename;
104 sk_tools::get_basename(&inputFilename, inputPath);
twiz@google.coma31b8bb2012-06-22 18:24:56 +0000105
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000106 SkFILEStream inputStream;
twiz@google.coma31b8bb2012-06-22 18:24:56 +0000107 inputStream.setPath(inputPath.c_str());
108 if (!inputStream.isValid()) {
109 SkDebugf("Could not open file %s\n", inputPath.c_str());
borenet@google.com66bcbd12012-09-17 18:26:06 +0000110 return false;
twiz@google.coma31b8bb2012-06-22 18:24:56 +0000111 }
112
borenet@google.com66bcbd12012-09-17 18:26:06 +0000113 bool success = false;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +0000114 SkPicture picture(&inputStream, &success, &SkImageDecoder::DecodeStream);
borenet@google.com66bcbd12012-09-17 18:26:06 +0000115 if (!success) {
116 SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str());
117 return false;
118 }
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000119
borenet@google.com2d2b9a02012-09-20 18:54:04 +0000120 SkDebugf("drawing... [%i %i] %s\n", picture.width(), picture.height(),
borenet@google.com03fcee82012-09-10 18:18:38 +0000121 inputPath.c_str());
skia.committer@gmail.com1d225f22012-09-14 02:01:10 +0000122
borenet@google.com2d2b9a02012-09-20 18:54:04 +0000123 renderer.init(&picture);
scroggo@google.comb4773b42012-10-01 20:06:09 +0000124 renderer.setup();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000125
borenet@google.com070d3542012-10-26 13:26:55 +0000126 SkString* outputPath = NULL;
127 if (NULL != outputDir) {
128 outputPath = SkNEW(SkString);
129 make_output_filepath(outputPath, *outputDir, inputFilename);
130 }
131 success = renderer.render(outputPath);
132 if (outputPath) {
133 if (!success) {
134 SkDebugf("Could not write to file %s\n", outputPath->c_str());
135 }
136 SkDELETE(outputPath);
scroggo@google.com81f9d2e2012-09-20 14:54:21 +0000137 }
scroggo@google.com9a412522012-09-07 15:21:18 +0000138
139 renderer.resetState();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000140
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000141 renderer.end();
borenet@google.com66bcbd12012-09-17 18:26:06 +0000142 return success;
junov@chromium.org777442d2012-06-12 14:56:36 +0000143}
144
borenet@google.com070d3542012-10-26 13:26:55 +0000145static int process_input(const SkString& input, const SkString* outputDir,
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000146 sk_tools::PictureRenderer& renderer) {
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000147 SkOSFile::Iter iter(input.c_str(), "skp");
junov@chromium.org777442d2012-06-12 14:56:36 +0000148 SkString inputFilename;
borenet@google.com66bcbd12012-09-17 18:26:06 +0000149 int failures = 0;
borenet@google.com070d3542012-10-26 13:26:55 +0000150 SkDebugf("process_input, %s\n", input.c_str());
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000151 if (iter.next(&inputFilename)) {
152 do {
153 SkString inputPath;
154 sk_tools::make_filepath(&inputPath, input, inputFilename);
borenet@google.com57837bf2012-09-19 17:28:29 +0000155 if (!render_picture(inputPath, outputDir, renderer)) {
156 ++failures;
157 }
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000158 } while(iter.next(&inputFilename));
borenet@google.com57837bf2012-09-19 17:28:29 +0000159 } else if (SkStrEndsWith(input.c_str(), ".skp")) {
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000160 SkString inputPath(input);
borenet@google.com57837bf2012-09-19 17:28:29 +0000161 if (!render_picture(inputPath, outputDir, renderer)) {
162 ++failures;
163 }
164 } else {
165 SkString warning;
166 warning.printf("Warning: skipping %s\n", input.c_str());
167 SkDebugf(warning.c_str());
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000168 }
borenet@google.com66bcbd12012-09-17 18:26:06 +0000169 return failures;
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000170}
171
172static void parse_commandline(int argc, char* const argv[], SkTArray<SkString>* inputs,
borenet@google.com070d3542012-10-26 13:26:55 +0000173 sk_tools::PictureRenderer*& renderer, SkString*& outputDir){
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000174 const char* argv0 = argv[0];
175 char* const* stop = argv + argc;
176
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000177 sk_tools::PictureRenderer::SkDeviceTypes deviceType =
178 sk_tools::PictureRenderer::kBitmap_DeviceType;
179
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000180 bool usePipe = false;
181 int numThreads = 1;
182 bool useTiles = false;
183 const char* widthString = NULL;
184 const char* heightString = NULL;
185 bool isPowerOf2Mode = false;
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000186 bool isCopyMode = false;
187 const char* xTilesString = NULL;
188 const char* yTilesString = NULL;
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000189 const char* mode = NULL;
scroggo@google.comc0d5e542012-12-13 21:40:48 +0000190 SkISize viewport;
191 viewport.setEmpty();
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000192 for (++argv; argv < stop; ++argv) {
keyar@chromium.org795cd472012-08-02 18:57:53 +0000193 if (0 == strcmp(*argv, "--mode")) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000194 if (renderer != NULL) {
195 renderer->unref();
196 SkDebugf("Cannot combine modes.\n");
197 usage(argv0);
198 exit(-1);
199 }
keyar@chromium.org795cd472012-08-02 18:57:53 +0000200
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000201 ++argv;
keyar@chromium.org795cd472012-08-02 18:57:53 +0000202 if (argv >= stop) {
203 SkDebugf("Missing mode for --mode\n");
204 usage(argv0);
205 exit(-1);
206 }
207
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000208 if (0 == strcmp(*argv, "simple")) {
keyar@chromium.org795cd472012-08-02 18:57:53 +0000209 renderer = SkNEW(sk_tools::SimplePictureRenderer);
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000210 } else if ((0 == strcmp(*argv, "tile")) || (0 == strcmp(*argv, "pow2tile"))
211 || 0 == strcmp(*argv, "copyTile")) {
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000212 useTiles = true;
213 mode = *argv;
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000214
215 if (0 == strcmp(*argv, "pow2tile")) {
216 isPowerOf2Mode = true;
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000217 } else if (0 == strcmp(*argv, "copyTile")) {
218 isCopyMode = true;
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000219 }
220
keyar@chromium.org795cd472012-08-02 18:57:53 +0000221 ++argv;
222 if (argv >= stop) {
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000223 SkDebugf("Missing width for --mode %s\n", mode);
keyar@chromium.org795cd472012-08-02 18:57:53 +0000224 usage(argv0);
225 exit(-1);
226 }
227
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000228 widthString = *argv;
keyar@chromium.org795cd472012-08-02 18:57:53 +0000229 ++argv;
230 if (argv >= stop) {
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000231 SkDebugf("Missing height for --mode %s\n", mode);
keyar@chromium.org795cd472012-08-02 18:57:53 +0000232 usage(argv0);
233 exit(-1);
234 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000235 heightString = *argv;
scroggo@google.coma9e3a362012-11-07 17:52:48 +0000236 } else if (0 == strcmp(*argv, "rerecord")) {
237 renderer = SkNEW(sk_tools::RecordPictureRenderer);
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000238 } else {
keyar@chromium.org795cd472012-08-02 18:57:53 +0000239 SkDebugf("%s is not a valid mode for --mode\n", *argv);
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000240 usage(argv0);
241 exit(-1);
242 }
scroggo@google.comc0d5e542012-12-13 21:40:48 +0000243 } else if (0 == strcmp(*argv, "--viewport")) {
244 ++argv;
245 if (argv >= stop) {
246 SkDebugf("Missing width for --viewport\n");
247 usage(argv0);
248 exit(-1);
249 }
250 viewport.fWidth = atoi(*argv);
251 ++argv;
252 if (argv >= stop) {
253 SkDebugf("Missing height for --viewport\n");
254 usage(argv0);
255 exit(-1);
256 }
257 viewport.fHeight = atoi(*argv);
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000258 } else if (0 == strcmp(*argv, "--tiles")) {
259 ++argv;
260 if (argv >= stop) {
261 SkDebugf("Missing x for --tiles\n");
262 usage(argv0);
263 exit(-1);
264 }
265 xTilesString = *argv;
266 ++argv;
267 if (argv >= stop) {
268 SkDebugf("Missing y for --tiles\n");
269 usage(argv0);
270 exit(-1);
271 }
272 yTilesString = *argv;
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000273 } else if (0 == strcmp(*argv, "--pipe")) {
274 usePipe = true;
275 } else if (0 == strcmp(*argv, "--multi")) {
276 ++argv;
277 if (argv >= stop) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000278 SkSafeUnref(renderer);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000279 SkDebugf("Missing arg for --multi\n");
280 usage(argv0);
281 exit(-1);
282 }
283 numThreads = atoi(*argv);
284 if (numThreads < 2) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000285 SkSafeUnref(renderer);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000286 SkDebugf("Number of threads must be at least 2.\n");
287 usage(argv0);
288 exit(-1);
289 }
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000290 } else if (0 == strcmp(*argv, "--device")) {
291 ++argv;
292 if (argv >= stop) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000293 SkSafeUnref(renderer);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000294 SkDebugf("Missing mode for --device\n");
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000295 usage(argv0);
296 exit(-1);
297 }
298
299 if (0 == strcmp(*argv, "bitmap")) {
300 deviceType = sk_tools::PictureRenderer::kBitmap_DeviceType;
301 }
302#if SK_SUPPORT_GPU
303 else if (0 == strcmp(*argv, "gpu")) {
304 deviceType = sk_tools::PictureRenderer::kGPU_DeviceType;
305 }
306#endif
307 else {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000308 SkSafeUnref(renderer);
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000309 SkDebugf("%s is not a valid mode for --device\n", *argv);
310 usage(argv0);
311 exit(-1);
312 }
313
keyar@chromium.org472b3792012-07-20 22:34:27 +0000314 } else if ((0 == strcmp(*argv, "-h")) || (0 == strcmp(*argv, "--help"))) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000315 SkSafeUnref(renderer);
keyar@chromium.org472b3792012-07-20 22:34:27 +0000316 usage(argv0);
317 exit(-1);
borenet@google.com070d3542012-10-26 13:26:55 +0000318 } else if (0 == strcmp(*argv, "-w")) {
319 ++argv;
320 if (argv >= stop) {
321 SkDebugf("Missing output directory for -w\n");
322 usage(argv0);
323 exit(-1);
324 }
325 outputDir = SkNEW_ARGS(SkString, (*argv));
keyar@chromium.orga2333d92012-07-16 17:29:16 +0000326 } else {
327 inputs->push_back(SkString(*argv));
328 }
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000329 }
keyar@chromium.org472b3792012-07-20 22:34:27 +0000330
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000331 if (numThreads > 1 && !useTiles) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000332 SkSafeUnref(renderer);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000333 SkDebugf("Multithreaded drawing requires tiled rendering.\n");
334 usage(argv0);
335 exit(-1);
336 }
337
338 if (useTiles) {
339 SkASSERT(NULL == renderer);
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000340 sk_tools::TiledPictureRenderer* tiledRenderer;
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000341 if (isCopyMode) {
342 int x, y;
343 if (xTilesString != NULL) {
344 SkASSERT(yTilesString != NULL);
345 x = atoi(xTilesString);
346 y = atoi(yTilesString);
347 if (x <= 0 || y <= 0) {
348 SkDebugf("--tiles must be given values > 0\n");
349 usage(argv0);
350 exit(-1);
351 }
352 } else {
353 x = y = 4;
354 }
355 tiledRenderer = SkNEW_ARGS(sk_tools::CopyTilesRenderer, (x, y));
356 } else if (numThreads > 1) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000357 tiledRenderer = SkNEW_ARGS(sk_tools::MultiCorePictureRenderer, (numThreads));
358 } else {
359 tiledRenderer = SkNEW(sk_tools::TiledPictureRenderer);
360 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000361 if (isPowerOf2Mode) {
362 int minWidth = atoi(widthString);
363 if (!SkIsPow2(minWidth) || minWidth < 0) {
364 tiledRenderer->unref();
365 SkString err;
366 err.printf("-mode %s must be given a width"
367 " value that is a power of two\n", mode);
368 SkDebugf(err.c_str());
369 usage(argv0);
370 exit(-1);
371 }
372 tiledRenderer->setTileMinPowerOf2Width(minWidth);
373 } else if (sk_tools::is_percentage(widthString)) {
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000374 if (isCopyMode) {
375 tiledRenderer->unref();
376 SkString err;
377 err.printf("--mode %s does not support percentages.\n", mode);
378 SkDebugf(err.c_str());
379 usage(argv0);
380 exit(-1);
381 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000382 tiledRenderer->setTileWidthPercentage(atof(widthString));
383 if (!(tiledRenderer->getTileWidthPercentage() > 0)) {
384 tiledRenderer->unref();
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000385 SkDebugf("--mode %s must be given a width percentage > 0\n", mode);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000386 usage(argv0);
387 exit(-1);
388 }
389 } else {
390 tiledRenderer->setTileWidth(atoi(widthString));
391 if (!(tiledRenderer->getTileWidth() > 0)) {
392 tiledRenderer->unref();
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000393 SkDebugf("--mode %s must be given a width > 0\n", mode);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000394 usage(argv0);
395 exit(-1);
396 }
397 }
398
399 if (sk_tools::is_percentage(heightString)) {
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000400 if (isCopyMode) {
401 tiledRenderer->unref();
402 SkString err;
403 err.printf("--mode %s does not support percentages.\n", mode);
404 SkDebugf(err.c_str());
405 usage(argv0);
406 exit(-1);
407 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000408 tiledRenderer->setTileHeightPercentage(atof(heightString));
409 if (!(tiledRenderer->getTileHeightPercentage() > 0)) {
410 tiledRenderer->unref();
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000411 SkDebugf("--mode %s must be given a height percentage > 0\n", mode);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000412 usage(argv0);
413 exit(-1);
414 }
415 } else {
416 tiledRenderer->setTileHeight(atoi(heightString));
417 if (!(tiledRenderer->getTileHeight() > 0)) {
418 tiledRenderer->unref();
scroggo@google.com4a26d9d2012-11-07 18:01:46 +0000419 SkDebugf("--mode %s must be given a height > 0\n", mode);
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000420 usage(argv0);
421 exit(-1);
422 }
423 }
424 if (numThreads > 1) {
425#if SK_SUPPORT_GPU
426 if (sk_tools::PictureRenderer::kGPU_DeviceType == deviceType) {
427 tiledRenderer->unref();
428 SkDebugf("GPU not compatible with multithreaded tiling.\n");
429 usage(argv0);
430 exit(-1);
431 }
432#endif
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000433 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000434 renderer = tiledRenderer;
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000435 if (usePipe) {
436 SkDebugf("Pipe rendering is currently not compatible with tiling.\n"
437 "Turning off pipe.\n");
438 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000439 } else if (usePipe) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000440 if (renderer != NULL) {
441 renderer->unref();
442 SkDebugf("Pipe is incompatible with other modes.\n");
443 usage(argv0);
444 exit(-1);
445 }
scroggo@google.comb6e806b2012-10-03 17:32:33 +0000446 renderer = SkNEW(sk_tools::PipePictureRenderer);
447 }
448
borenet@google.com070d3542012-10-26 13:26:55 +0000449 if (inputs->empty()) {
scroggo@google.coma62da2f2012-11-02 21:28:12 +0000450 SkSafeUnref(renderer);
borenet@google.com070d3542012-10-26 13:26:55 +0000451 if (NULL != outputDir) {
452 SkDELETE(outputDir);
453 }
keyar@chromium.org472b3792012-07-20 22:34:27 +0000454 usage(argv0);
455 exit(-1);
456 }
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000457
458 if (NULL == renderer) {
459 renderer = SkNEW(sk_tools::SimplePictureRenderer);
460 }
keyar@chromium.org4ea96c52012-08-20 15:03:29 +0000461
scroggo@google.comc0d5e542012-12-13 21:40:48 +0000462 renderer->setViewport(viewport);
keyar@chromium.orgc81686c2012-08-20 15:04:04 +0000463 renderer->setDeviceType(deviceType);
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000464}
465
caryclark@google.com5987f582012-10-02 18:33:14 +0000466int tool_main(int argc, char** argv);
467int tool_main(int argc, char** argv) {
borenet@google.com66bcbd12012-09-17 18:26:06 +0000468 SkAutoGraphics ag;
keyar@chromium.org1cbd47c2012-07-13 18:22:59 +0000469 SkTArray<SkString> inputs;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000470 sk_tools::PictureRenderer* renderer = NULL;
borenet@google.com070d3542012-10-26 13:26:55 +0000471 SkString* outputDir = NULL;
472 parse_commandline(argc, argv, &inputs, renderer, outputDir);
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000473 SkASSERT(renderer);
keyar@chromium.orgd1dc9202012-07-09 18:32:08 +0000474
borenet@google.com66bcbd12012-09-17 18:26:06 +0000475 int failures = 0;
borenet@google.com070d3542012-10-26 13:26:55 +0000476 for (int i = 0; i < inputs.count(); i ++) {
borenet@google.com66bcbd12012-09-17 18:26:06 +0000477 failures += process_input(inputs[i], outputDir, *renderer);
junov@chromium.org777442d2012-06-12 14:56:36 +0000478 }
borenet@google.com66bcbd12012-09-17 18:26:06 +0000479 if (failures != 0) {
480 SkDebugf("Failed to render %i pictures.\n", failures);
481 return 1;
482 }
robertphillips@google.com163c84b2012-09-13 15:40:37 +0000483#if SK_SUPPORT_GPU
484#if GR_CACHE_STATS
485 if (renderer->isUsingGpuDevice()) {
486 GrContext* ctx = renderer->getGrContext();
487
488 ctx->printCacheStats();
489 }
490#endif
491#endif
borenet@google.com070d3542012-10-26 13:26:55 +0000492 if (NULL != outputDir) {
493 SkDELETE(outputDir);
494 }
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000495 SkDELETE(renderer);
caryclark@google.com868e1f62012-10-02 20:00:03 +0000496 return 0;
junov@chromium.org777442d2012-06-12 14:56:36 +0000497}
caryclark@google.com5987f582012-10-02 18:33:14 +0000498
499#if !defined SK_BUILD_FOR_IOS
500int main(int argc, char * const argv[]) {
501 return tool_main(argc, (char**) argv);
502}
503#endif