diff options
author | scroggo@google.com <scroggo@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-03-20 14:20:18 +0000 |
---|---|---|
committer | scroggo@google.com <scroggo@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-03-20 14:20:18 +0000 |
commit | 09fd4d216963c498c24ba355accce9337a5029a8 (patch) | |
tree | efaf8ecb93ffa756ed4f598b6ce0d0a8fa8c5a59 | |
parent | f210f505ffffccc15ae5e91f8ccb9763ba7fc152 (diff) |
Reland r8235 "Switch gm to use SkFlags."
This time, using #if guards for gpuCacheSize consistently.
Also fix some warnings.
BUG=https://code.google.com/p/skia/issues/detail?id=1094
Review URL: https://codereview.chromium.org/12440052
git-svn-id: http://skia.googlecode.com/svn/trunk@8254 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | gm/gmmain.cpp | 407 | ||||
-rw-r--r-- | gm/tests/outputs/compared-against-different-pixels-images/output-expected/command_line | 2 | ||||
-rw-r--r-- | gm/tests/outputs/compared-against-different-pixels-json/output-expected/command_line | 2 | ||||
-rw-r--r-- | gm/tests/outputs/compared-against-empty-dir/output-expected/command_line | 2 | ||||
-rw-r--r-- | gm/tests/outputs/compared-against-identical-bytes-images/output-expected/command_line | 2 | ||||
-rw-r--r-- | gm/tests/outputs/compared-against-identical-bytes-json/output-expected/command_line | 2 | ||||
-rw-r--r-- | gm/tests/outputs/compared-against-identical-pixels-images/output-expected/command_line | 2 | ||||
-rw-r--r-- | gm/tests/outputs/compared-against-identical-pixels-json/output-expected/command_line | 2 | ||||
-rw-r--r-- | gm/tests/outputs/no-readpath/output-expected/command_line | 2 | ||||
-rwxr-xr-x | gm/tests/run.sh | 10 | ||||
-rw-r--r-- | gyp/flags.gyp | 29 | ||||
-rw-r--r-- | gyp/gm.gyp | 1 | ||||
-rw-r--r-- | gyp/tools.gyp | 8 | ||||
-rw-r--r-- | tools/SkFlags.cpp | 8 | ||||
-rw-r--r-- | tools/SkFlags.h | 51 |
15 files changed, 237 insertions, 293 deletions
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp index 2c8ac7b73e..818c7c01ba 100644 --- a/gm/gmmain.cpp +++ b/gm/gmmain.cpp @@ -23,6 +23,7 @@ #include "SkDeferredCanvas.h" #include "SkDevice.h" #include "SkDrawFilter.h" +#include "SkFlags.h" #include "SkGPipe.h" #include "SkGraphics.h" #include "SkImageDecoder.h" @@ -57,8 +58,6 @@ class GrRenderTarget; typedef int GLContextType; #endif -static bool gForceBWtext; - extern bool gSkSuppressFontCachePurgeSpew; #ifdef SK_SUPPORT_PDF @@ -364,11 +363,7 @@ public: force_all_opaque(*bitmap); } - static void installFilter(SkCanvas* canvas) { - if (gForceBWtext) { - canvas->setDrawFilter(new BWTextDrawFilter)->unref(); - } - } + static void installFilter(SkCanvas* canvas); static void invokeGM(GM* gm, SkCanvas* canvas, bool isPDF, bool isDeferred) { SkAutoCanvasRestore acr(canvas, true); @@ -826,7 +821,7 @@ public: SkDynamicMemoryWStream storage; src.serialize(&storage); - int streamSize = storage.getOffset(); + size_t streamSize = storage.getOffset(); SkAutoMalloc dstStorage(streamSize); void* dst = dstStorage.get(); //char* dst = new char [streamSize]; @@ -1013,63 +1008,61 @@ static const ConfigData gRec[] = { #endif // SK_SUPPORT_PDF }; -static void usage(const char * argv0) { - fprintf(stderr, "%s\n", argv0); - fprintf(stderr, " [--config "); +static SkString configUsage() { + SkString result("Possible options for --config: ["); for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { if (i > 0) { - fprintf(stderr, "|"); + result.appendf("|"); } - fprintf(stderr, "%s", gRec[i].fName); + result.appendf("%s", gRec[i].fName); } - fprintf(stderr, "]:\n run these configurations\n"); - fprintf(stderr, + result.appendf("]"); + return result; +} + // Alphabetized ignoring "no" prefix ("readPath", "noreplay", "resourcePath"). -// 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" +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."); #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" +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."); #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" - ); -} +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."); static int findConfig(const char config[]) { for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) { if (!strcmp(config, gRec[i].fName)) { - return i; + return (int) i; } } return -1; @@ -1151,205 +1144,84 @@ int tool_main(int argc, char** argv) { 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; - int moduloRemainder = -1; - int moduloDivisor = -1; + SkString usage; + usage.printf("Run the golden master tests.\n\t%s", configUsage().c_str()); + SkFlags::SetUsage(usage.c_str()); + SkFlags::ParseCommandLine(argc, argv); #if SK_SUPPORT_GPU struct { int fBytes; int fCount; } gpuCacheSize = { -1, -1 }; // -1s mean use the default -#endif - 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; - } - } 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; - } + 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]); + } #endif - } else if (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0) { - usage(commandName); + + 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; - } 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; - } + for (int i = 0; i < FLAGS_excludeConfig.count(); i++) { + int index = findConfig(FLAGS_excludeConfig[i]); + if (index >= 0) { + *excludeConfigs.append() = index; } else { - usage(commandName); + 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); + } + } + if (0 == tileGridReplayScales.count()) { + // Should have at least one scale + gm_fprintf(stderr, "--tileGridReplayScales requires at least one scale.\n"); return -1; } } - if (argv != stop) { - 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 (!userConfig) { @@ -1373,7 +1245,7 @@ int tool_main(int argc, char** argv) { #if SK_SUPPORT_GPU GrContextFactory* grFactory = new GrContextFactory; for (int i = 0; i < configs.count(); ++i) { - int index = configs[i]; + size_t index = configs[i]; if (kGPU_Backend == gRec[index].fBackend) { GrContext* ctx = grFactory->get(gRec[index].fGLContextType); if (NULL == ctx) { @@ -1392,7 +1264,7 @@ int tool_main(int argc, char** argv) { } #endif - if (doVerbose) { + if (FLAGS_verbose) { SkString str; str.printf("%d configs:", configs.count()); for (int i = 0; i < configs.count(); ++i) { @@ -1401,9 +1273,12 @@ int tool_main(int argc, char** argv) { gm_fprintf(stderr, "%s\n", str.c_str()); } - GM::SetResourcePath(resourcePath); + if (FLAGS_resourcePath.count() == 1) { + GM::SetResourcePath(FLAGS_resourcePath[0]); + } - if (readPath) { + if (FLAGS_readPath.count() == 1) { + const char* readPath = FLAGS_readPath[0]; if (!sk_exists(readPath)) { gm_fprintf(stderr, "readPath %s does not exist!\n", readPath); return -1; @@ -1412,21 +1287,21 @@ int tool_main(int argc, char** argv) { gm_fprintf(stdout, "reading from %s\n", readPath); gmmain.fExpectationsSource.reset(SkNEW_ARGS( IndividualImageExpectationsSource, - (readPath, notifyMissingReadReference))); + (readPath, FLAGS_enableMissingWarning))); } else { gm_fprintf(stdout, "reading expectations from JSON summary file %s\n", readPath); gmmain.fExpectationsSource.reset(SkNEW_ARGS( JsonExpectationsSource, (readPath))); } } - if (writePath) { - gm_fprintf(stdout, "writing to %s\n", writePath); + if (FLAGS_writePath.count() == 1) { + gm_fprintf(stderr, "writing to %s\n", FLAGS_writePath[0]); } - if (writePicturePath) { - gm_fprintf(stdout, "writing pictures to %s\n", writePicturePath); + if (FLAGS_writePicturePath.count() == 1) { + gm_fprintf(stderr, "writing pictures to %s\n", FLAGS_writePicturePath[0]); } - if (resourcePath) { - gm_fprintf(stdout, "reading resources from %s\n", resourcePath); + if (FLAGS_resourcePath.count() == 1) { + gm_fprintf(stderr, "reading resources from %s\n", FLAGS_resourcePath[0]); } if (moduloDivisor <= 0) { @@ -1446,15 +1321,15 @@ int tool_main(int argc, char** argv) { SkString moduloStr; // If we will be writing out files, prepare subdirectories. - if (writePath) { - if (!sk_mkdir(writePath)) { + if (FLAGS_writePath.count() == 1) { + if (!sk_mkdir(FLAGS_writePath[0])) { 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", writePath, SkPATH_SEPARATOR, + subdir.appendf("%s%c%s", FLAGS_writePath[0], SkPATH_SEPARATOR, config.fName); if (!sk_mkdir(subdir.c_str())) { return -1; @@ -1476,7 +1351,7 @@ int tool_main(int argc, char** argv) { } const char* shortName = gm->shortName(); - if (skip_name(fMatches, shortName)) { + if (skip_name(FLAGS_match, shortName)) { SkDELETE(gm); continue; } @@ -1493,7 +1368,7 @@ int tool_main(int argc, char** argv) { // Skip any tests that we don't even need to try. if ((kPDF_Backend == config.fBackend) && - (!doPDF || (gmFlags & GM::kSkipPDF_Flag))) + (!FLAGS_pdf|| (gmFlags & GM::kSkipPDF_Flag))) { continue; } @@ -1555,6 +1430,12 @@ int tool_main(int argc, char** argv) { 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(), @@ -1562,7 +1443,7 @@ int tool_main(int argc, char** argv) { &comparisonBitmap); } - if (doDeferred && !renderErrors && + if (FLAGS_deferred && !renderErrors && (kGPU_Backend == config.fBackend || kRaster_Backend == config.fBackend)) { renderErrors |= gmmain.test_deferred_drawing(gm, config, @@ -1588,7 +1469,7 @@ int tool_main(int argc, char** argv) { SkPicture* pict = gmmain.generate_new_picture(gm, kNone_BbhType, 0); SkAutoUnref aur(pict); - if ((kEmptyErrorBitfield == testErrors) && doReplay) { + if ((kEmptyErrorBitfield == testErrors) && FLAGS_replay) { SkBitmap bitmap; gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap); @@ -1598,7 +1479,7 @@ int tool_main(int argc, char** argv) { if ((kEmptyErrorBitfield == testErrors) && (kEmptyErrorBitfield == pictErrors) && - doSerialize) { + FLAGS_serialize) { SkPicture* repict = gmmain.stream_to_new_picture(*pict); SkAutoUnref aurr(repict); @@ -1609,9 +1490,9 @@ int tool_main(int argc, char** argv) { gm, compareConfig, "-serialize", bitmap, &comparisonBitmap); } - if (writePicturePath) { + if (FLAGS_writePicturePath.count() == 1) { const char* pictureSuffix = "skp"; - SkString path = make_filename(writePicturePath, "", + SkString path = make_filename(FLAGS_writePicturePath[0], "", gm->shortName(), pictureSuffix); SkFILEWStream stream(path.c_str()); @@ -1625,7 +1506,7 @@ int tool_main(int argc, char** argv) { // 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) && doRTree) { + if (!(gmFlags & GM::kSkipPicture_Flag) && FLAGS_rtree) { SkPicture* pict = gmmain.generate_new_picture( gm, kRTree_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFlag); SkAutoUnref aur(pict); @@ -1636,7 +1517,7 @@ int tool_main(int argc, char** argv) { gm, compareConfig, "-rtree", bitmap, &comparisonBitmap); } - if (!(gmFlags & GM::kSkipPicture_Flag) && doTileGrid) { + if (!(gmFlags & GM::kSkipPicture_Flag) && FLAGS_tileGrid) { for(int scaleIndex = 0; scaleIndex < tileGridReplayScales.count(); ++scaleIndex) { SkScalar replayScale = tileGridReplayScales[scaleIndex]; if ((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1) @@ -1667,14 +1548,14 @@ int tool_main(int argc, char** argv) { ErrorBitfield pipeErrors = kEmptyErrorBitfield; - if ((kEmptyErrorBitfield == testErrors) && doPipe) { + if ((kEmptyErrorBitfield == testErrors) && FLAGS_pipe) { pipeErrors |= gmmain.test_pipe_playback(gm, compareConfig, comparisonBitmap); } if ((kEmptyErrorBitfield == testErrors) && (kEmptyErrorBitfield == pipeErrors) && - doTiledPipe && !(gmFlags & GM::kSkipTiled_Flag)) { + FLAGS_tiledPipe && !(gmFlags & GM::kSkipTiled_Flag)) { pipeErrors |= gmmain.test_tiled_pipe_playback(gm, compareConfig, comparisonBitmap); } @@ -1703,7 +1584,7 @@ int tool_main(int argc, char** argv) { testsRun, testsPassed, testsFailed, testsMissingReferenceImages); gmmain.ListErrors(); - if (NULL != writeJsonSummaryPath) { + if (FLAGS_writeJsonSummaryPath.count() == 1) { Json::Value actualResults; actualResults[kJsonKey_ActualResults_Failed] = gmmain.fJsonActualResults_Failed; @@ -1717,7 +1598,7 @@ int tool_main(int argc, char** argv) { root[kJsonKey_ActualResults] = actualResults; root[kJsonKey_ExpectedResults] = gmmain.fJsonExpectedResults; std::string jsonStdString = root.toStyledString(); - SkFILEWStream stream(writeJsonSummaryPath); + SkFILEWStream stream(FLAGS_writeJsonSummaryPath[0]); stream.write(jsonStdString.c_str(), jsonStdString.length()); } @@ -1743,6 +1624,12 @@ int tool_main(int argc, char** argv) { 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 9c664aace5..fcf9744b15 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 --config 565 -r gm/tests/inputs/images/different-pixels --writeJsonSummary gm/tests/outputs/compared-against-different-pixels-images/output-actual/json-summary.txt +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 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 8e75446c0e..be8405209c 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 --config 565 -r gm/tests/inputs/json/different-pixels.json --writeJsonSummary gm/tests/outputs/compared-against-different-pixels-json/output-actual/json-summary.txt +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 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 a58c364155..ad626bc6af 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 --config 565 -r gm/tests/inputs/images/empty-dir --writeJsonSummary gm/tests/outputs/compared-against-empty-dir/output-actual/json-summary.txt +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 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 849d485cf6..614cb2b943 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 --config 565 -r gm/tests/inputs/images/identical-bytes --writeJsonSummary gm/tests/outputs/compared-against-identical-bytes-images/output-actual/json-summary.txt +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 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 6b82f39e50..aae0b60615 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 --config 565 -r gm/tests/inputs/json/identical-bytes.json --writeJsonSummary gm/tests/outputs/compared-against-identical-bytes-json/output-actual/json-summary.txt +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 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 c282d00459..34fcc9800f 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 --config 565 -r gm/tests/inputs/images/identical-pixels --writeJsonSummary gm/tests/outputs/compared-against-identical-pixels-images/output-actual/json-summary.txt +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 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 6161298782..a7a9c82620 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 --config 565 -r gm/tests/inputs/json/identical-pixels.json --writeJsonSummary gm/tests/outputs/compared-against-identical-pixels-json/output-actual/json-summary.txt +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 diff --git a/gm/tests/outputs/no-readpath/output-expected/command_line b/gm/tests/outputs/no-readpath/output-expected/command_line index 9339f801a4..a75c735ccc 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 --config 565 --writeJsonSummary gm/tests/outputs/no-readpath/output-actual/json-summary.txt +out/Debug/gm --hierarchy --match selftest1 --config 8888 565 --writeJsonSummaryPath gm/tests/outputs/no-readpath/output-actual/json-summary.txt diff --git a/gm/tests/run.sh b/gm/tests/run.sh index 840fefeab1..d7da1d3ca8 100755 --- a/gm/tests/run.sh +++ b/gm/tests/run.sh @@ -21,7 +21,7 @@ GM_BINARY=out/Debug/gm OUTPUT_ACTUAL_SUBDIR=output-actual OUTPUT_EXPECTED_SUBDIR=output-expected -CONFIGS="--config 8888 --config 565" +CONFIGS="--config 8888 565" # Compare contents of all files within directories $1 and $2, # EXCEPT for any dotfiles. @@ -58,7 +58,7 @@ function gm_test { rm -rf $ACTUAL_OUTPUT_DIR mkdir -p $ACTUAL_OUTPUT_DIR - COMMAND="$GM_BINARY $GM_ARGS --writeJsonSummary $JSON_SUMMARY_FILE" + COMMAND="$GM_BINARY $GM_ARGS --writeJsonSummaryPath $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 @@ function create_inputs_dir { # 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 \ - --writeJsonSummary $JSON_DIR/identical-bytes.json + --writeJsonSummaryPath $JSON_DIR/identical-bytes.json mkdir -p $IMAGES_DIR/identical-pixels $GM_BINARY --hierarchy --match selftest1 $CONFIGS \ @@ -111,7 +111,7 @@ function create_inputs_dir { >> $IMAGES_DIR/identical-pixels/565/selftest1.png $GM_BINARY --hierarchy --match selftest1 $CONFIGS \ -r $IMAGES_DIR/identical-pixels \ - --writeJsonSummary $JSON_DIR/identical-pixels.json + --writeJsonSummaryPath $JSON_DIR/identical-pixels.json mkdir -p $IMAGES_DIR/different-pixels $GM_BINARY --hierarchy --match selftest2 $CONFIGS \ @@ -122,7 +122,7 @@ function create_inputs_dir { $IMAGES_DIR/different-pixels/565/selftest1.png $GM_BINARY --hierarchy --match selftest1 $CONFIGS \ -r $IMAGES_DIR/different-pixels \ - --writeJsonSummary $JSON_DIR/different-pixels.json + --writeJsonSummaryPath $JSON_DIR/different-pixels.json mkdir -p $IMAGES_DIR/empty-dir } diff --git a/gyp/flags.gyp b/gyp/flags.gyp new file mode 100644 index 0000000000..712a04b998 --- /dev/null +++ b/gyp/flags.gyp @@ -0,0 +1,29 @@ +# 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 4b2b1c4b64..940ab84361 100644 --- a/gyp/gm.gyp +++ b/gyp/gm.gyp @@ -26,6 +26,7 @@ '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 9cbaf932b9..9ed7d68082 100644 --- a/gyp/tools.gyp +++ b/gyp/tools.gyp @@ -3,8 +3,6 @@ # To build on Linux: # ./gyp_skia tools.gyp && make tools # -# Building on other platforms not tested yet. -# { 'includes': [ 'apptype_console.gypi', @@ -66,12 +64,11 @@ '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', ], }, @@ -137,8 +134,6 @@ '../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', ], @@ -152,6 +147,7 @@ '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 b4337d1273..e386b429fe 100644 --- a/tools/SkFlags.cpp +++ b/tools/SkFlags.cpp @@ -38,8 +38,12 @@ void SkFlags::ParseCommandLine(int argc, char** argv) { SkDebugf("Flags:\n"); SkFlagInfo* flag = SkFlags::gHead; while (flag != NULL) { - SkDebugf("\t--%s:\ttype: %s\tdefault: %s\n", flag->name().c_str(), - flag->typeAsString().c_str(), flag->defaultValue().c_str()); + 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"); 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 d40cdd06f3..79cc8788a3 100644 --- a/tools/SkFlags.h +++ b/tools/SkFlags.h @@ -119,6 +119,17 @@ private: #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) @@ -128,10 +139,21 @@ static bool unused_##name = SkFlagInfo::CreateBoolFlag(TO_STRING(name), \ #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) \ @@ -163,17 +185,20 @@ public: }; // Create flags of the desired type, and append to the list. - static bool CreateBoolFlag(const char* name, bool* pBool, + static bool CreateBoolFlag(const char* name, const char* shortName, 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, SkTDArray<const char*>* pStrings, + static bool CreateStringFlag(const char* name, const char* shortName, + 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; @@ -206,27 +231,28 @@ public: * value, since a bool is specified as true or false by --name or --noname. */ bool match(const char* string) { - if (SkStrStartsWith(string, '-')) { + if (SkStrStartsWith(string, '-') && strlen(string) > 1) { string++; // Allow one or two dashes - if (SkStrStartsWith(string, '-')) { + if (SkStrStartsWith(string, '-') && strlen(string) > 1) { string++; } if (kBool_FlagType == fFlagType) { // In this case, go ahead and set the value. - if (fName.equals(string)) { + if (fName.equals(string) || fShortName.equals(string)) { *fBoolValue = true; return true; } - SkString noname(fName); - noname.prepend("no"); - if (noname.equals(string)) { - *fBoolValue = false; - return true; + if (SkStrStartsWith(string, "no") && strlen(string) > 2) { + string += 2; + if (fName.equals(string) || fShortName.equals(string)) { + *fBoolValue = false; + return true; + } + return false; } - return false; } - return fName.equals(string); + return fName.equals(string) || fShortName.equals(string); } else { // Has no dash return false; @@ -327,6 +353,7 @@ private: } // Name of the flag, without initial dashes SkString fName; + SkString fShortName; FlagTypes fFlagType; SkString fHelpString; bool* fBoolValue; |