Revert "Make gm use SkFlags."

Fix the build.

This reverts commit 6f1fe2aee39308fc56854b062be244a904c209e7.

Review URL: https://codereview.chromium.org/12709005

git-svn-id: http://skia.googlecode.com/svn/trunk@8236 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index 4fc9e39..0ac8f8f 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -23,7 +23,6 @@
 #include "SkDeferredCanvas.h"
 #include "SkDevice.h"
 #include "SkDrawFilter.h"
-#include "SkFlags.h"
 #include "SkGPipe.h"
 #include "SkGraphics.h"
 #include "SkImageDecoder.h"
@@ -58,6 +57,8 @@
 typedef int GLContextType;
 #endif
 
+static bool gForceBWtext;
+
 extern bool gSkSuppressFontCachePurgeSpew;
 
 #ifdef SK_SUPPORT_PDF
@@ -362,7 +363,11 @@
         force_all_opaque(*bitmap);
     }
 
-    static void installFilter(SkCanvas* canvas);
+    static void installFilter(SkCanvas* canvas) {
+        if (gForceBWtext) {
+            canvas->setDrawFilter(new BWTextDrawFilter)->unref();
+        }
+    }
 
     static void invokeGM(GM* gm, SkCanvas* canvas, bool isPDF, bool isDeferred) {
         SkAutoCanvasRestore acr(canvas, true);
@@ -896,6 +901,7 @@
             SkISize size = gm->getISize();
             setup_bitmap(gRec, size, &bitmap);
             SkCanvas canvas(bitmap);
+            installFilter(&canvas);
             PipeController pipeController(&canvas);
             SkGPipeWriter writer;
             SkCanvas* pipeCanvas = writer.startRecording(
@@ -922,6 +928,7 @@
             SkISize size = gm->getISize();
             setup_bitmap(gRec, size, &bitmap);
             SkCanvas canvas(bitmap);
+            installFilter(&canvas);
             TiledPipeController pipeController(bitmap);
             SkGPipeWriter writer;
             SkCanvas* pipeCanvas = writer.startRecording(
@@ -1007,54 +1014,58 @@
 #endif // SK_SUPPORT_PDF
 };
 
-static SkString configUsage() {
-    SkString result("Possible options for --config: [");
+static void usage(const char * argv0) {
+    fprintf(stderr, "%s\n", argv0);
+    fprintf(stderr, "    [--config ");
     for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
         if (i > 0) {
-            result.appendf("|");
+            fprintf(stderr, "|");
         }
-        result.appendf("%s", gRec[i].fName);
+        fprintf(stderr, "%s", gRec[i].fName);
     }
-    result.appendf("]");
-    return result;
-}
-
+    fprintf(stderr, "]:\n        run these configurations\n");
+    fprintf(stderr,
 // Alphabetized ignoring "no" prefix ("readPath", "noreplay", "resourcePath").
-DEFINE_string(config, "", "Space delimited list of which configs to run. "
-              "Possible configs listed above. If none are specified, "
-              "all will be run.");
-DEFINE_bool(deferred, true, "Exercise the deferred rendering test pass.");
-DEFINE_bool(enableMissingWarning, true, "Print message to stderr (but don't fail) if "
-            "unable to read a reference image for any tests.");
-DEFINE_string(excludeConfig, "", "Space delimited list of configs to skip.");
-DEFINE_bool(forceBWtext, false, "Disable text anti-aliasing.");
-DEFINE_string(gpuCacheSize, "", "<bytes> <count>: Limit the gpu cache to byte size or "
-              "object count. -1 for either value means use the default. 0 for either "
-              "disables the cache.");
-DEFINE_bool(hierarchy, false, "Whether to use multilevel directory structure "
-            "when reading/writing files.");
-DEFINE_string(match, "",  "Only run tests whose name includes this substring/these substrings "
-              "(more than one can be supplied, separated by spaces).");
-DEFINE_string(mismatchPath, "", "Write images for tests that failed due to "
-              "pixel mismatches into this directory.");
-DEFINE_string(modulo, "", "[--modulo <remainder> <divisor>]: only run tests for which "
-              "testIndex %% divisor == remainder.");
-DEFINE_bool(pdf, true, "Exercise the pdf rendering test pass.");
-DEFINE_bool(pipe, true, "Exercise the SkGPipe replay test pass.");
-DEFINE_string2(readPath, r, "", "Read reference images from this dir, and report "
-               "any differences between those and the newly generated ones.");
-DEFINE_bool(replay, true, "Exercise the SkPicture replay test pass.");
-DEFINE_string2(resourcePath, i, "", "Directory that stores image resources.");
-DEFINE_bool(rtree, true, "Exercise the R-Tree variant of SkPicture test pass.");
-DEFINE_bool(serialize, true, "Exercise the SkPicture serialization & deserialization test pass.");
-DEFINE_bool(tiledPipe, false, "Exercise tiled SkGPipe replay.");
-DEFINE_bool(tileGrid, true, "Exercise the tile grid variant of SkPicture.");
-DEFINE_string(tileGridReplayScales, "", "Space separated list of floating-point scale "
-              "factors to be used for tileGrid playback testing. Default value: 1.0");
-DEFINE_string(writeJsonSummaryPath, "", "Write a JSON-formatted result summary to this file.");
-DEFINE_bool2(verbose, v, false, "Print diagnostics (e.g. list each config to be tested).");
-DEFINE_string2(writePath, w, "",  "Write rendered images into this directory.");
-DEFINE_string2(writePicturePath, wp, "", "Write .skp files into this directory.");
+// It would probably be better if we allowed both yes-and-no settings for each
+// one, e.g.:
+// [--replay|--noreplay]: whether to exercise SkPicture replay; default is yes
+"    [--nodeferred]: skip the deferred rendering test pass\n"
+"    [--disable-missing-warning]: don't print a message to stderr if\n"
+"        unable to read a reference image for any tests (NOT default behavior)\n"
+"    [--enable-missing-warning]: print message to stderr (but don't fail) if\n"
+"        unable to read a reference image for any tests (default behavior)\n"
+"    [--exclude-config]: disable this config (may be used multiple times)\n"
+"    [--forceBWtext]: disable text anti-aliasing\n"
+#if SK_SUPPORT_GPU
+"    [--gpuCacheSize <bytes> <count>]: limits gpu cache to byte size or object count\n"
+"        -1 for either value means use the default. 0 for either disables the cache.\n"
+#endif
+"    [--help|-h]: show this help message\n"
+"    [--hierarchy|--nohierarchy]: whether to use multilevel directory structure\n"
+"        when reading/writing files; default is no\n"
+"    [--match <substring>]: only run tests whose name includes this substring\n"
+"    [--mismatchPath <path>]: write images for tests that failed due to\n"
+"        pixel mismatched into this directory"
+"    [--modulo <remainder> <divisor>]: only run tests for which \n"
+"        testIndex %% divisor == remainder\n"
+"    [--nopdf]: skip the pdf rendering test pass\n"
+"    [--nopipe]: Skip SkGPipe replay\n"
+"    [--readPath|-r <path>]: read reference images from this dir, and report\n"
+"        any differences between those and the newly generated ones\n"
+"    [--noreplay]: do not exercise SkPicture replay\n"
+"    [--resourcePath|-i <path>]: directory that stores image resources\n"
+"    [--nortree]: Do not exercise the R-Tree variant of SkPicture\n"
+"    [--noserialize]: do not exercise SkPicture serialization & deserialization\n"
+"    [--tiledPipe]: Exercise tiled SkGPipe replay\n"
+"    [--notileGrid]: Do not exercise the tile grid variant of SkPicture\n"
+"    [--tileGridReplayScales <scales>]: Comma separated list of floating-point scale\n"
+"        factors to be used for tileGrid playback testing. Default value: 1.0\n"
+"    [--writeJsonSummary <path>]: write a JSON-formatted result summary to this file\n"
+"    [--verbose] print diagnostics (e.g. list each config to be tested)\n"
+"    [--writePath|-w <path>]: write rendered images into this directory\n"
+"    [--writePicturePath|-wp <path>]: write .skp files into this directory\n"
+             );
+}
 
 static int findConfig(const char config[]) {
     for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) {
@@ -1141,82 +1152,205 @@
     setSystemPreferences();
     GMMain gmmain;
 
+    const char* writeJsonSummaryPath = NULL;// if non-null, where we write the JSON summary
+    const char* writePath = NULL;   // if non-null, where we write the originals
+    const char* writePicturePath = NULL;    // if non-null, where we write serialized pictures
+    const char* readPath = NULL;    // if non-null, were we read from to compare
+    const char* resourcePath = NULL;// if non-null, where we read from for image resources
+
+    // if true, emit a message when we can't find a reference image to compare
+    bool notifyMissingReadReference = true;
+
+    SkTDArray<const char*> fMatches;
+
+    bool doPDF = true;
+    bool doReplay = true;
+    bool doPipe = true;
+    bool doTiledPipe = false;
+    bool doSerialize = true;
+    bool doDeferred = true;
+    bool doRTree = true;
+    bool doTileGrid = true;
+    bool doVerbose = false;
+
     SkTDArray<size_t> configs;
     SkTDArray<size_t> excludeConfigs;
     SkTDArray<SkScalar> tileGridReplayScales;
     *tileGridReplayScales.append() = SK_Scalar1; // By default only test at scale 1.0
     bool userConfig = false;
 
-    SkString usage;
-    usage.printf("Run the golden master tests.\n\t%s", configUsage().c_str());
-    SkFlags::SetUsage(usage.c_str());
-    SkFlags::ParseCommandLine(argc, argv);
+    int moduloRemainder = -1;
+    int moduloDivisor = -1;
 
+#if SK_SUPPORT_GPU
     struct {
         int     fBytes;
         int     fCount;
     } gpuCacheSize = { -1, -1 }; // -1s mean use the default
+#endif
 
-    if (FLAGS_gpuCacheSize.count() > 0) {
-        if (FLAGS_gpuCacheSize.count() != 2) {
-            gm_fprintf(stderr, "--gpuCacheSize requires two arguments\n");
-            return -1;
-        }
-        gpuCacheSize.fBytes = atoi(FLAGS_gpuCacheSize[0]);
-        gpuCacheSize.fCount = atoi(FLAGS_gpuCacheSize[1]);
-    }
-
-    gmmain.fUseFileHierarchy = FLAGS_hierarchy;
-    if (FLAGS_mismatchPath.count() == 1) {
-        gmmain.fMismatchPath = FLAGS_mismatchPath[0];
-    }
-
-    for (int i = 0; i < FLAGS_config.count(); i++) {
-        int index = findConfig(FLAGS_config[i]);
-        if (index >= 0) {
-            appendUnique<size_t>(&configs, index);
-            userConfig = true;
-        } else {
-            gm_fprintf(stderr, "unrecognized config %s\n", FLAGS_config[i]);
-            return -1;
-        }
-    }
-
-    for (int i = 0; i < FLAGS_excludeConfig.count(); i++) {
-        int index = findConfig(FLAGS_excludeConfig[i]);
-        if (index >= 0) {
-            *excludeConfigs.append() = index;
-        } else {
-            gm_fprintf(stderr, "unrecognized excludeConfig %s\n", FLAGS_excludeConfig[i]);
-            return -1;
-        }
-    }
-
-    if (FLAGS_tileGridReplayScales.count() > 0) {
-        tileGridReplayScales.reset();
-        for (int i = 0; i < FLAGS_tileGridReplayScales.count(); i++) {
-            double val = atof(FLAGS_tileGridReplayScales[i]);
-            if (0 < val) {
-                *tileGridReplayScales.append() = SkDoubleToScalar(val);
+    const char* const commandName = argv[0];
+    char* const* stop = argv + argc;
+    for (++argv; argv < stop; ++argv) {
+        if (strcmp(*argv, "--config") == 0) {
+            argv++;
+            if (argv < stop) {
+                int index = findConfig(*argv);
+                if (index >= 0) {
+                    appendUnique<size_t>(&configs, index);
+                    userConfig = true;
+                } else {
+                    gm_fprintf(stderr, "unrecognized config %s\n", *argv);
+                    usage(commandName);
+                    return -1;
+                }
+            } else {
+                gm_fprintf(stderr, "missing arg for --config\n");
+                usage(commandName);
+                return -1;
             }
-        }
-        if (0 == tileGridReplayScales.count()) {
-            // Should have at least one scale
-            gm_fprintf(stderr, "--tileGridReplayScales requires at least one scale.\n");
+        } else if (strcmp(*argv, "--exclude-config") == 0) {
+            argv++;
+            if (argv < stop) {
+                int index = findConfig(*argv);
+                if (index >= 0) {
+                    *excludeConfigs.append() = index;
+                } else {
+                    gm_fprintf(stderr, "unrecognized exclude-config %s\n", *argv);
+                    usage(commandName);
+                    return -1;
+                }
+            } else {
+                gm_fprintf(stderr, "missing arg for --exclude-config\n");
+                usage(commandName);
+                return -1;
+            }
+        } else if (strcmp(*argv, "--nodeferred") == 0) {
+            doDeferred = false;
+        } else if (strcmp(*argv, "--disable-missing-warning") == 0) {
+            notifyMissingReadReference = false;
+        } else if (strcmp(*argv, "--mismatchPath") == 0) {
+            argv++;
+            if (argv < stop && **argv) {
+                gmmain.fMismatchPath = *argv;
+            }
+        } else if (strcmp(*argv, "--nortree") == 0) {
+            doRTree = false;
+        } else if (strcmp(*argv, "--notileGrid") == 0) {
+            doTileGrid = false;
+        } else if (strcmp(*argv, "--tileGridReplayScales") == 0) {
+            tileGridReplayScales.reset();
+            ++argv;
+            if (argv < stop) {
+                char* token = strtok(*argv, ",");
+                while (NULL != token) {
+                    double val = atof(token);
+                    if (0 < val) {
+                        *tileGridReplayScales.append() = SkDoubleToScalar(val);
+                    }
+                    token = strtok(NULL, ",");
+                }
+            }
+            if (0 == tileGridReplayScales.count()) {
+                // Should have at least one scale
+                usage(commandName);
+                return -1;
+            }
+        } else if (strcmp(*argv, "--enable-missing-warning") == 0) {
+            notifyMissingReadReference = true;
+        } else if (strcmp(*argv, "--forceBWtext") == 0) {
+            gForceBWtext = true;
+#if SK_SUPPORT_GPU
+        } else if (strcmp(*argv, "--gpuCacheSize") == 0) {
+            if (stop - argv > 2) {
+                gpuCacheSize.fBytes = atoi(*++argv);
+                gpuCacheSize.fCount = atoi(*++argv);
+            } else {
+                gm_fprintf(stderr, "missing arg for --gpuCacheSize\n");
+                usage(commandName);
+                return -1;
+            }
+#endif
+        } else if (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0) {
+            usage(commandName);
+            return -1;
+        } else if (strcmp(*argv, "--hierarchy") == 0) {
+            gmmain.fUseFileHierarchy = true;
+        } else if (strcmp(*argv, "--nohierarchy") == 0) {
+            gmmain.fUseFileHierarchy = false;
+        } else if (strcmp(*argv, "--match") == 0) {
+            ++argv;
+            if (argv < stop && **argv) {
+                // just record the ptr, no need for a deep copy
+                *fMatches.append() = *argv;
+            }
+        } else if (strcmp(*argv, "--modulo") == 0) {
+            ++argv;
+            if (argv >= stop) {
+                continue;
+            }
+            moduloRemainder = atoi(*argv);
+
+            ++argv;
+            if (argv >= stop) {
+                continue;
+            }
+            moduloDivisor = atoi(*argv);
+            if (moduloRemainder < 0 || moduloDivisor <= 0 || moduloRemainder >= moduloDivisor) {
+                gm_fprintf(stderr, "invalid modulo values.");
+                return -1;
+            }
+        } else if (strcmp(*argv, "--nopdf") == 0) {
+            doPDF = false;
+        } else if (strcmp(*argv, "--nopipe") == 0) {
+            doPipe = false;
+        } else if ((0 == strcmp(*argv, "--readPath")) ||
+                   (0 == strcmp(*argv, "-r"))) {
+            argv++;
+            if (argv < stop && **argv) {
+                readPath = *argv;
+            }
+        } else if (strcmp(*argv, "--noreplay") == 0) {
+            doReplay = false;
+        } else if ((0 == strcmp(*argv, "--resourcePath")) ||
+                   (0 == strcmp(*argv, "-i"))) {
+            argv++;
+            if (argv < stop && **argv) {
+                resourcePath = *argv;
+            }
+        } else if (strcmp(*argv, "--serialize") == 0) {
+            doSerialize = true;
+        } else if (strcmp(*argv, "--noserialize") == 0) {
+            doSerialize = false;
+        } else if (strcmp(*argv, "--tiledPipe") == 0) {
+            doTiledPipe = true;
+        } else if (!strcmp(*argv, "--verbose") || !strcmp(*argv, "-v")) {
+            doVerbose = true;
+        } else if ((0 == strcmp(*argv, "--writePath")) ||
+            (0 == strcmp(*argv, "-w"))) {
+            argv++;
+            if (argv < stop && **argv) {
+                writePath = *argv;
+            }
+        } else if (0 == strcmp(*argv, "--writeJsonSummary")) {
+            argv++;
+            if (argv < stop && **argv) {
+                writeJsonSummaryPath = *argv;
+            }
+        } else if ((0 == strcmp(*argv, "--writePicturePath")) ||
+                   (0 == strcmp(*argv, "-wp"))) {
+            argv++;
+            if (argv < stop && **argv) {
+                writePicturePath = *argv;
+            }
+        } else {
+            usage(commandName);
             return -1;
         }
     }
-
-    int moduloRemainder = -1;
-    int moduloDivisor = -1;
-
-    if (FLAGS_modulo.count() == 2) {
-        moduloRemainder = atoi(FLAGS_modulo[0]);
-        moduloDivisor = atoi(FLAGS_modulo[1]);
-        if (moduloRemainder < 0 || moduloDivisor <= 0 || moduloRemainder >= moduloDivisor) {
-            gm_fprintf(stderr, "invalid modulo values.");
-            return -1;
-        }
+    if (argv != stop) {
+        usage(commandName);
+        return -1;
     }
 
     if (!userConfig) {
@@ -1235,7 +1369,7 @@
         }
     }
 
-    if (FLAGS_verbose) {
+    if (doVerbose) {
         SkString str;
         str.printf("%d configs:", configs.count());
         for (int i = 0; i < configs.count(); ++i) {
@@ -1244,12 +1378,9 @@
         gm_fprintf(stderr, "%s\n", str.c_str());
     }
 
-    if (FLAGS_resourcePath.count() == 1) {
-        GM::SetResourcePath(FLAGS_resourcePath[0]);
-    }
+    GM::SetResourcePath(resourcePath);
 
-    if (FLAGS_readPath.count() == 1) {
-        const char* readPath = FLAGS_readPath[0];
+    if (readPath) {
         if (!sk_exists(readPath)) {
             gm_fprintf(stderr, "readPath %s does not exist!\n", readPath);
             return -1;
@@ -1258,21 +1389,21 @@
             gm_fprintf(stdout, "reading from %s\n", readPath);
             gmmain.fExpectationsSource.reset(SkNEW_ARGS(
                 IndividualImageExpectationsSource,
-                (readPath, FLAGS_enableMissingWarning)));
+                (readPath, notifyMissingReadReference)));
         } else {
             gm_fprintf(stdout, "reading expectations from JSON summary file %s\n", readPath);
             gmmain.fExpectationsSource.reset(SkNEW_ARGS(
                 JsonExpectationsSource, (readPath)));
         }
     }
-    if (FLAGS_writePath.count() == 1) {
-        gm_fprintf(stderr, "writing to %s\n", FLAGS_writePath[0]);
+    if (writePath) {
+        gm_fprintf(stdout, "writing to %s\n", writePath);
     }
-    if (FLAGS_writePicturePath.count() == 1) {
-        gm_fprintf(stderr, "writing pictures to %s\n", FLAGS_writePicturePath[0]);
+    if (writePicturePath) {
+        gm_fprintf(stdout, "writing pictures to %s\n", writePicturePath);
     }
-    if (FLAGS_resourcePath.count() == 1) {
-        gm_fprintf(stderr, "reading resources from %s\n", FLAGS_resourcePath[0]);
+    if (resourcePath) {
+        gm_fprintf(stdout, "reading resources from %s\n", resourcePath);
     }
 
     if (moduloDivisor <= 0) {
@@ -1296,15 +1427,15 @@
     SkString moduloStr;
 
     // If we will be writing out files, prepare subdirectories.
-    if (FLAGS_writePath.count() == 1) {
-        if (!sk_mkdir(FLAGS_writePath[0])) {
+    if (writePath) {
+        if (!sk_mkdir(writePath)) {
             return -1;
         }
         if (gmmain.fUseFileHierarchy) {
             for (int i = 0; i < configs.count(); i++) {
                 ConfigData config = gRec[configs[i]];
                 SkString subdir;
-                subdir.appendf("%s%c%s", FLAGS_writePath[0], SkPATH_SEPARATOR,
+                subdir.appendf("%s%c%s", writePath, SkPATH_SEPARATOR,
                                config.fName);
                 if (!sk_mkdir(subdir.c_str())) {
                     return -1;
@@ -1326,7 +1457,7 @@
         }
 
         const char* shortName = gm->shortName();
-        if (skip_name(FLAGS_match, shortName)) {
+        if (skip_name(fMatches, shortName)) {
             SkDELETE(gm);
             continue;
         }
@@ -1343,7 +1474,7 @@
 
             // Skip any tests that we don't even need to try.
             if ((kPDF_Backend == config.fBackend) &&
-                (!FLAGS_pdf|| (gmFlags & GM::kSkipPDF_Flag)))
+                (!doPDF || (gmFlags & GM::kSkipPDF_Flag)))
                 {
                     continue;
                 }
@@ -1405,12 +1536,6 @@
 
             SkBitmap comparisonBitmap;
 
-            const char* writePath;
-            if (FLAGS_writePath.count() == 1) {
-                writePath = FLAGS_writePath[0];
-            } else {
-                writePath = NULL;
-            }
             if (kEmptyErrorBitfield == renderErrors) {
                 renderErrors |= gmmain.test_drawing(gm, config, writePath,
                                                     GetGr(),
@@ -1418,7 +1543,7 @@
                                                     &comparisonBitmap);
             }
 
-            if (FLAGS_deferred && !renderErrors &&
+            if (doDeferred && !renderErrors &&
                 (kGPU_Backend == config.fBackend ||
                  kRaster_Backend == config.fBackend)) {
                 renderErrors |= gmmain.test_deferred_drawing(gm, config,
@@ -1444,7 +1569,7 @@
             SkPicture* pict = gmmain.generate_new_picture(gm, kNone_BbhType, 0);
             SkAutoUnref aur(pict);
 
-            if ((kEmptyErrorBitfield == testErrors) && FLAGS_replay) {
+            if ((kEmptyErrorBitfield == testErrors) && doReplay) {
                 SkBitmap bitmap;
                 gmmain.generate_image_from_picture(gm, compareConfig, pict,
                                                    &bitmap);
@@ -1454,7 +1579,7 @@
 
             if ((kEmptyErrorBitfield == testErrors) &&
                 (kEmptyErrorBitfield == pictErrors) &&
-                FLAGS_serialize) {
+                doSerialize) {
                 SkPicture* repict = gmmain.stream_to_new_picture(*pict);
                 SkAutoUnref aurr(repict);
 
@@ -1465,9 +1590,9 @@
                     gm, compareConfig, "-serialize", bitmap, &comparisonBitmap);
             }
 
-            if (FLAGS_writePicturePath.count() == 1) {
+            if (writePicturePath) {
                 const char* pictureSuffix = "skp";
-                SkString path = make_filename(FLAGS_writePicturePath[0], "",
+                SkString path = make_filename(writePicturePath, "",
                                               gm->shortName(),
                                               pictureSuffix);
                 SkFILEWStream stream(path.c_str());
@@ -1481,7 +1606,7 @@
         // different bitmap than the standard rendering.  It should
         // show up as failed in the JSON summary, and should be listed
         // in the stdout also.
-        if (!(gmFlags & GM::kSkipPicture_Flag) && FLAGS_rtree) {
+        if (!(gmFlags & GM::kSkipPicture_Flag) && doRTree) {
             SkPicture* pict = gmmain.generate_new_picture(
                 gm, kRTree_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFlag);
             SkAutoUnref aur(pict);
@@ -1492,7 +1617,7 @@
                 gm, compareConfig, "-rtree", bitmap, &comparisonBitmap);
         }
 
-        if (!(gmFlags & GM::kSkipPicture_Flag) && FLAGS_tileGrid) {
+        if (!(gmFlags & GM::kSkipPicture_Flag) && doTileGrid) {
             for(int scaleIndex = 0; scaleIndex < tileGridReplayScales.count(); ++scaleIndex) {
                 SkScalar replayScale = tileGridReplayScales[scaleIndex];
                 if ((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1)
@@ -1523,14 +1648,14 @@
 
             ErrorBitfield pipeErrors = kEmptyErrorBitfield;
 
-            if ((kEmptyErrorBitfield == testErrors) && FLAGS_pipe) {
+            if ((kEmptyErrorBitfield == testErrors) && doPipe) {
                 pipeErrors |= gmmain.test_pipe_playback(gm, compareConfig,
                                                         comparisonBitmap);
             }
 
             if ((kEmptyErrorBitfield == testErrors) &&
                 (kEmptyErrorBitfield == pipeErrors) &&
-                FLAGS_tiledPipe && !(gmFlags & GM::kSkipTiled_Flag)) {
+                doTiledPipe && !(gmFlags & GM::kSkipTiled_Flag)) {
                 pipeErrors |= gmmain.test_tiled_pipe_playback(gm, compareConfig,
                                                               comparisonBitmap);
             }
@@ -1559,7 +1684,7 @@
                testsRun, testsPassed, testsFailed, testsMissingReferenceImages);
     gmmain.ListErrors();
 
-    if (FLAGS_writeJsonSummaryPath.count() == 1) {
+    if (NULL != writeJsonSummaryPath) {
         Json::Value actualResults;
         actualResults[kJsonKey_ActualResults_Failed] =
             gmmain.fJsonActualResults_Failed;
@@ -1573,7 +1698,7 @@
         root[kJsonKey_ActualResults] = actualResults;
         root[kJsonKey_ExpectedResults] = gmmain.fJsonExpectedResults;
         std::string jsonStdString = root.toStyledString();
-        SkFILEWStream stream(FLAGS_writeJsonSummaryPath[0]);
+        SkFILEWStream stream(writeJsonSummaryPath);
         stream.write(jsonStdString.c_str(), jsonStdString.length());
     }
 
@@ -1599,12 +1724,6 @@
     return (0 == testsFailed) ? 0 : -1;
 }
 
-void GMMain::installFilter(SkCanvas* canvas) {
-    if (FLAGS_forceBWtext) {
-        canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref();
-    }
-}
-
 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
 int main(int argc, char * const argv[]) {
     return tool_main(argc, (char**) argv);
diff --git a/gm/tests/outputs/compared-against-different-pixels-images/output-expected/command_line b/gm/tests/outputs/compared-against-different-pixels-images/output-expected/command_line
index fcf9744..9c664aa 100644
--- a/gm/tests/outputs/compared-against-different-pixels-images/output-expected/command_line
+++ b/gm/tests/outputs/compared-against-different-pixels-images/output-expected/command_line
@@ -1 +1 @@
-out/Debug/gm --hierarchy --match selftest1 --config 8888 565 -r gm/tests/inputs/images/different-pixels --writeJsonSummaryPath gm/tests/outputs/compared-against-different-pixels-images/output-actual/json-summary.txt
+out/Debug/gm --hierarchy --match selftest1 --config 8888 --config 565 -r gm/tests/inputs/images/different-pixels --writeJsonSummary gm/tests/outputs/compared-against-different-pixels-images/output-actual/json-summary.txt
diff --git a/gm/tests/outputs/compared-against-different-pixels-json/output-expected/command_line b/gm/tests/outputs/compared-against-different-pixels-json/output-expected/command_line
index be84052..8e75446 100644
--- a/gm/tests/outputs/compared-against-different-pixels-json/output-expected/command_line
+++ b/gm/tests/outputs/compared-against-different-pixels-json/output-expected/command_line
@@ -1 +1 @@
-out/Debug/gm --hierarchy --match selftest1 --config 8888 565 -r gm/tests/inputs/json/different-pixels.json --writeJsonSummaryPath gm/tests/outputs/compared-against-different-pixels-json/output-actual/json-summary.txt
+out/Debug/gm --hierarchy --match selftest1 --config 8888 --config 565 -r gm/tests/inputs/json/different-pixels.json --writeJsonSummary gm/tests/outputs/compared-against-different-pixels-json/output-actual/json-summary.txt
diff --git a/gm/tests/outputs/compared-against-empty-dir/output-expected/command_line b/gm/tests/outputs/compared-against-empty-dir/output-expected/command_line
index ad626bc..a58c364 100644
--- a/gm/tests/outputs/compared-against-empty-dir/output-expected/command_line
+++ b/gm/tests/outputs/compared-against-empty-dir/output-expected/command_line
@@ -1 +1 @@
-out/Debug/gm --hierarchy --match selftest1 --config 8888 565 -r gm/tests/inputs/images/empty-dir --writeJsonSummaryPath gm/tests/outputs/compared-against-empty-dir/output-actual/json-summary.txt
+out/Debug/gm --hierarchy --match selftest1 --config 8888 --config 565 -r gm/tests/inputs/images/empty-dir --writeJsonSummary gm/tests/outputs/compared-against-empty-dir/output-actual/json-summary.txt
diff --git a/gm/tests/outputs/compared-against-identical-bytes-images/output-expected/command_line b/gm/tests/outputs/compared-against-identical-bytes-images/output-expected/command_line
index 614cb2b..849d485 100644
--- a/gm/tests/outputs/compared-against-identical-bytes-images/output-expected/command_line
+++ b/gm/tests/outputs/compared-against-identical-bytes-images/output-expected/command_line
@@ -1 +1 @@
-out/Debug/gm --hierarchy --match selftest1 --config 8888 565 -r gm/tests/inputs/images/identical-bytes --writeJsonSummaryPath gm/tests/outputs/compared-against-identical-bytes-images/output-actual/json-summary.txt
+out/Debug/gm --hierarchy --match selftest1 --config 8888 --config 565 -r gm/tests/inputs/images/identical-bytes --writeJsonSummary gm/tests/outputs/compared-against-identical-bytes-images/output-actual/json-summary.txt
diff --git a/gm/tests/outputs/compared-against-identical-bytes-json/output-expected/command_line b/gm/tests/outputs/compared-against-identical-bytes-json/output-expected/command_line
index aae0b60..6b82f39 100644
--- a/gm/tests/outputs/compared-against-identical-bytes-json/output-expected/command_line
+++ b/gm/tests/outputs/compared-against-identical-bytes-json/output-expected/command_line
@@ -1 +1 @@
-out/Debug/gm --hierarchy --match selftest1 --config 8888 565 -r gm/tests/inputs/json/identical-bytes.json --writeJsonSummaryPath gm/tests/outputs/compared-against-identical-bytes-json/output-actual/json-summary.txt
+out/Debug/gm --hierarchy --match selftest1 --config 8888 --config 565 -r gm/tests/inputs/json/identical-bytes.json --writeJsonSummary gm/tests/outputs/compared-against-identical-bytes-json/output-actual/json-summary.txt
diff --git a/gm/tests/outputs/compared-against-identical-pixels-images/output-expected/command_line b/gm/tests/outputs/compared-against-identical-pixels-images/output-expected/command_line
index 34fcc98..c282d00 100644
--- a/gm/tests/outputs/compared-against-identical-pixels-images/output-expected/command_line
+++ b/gm/tests/outputs/compared-against-identical-pixels-images/output-expected/command_line
@@ -1 +1 @@
-out/Debug/gm --hierarchy --match selftest1 --config 8888 565 -r gm/tests/inputs/images/identical-pixels --writeJsonSummaryPath gm/tests/outputs/compared-against-identical-pixels-images/output-actual/json-summary.txt
+out/Debug/gm --hierarchy --match selftest1 --config 8888 --config 565 -r gm/tests/inputs/images/identical-pixels --writeJsonSummary gm/tests/outputs/compared-against-identical-pixels-images/output-actual/json-summary.txt
diff --git a/gm/tests/outputs/compared-against-identical-pixels-json/output-expected/command_line b/gm/tests/outputs/compared-against-identical-pixels-json/output-expected/command_line
index a7a9c82..6161298 100644
--- a/gm/tests/outputs/compared-against-identical-pixels-json/output-expected/command_line
+++ b/gm/tests/outputs/compared-against-identical-pixels-json/output-expected/command_line
@@ -1 +1 @@
-out/Debug/gm --hierarchy --match selftest1 --config 8888 565 -r gm/tests/inputs/json/identical-pixels.json --writeJsonSummaryPath gm/tests/outputs/compared-against-identical-pixels-json/output-actual/json-summary.txt
+out/Debug/gm --hierarchy --match selftest1 --config 8888 --config 565 -r gm/tests/inputs/json/identical-pixels.json --writeJsonSummary gm/tests/outputs/compared-against-identical-pixels-json/output-actual/json-summary.txt
diff --git a/gm/tests/outputs/no-readpath/output-expected/command_line b/gm/tests/outputs/no-readpath/output-expected/command_line
index a75c735..9339f80 100644
--- a/gm/tests/outputs/no-readpath/output-expected/command_line
+++ b/gm/tests/outputs/no-readpath/output-expected/command_line
@@ -1 +1 @@
-out/Debug/gm --hierarchy --match selftest1 --config 8888 565 --writeJsonSummaryPath gm/tests/outputs/no-readpath/output-actual/json-summary.txt
+out/Debug/gm --hierarchy --match selftest1 --config 8888 --config 565 --writeJsonSummary gm/tests/outputs/no-readpath/output-actual/json-summary.txt
diff --git a/gm/tests/run.sh b/gm/tests/run.sh
index d7da1d3..840fefe 100755
--- a/gm/tests/run.sh
+++ b/gm/tests/run.sh
@@ -21,7 +21,7 @@
 
 OUTPUT_ACTUAL_SUBDIR=output-actual
 OUTPUT_EXPECTED_SUBDIR=output-expected
-CONFIGS="--config 8888 565"
+CONFIGS="--config 8888 --config 565"
 
 # Compare contents of all files within directories $1 and $2,
 # EXCEPT for any dotfiles.
@@ -58,7 +58,7 @@
 
   rm -rf $ACTUAL_OUTPUT_DIR
   mkdir -p $ACTUAL_OUTPUT_DIR
-  COMMAND="$GM_BINARY $GM_ARGS --writeJsonSummaryPath $JSON_SUMMARY_FILE"
+  COMMAND="$GM_BINARY $GM_ARGS --writeJsonSummary $JSON_SUMMARY_FILE"
   echo "$COMMAND" >$ACTUAL_OUTPUT_DIR/command_line
   $COMMAND >$ACTUAL_OUTPUT_DIR/stdout 2>$ACTUAL_OUTPUT_DIR/stderr
   echo $? >$ACTUAL_OUTPUT_DIR/return_value
@@ -100,7 +100,7 @@
   # Run GM again to read in those images and write them out as a JSON summary.
   $GM_BINARY --hierarchy --match selftest1 $CONFIGS \
     -r $IMAGES_DIR/identical-bytes \
-    --writeJsonSummaryPath $JSON_DIR/identical-bytes.json
+    --writeJsonSummary $JSON_DIR/identical-bytes.json
 
   mkdir -p $IMAGES_DIR/identical-pixels
   $GM_BINARY --hierarchy --match selftest1 $CONFIGS \
@@ -111,7 +111,7 @@
     >> $IMAGES_DIR/identical-pixels/565/selftest1.png
   $GM_BINARY --hierarchy --match selftest1 $CONFIGS \
     -r $IMAGES_DIR/identical-pixels \
-    --writeJsonSummaryPath $JSON_DIR/identical-pixels.json
+    --writeJsonSummary $JSON_DIR/identical-pixels.json
 
   mkdir -p $IMAGES_DIR/different-pixels
   $GM_BINARY --hierarchy --match selftest2 $CONFIGS \
@@ -122,7 +122,7 @@
     $IMAGES_DIR/different-pixels/565/selftest1.png
   $GM_BINARY --hierarchy --match selftest1 $CONFIGS \
     -r $IMAGES_DIR/different-pixels \
-    --writeJsonSummaryPath $JSON_DIR/different-pixels.json
+    --writeJsonSummary $JSON_DIR/different-pixels.json
 
   mkdir -p $IMAGES_DIR/empty-dir
 }
diff --git a/gyp/flags.gyp b/gyp/flags.gyp
deleted file mode 100644
index 712a04b..0000000
--- a/gyp/flags.gyp
+++ /dev/null
@@ -1,29 +0,0 @@
-# GYP file to build flag parser
-#
-{
-  'targets': [
-    {
-      'target_name': 'flags',
-      'type': 'static_library',
-      'sources': [
-        '../tools/SkFlags.h',
-        '../tools/SkFlags.cpp',
-      ],
-      'dependencies': [
-        'skia_base_libs.gyp:skia_base_libs',
-        'core.gyp:core',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '../tools/',
-        ],
-      }
-    },
-  ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/gyp/gm.gyp b/gyp/gm.gyp
index 940ab84..4b2b1c4 100644
--- a/gyp/gm.gyp
+++ b/gyp/gm.gyp
@@ -26,7 +26,6 @@
       'dependencies': [
         'skia_base_libs.gyp:skia_base_libs',
         'effects.gyp:effects',
-        'flags.gyp:flags',
         'images.gyp:images',
         'jsoncpp.gyp:jsoncpp',
         'pdf.gyp:pdf',
diff --git a/gyp/tools.gyp b/gyp/tools.gyp
index 9ed7d68..9cbaf93 100644
--- a/gyp/tools.gyp
+++ b/gyp/tools.gyp
@@ -3,6 +3,8 @@
 # To build on Linux:
 #  ./gyp_skia tools.gyp && make tools
 #
+# Building on other platforms not tested yet.
+#
 {
   'includes': [
     'apptype_console.gypi',
@@ -64,11 +66,12 @@
       'type': 'executable',
       'sources': [
         '../tools/skhello.cpp',
+        '../tools/SkFlags.h',
+        '../tools/SkFlags.cpp',
       ],
       'dependencies': [
         'skia_base_libs.gyp:skia_base_libs',
         'effects.gyp:effects',
-        'flags.gyp:flags',
         'images.gyp:images',
       ],
     },
@@ -134,6 +137,8 @@
         '../tools/PictureRenderingFlags.cpp',
         '../tools/CopyTilesRenderer.h',
         '../tools/CopyTilesRenderer.cpp',
+        '../tools/SkFlags.h',
+        '../tools/SkFlags.cpp',
         '../src/pipe/utils/SamplePipeControllers.h',
         '../src/pipe/utils/SamplePipeControllers.cpp',
       ],
@@ -147,7 +152,6 @@
         'effects.gyp:effects',
         'images.gyp:images',
         'tools.gyp:picture_utils',
-        'flags.gyp:flags',
       ],
       'conditions': [
         ['skia_gpu == 1',
diff --git a/tools/SkFlags.cpp b/tools/SkFlags.cpp
index e386b42..b4337d1 100644
--- a/tools/SkFlags.cpp
+++ b/tools/SkFlags.cpp
@@ -38,12 +38,8 @@
             SkDebugf("Flags:\n");
             SkFlagInfo* flag = SkFlags::gHead;
             while (flag != NULL) {
-                SkDebugf("\t--%s:\ttype: %s", flag->name().c_str(),
-                          flag->typeAsString().c_str());
-                if (flag->defaultValue().size() > 0) {
-                    SkDebugf("\tdefault: %s", flag->defaultValue().c_str());
-                }
-                SkDebugf("\n");
+                SkDebugf("\t--%s:\ttype: %s\tdefault: %s\n", flag->name().c_str(),
+                          flag->typeAsString().c_str(), flag->defaultValue().c_str());
                 const SkString& help = flag->help();
                 size_t length = help.size();
                 const char* currLine = help.c_str();
diff --git a/tools/SkFlags.h b/tools/SkFlags.h
index 79cc878..d40cdd0 100644
--- a/tools/SkFlags.h
+++ b/tools/SkFlags.h
@@ -119,17 +119,6 @@
 #define DEFINE_bool(name, defaultValue, helpString)                         \
 bool FLAGS_##name;                                                          \
 static bool unused_##name = SkFlagInfo::CreateBoolFlag(TO_STRING(name),     \
-                                                       NULL,                \
-                                                       &FLAGS_##name,       \
-                                                       defaultValue,        \
-                                                       helpString)
-
-// bool 2 allows specifying a short name. No check is done to ensure that shortName
-// is actually shorter than name.
-#define DEFINE_bool2(name, shortName, defaultValue, helpString)             \
-bool FLAGS_##name;                                                          \
-static bool unused_##name = SkFlagInfo::CreateBoolFlag(TO_STRING(name),     \
-                                                       TO_STRING(shortName),\
                                                        &FLAGS_##name,       \
                                                        defaultValue,        \
                                                        helpString)
@@ -139,21 +128,10 @@
 #define DEFINE_string(name, defaultValue, helpString)                       \
 SkTDArray<const char*> FLAGS_##name;                                        \
 static bool unused_##name = SkFlagInfo::CreateStringFlag(TO_STRING(name),   \
-                                                         NULL,              \
                                                          &FLAGS_##name,     \
                                                          defaultValue,      \
                                                          helpString)
 
-// string2 allows specifying a short name. No check is done to ensure that shortName
-// is actually shorter than name.
-#define DEFINE_string2(name, shortName, defaultValue, helpString)               \
-SkTDArray<const char*> FLAGS_##name;                                            \
-static bool unused_##name = SkFlagInfo::CreateStringFlag(TO_STRING(name),       \
-                                                         TO_STRING(shortName),  \
-                                                         &FLAGS_##name,         \
-                                                         defaultValue,          \
-                                                         helpString)
-
 #define DECLARE_string(name) extern SkTDArray<const char*> FLAGS_##name;
 
 #define DEFINE_int32(name, defaultValue, helpString)                        \
@@ -185,20 +163,17 @@
     };
 
     // Create flags of the desired type, and append to the list.
-    static bool CreateBoolFlag(const char* name, const char* shortName, bool* pBool,
+    static bool CreateBoolFlag(const char* name, bool* pBool,
                                bool defaultValue, const char* helpString) {
         SkFlagInfo* info = SkNEW_ARGS(SkFlagInfo, (name, kBool_FlagType, helpString));
-        info->fShortName.set(shortName);
         info->fBoolValue = pBool;
         *info->fBoolValue = info->fDefaultBool = defaultValue;
         return true;
     }
 
-    static bool CreateStringFlag(const char* name, const char* shortName,
-                                 SkTDArray<const char*>* pStrings,
+    static bool CreateStringFlag(const char* name, SkTDArray<const char*>* pStrings,
                                  const char* defaultValue, const char* helpString) {
         SkFlagInfo* info = SkNEW_ARGS(SkFlagInfo, (name, kString_FlagType, helpString));
-        info->fShortName.set(shortName);
         info->fDefaultString.set(defaultValue);
 
         info->fStrings = pStrings;
@@ -231,28 +206,27 @@
      *  value, since a bool is specified as true or false by --name or --noname.
      */
     bool match(const char* string) {
-        if (SkStrStartsWith(string, '-') && strlen(string) > 1) {
+        if (SkStrStartsWith(string, '-')) {
             string++;
             // Allow one or two dashes
-            if (SkStrStartsWith(string, '-') && strlen(string) > 1) {
+            if (SkStrStartsWith(string, '-')) {
                 string++;
             }
             if (kBool_FlagType == fFlagType) {
                 // In this case, go ahead and set the value.
-                if (fName.equals(string) || fShortName.equals(string)) {
+                if (fName.equals(string)) {
                     *fBoolValue = true;
                     return true;
                 }
-                if (SkStrStartsWith(string, "no") && strlen(string) > 2) {
-                    string += 2;
-                    if (fName.equals(string) || fShortName.equals(string)) {
-                        *fBoolValue = false;
-                        return true;
-                    }
-                    return false;
+                SkString noname(fName);
+                noname.prepend("no");
+                if (noname.equals(string)) {
+                    *fBoolValue = false;
+                    return true;
                 }
+                return false;
             }
-            return fName.equals(string) || fShortName.equals(string);
+            return fName.equals(string);
         } else {
             // Has no dash
             return false;
@@ -353,7 +327,6 @@
     }
     // Name of the flag, without initial dashes
     SkString             fName;
-    SkString             fShortName;
     FlagTypes            fFlagType;
     SkString             fHelpString;
     bool*                fBoolValue;