bench_pictures can now take percentages for tiling width and height.Review URL: https://codereview.appspot.com/6354074

Review URL: https://codereview.appspot.com/6354074

git-svn-id: http://skia.googlecode.com/svn/trunk@4516 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/bench_pictures_main.cpp b/tools/bench_pictures_main.cpp
index 1c3dd4a..78b9caa 100644
--- a/tools/bench_pictures_main.cpp
+++ b/tools/bench_pictures_main.cpp
@@ -30,9 +30,12 @@
                         const Options& options);
     int fTileWidth;
     int fTileHeight;
+    double fTileWidthPercentage;
+    double fTileHeightPercentage;
 
     Options() : fRepeats(DEFAULT_REPEATS), fBenchmark(run_simple_benchmark),
-    fTileWidth(DEFAULT_TILE_WIDTH), fTileHeight(DEFAULT_TILE_HEIGHT){}
+    fTileWidth(DEFAULT_TILE_WIDTH), fTileHeight(DEFAULT_TILE_HEIGHT),
+    fTileWidthPercentage(0), fTileHeightPercentage(0){}
 };
 
 static void usage(const char* argv0) {
@@ -55,9 +58,9 @@
 "Set the number of times to repeat each test."
 " Default is %i.\n", DEFAULT_REPEATS);
     SkDebugf(
-"     --tile width height: "
-"Set to use the tiling size and specify the dimensions of each tile."
-" Default is to not use tiling\n");
+"     --tile width[%] height[%]: "
+"Set to use the tiling size and specify the dimensions of each tile.\n"
+"                                     Default is to not use tiling\n");
 }
 
 static void run_simple_benchmark(SkPicture* picture,
@@ -174,7 +177,7 @@
 }
 
 static void run_single_benchmark(const SkString& inputPath,
-                                 const Options& options) {
+                                 Options* options) {
     SkFILEStream inputStream;
 
     inputStream.setPath(inputPath.c_str());
@@ -192,7 +195,21 @@
     printf("running bench [%i %i] %s ", picture.width(), picture.height(),
            filename.c_str());
 
-    options.fBenchmark(&picture, bitmap, options);
+    if (options->fTileWidthPercentage > 0) {
+        options->fTileWidth = sk_float_ceil2int(options->fTileWidthPercentage * picture.width()
+                                                / 100);
+    }
+    if (options->fTileHeightPercentage > 0) {
+        options->fTileHeight = sk_float_ceil2int(options->fTileHeightPercentage * picture.height()
+                                                 / 100);
+    }
+
+    options->fBenchmark(&picture, bitmap, *options);
+}
+
+static bool is_percentage(char* const string) {
+    SkString skString(string);
+    return skString.endsWith("%");
 }
 
 static void parse_commandline(int argc, char* const argv[],
@@ -218,10 +235,18 @@
             options->fBenchmark = run_tile_benchmark;
             ++argv;
             if (argv < stop) {
-                options->fTileWidth = atoi(*argv);
-                if (options->fTileWidth < 1) {
-                    SkDebugf("--tile must be given a width with a value > 0\n");
-                    exit(-1);
+                if (is_percentage(*argv)) {
+                    options->fTileWidthPercentage = atof(*argv);
+                    if (!(options->fTileWidthPercentage > 0)) {
+                        SkDebugf("--tile must be given a width percentage > 0\n");
+                        exit(-1);
+                    }
+                } else {
+                    options->fTileWidth = atoi(*argv);
+                    if (!(options->fTileWidth > 0)) {
+                        SkDebugf("--tile must be given a width > 0\n");
+                        exit(-1);
+                    }
                 }
             } else {
                 SkDebugf("Missing width for --tile\n");
@@ -230,15 +255,23 @@
             }
             ++argv;
             if (argv < stop) {
-                options->fTileHeight = atoi(*argv);
-                if (options->fTileHeight < 1) {
-                    SkDebugf("--tile must be given a height with a value > 0"
-                             "\n");
-                    exit(-1);
+                if (is_percentage(*argv)) {
+                    options->fTileHeightPercentage = atof(*argv);
+                    if (!(options->fTileHeightPercentage > 0)) {
+                        SkDebugf(
+                            "--tile must be given a height percentage > 0\n");
+                        exit(-1);
+                    }
+                } else {
+                    options->fTileHeight = atoi(*argv);
+                    if (!(options->fTileHeight > 0)) {
+                        SkDebugf("--tile must be given a height > 0\n");
+                        exit(-1);
+                    }
                 }
             } else {
                 SkDebugf("Missing height for --tile\n");
-                usage(argv0);\
+                usage(argv0);
                 exit(-1);
             }
         } else if (0 == strcmp(*argv, "--pipe")) {
@@ -257,7 +290,7 @@
     }
 }
 
-static void process_input(const SkString& input, const Options& options) {
+static void process_input(const SkString& input, Options* options) {
     SkOSFile::Iter iter(input.c_str(), "skp");
     SkString inputFilename;
 
@@ -280,6 +313,6 @@
     parse_commandline(argc, argv, &inputs, &options);
 
     for (int i = 0; i < inputs.count(); ++i) {
-        process_input(inputs[i], options);
+        process_input(inputs[i], &options);
     }
 }