Index: gm/gmmain.cpp |
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp |
index 958a511eb7446dc07e12313b6b73684508aca76c..ceb6be89e229b993b076a11c86309a85b25c7c1e 100644 |
--- a/gm/gmmain.cpp |
+++ b/gm/gmmain.cpp |
@@ -1767,41 +1767,12 @@ bool prepare_subdirectories(const char *root, bool useFileHierarchy, |
return true; |
} |
-int tool_main(int argc, char** argv); |
-int tool_main(int argc, char** argv) { |
- |
-#if SK_ENABLE_INST_COUNT |
- gPrintInstCount = true; |
-#endif |
- |
- SkGraphics::Init(); |
- // we don't need to see this during a run |
- gSkSuppressFontCachePurgeSpew = true; |
- |
- setSystemPreferences(); |
- GMMain gmmain; |
- |
- SkTDArray<size_t> configs; |
+static bool parse_flags_configs(SkTDArray<size_t>* outConfigs, |
+ GrContextFactory* grFactory) { |
SkTDArray<size_t> excludeConfigs; |
- bool userConfig = false; |
- |
- SkString usage; |
- usage.printf("Run the golden master tests.\n"); |
- SkCommandLineFlags::SetUsage(usage.c_str()); |
- SkCommandLineFlags::Parse(argc, argv); |
- |
- gmmain.fUseFileHierarchy = FLAGS_hierarchy; |
- gmmain.fWriteChecksumBasedFilenames = FLAGS_writeChecksumBasedFilenames; |
- if (FLAGS_mismatchPath.count() == 1) { |
- gmmain.fMismatchPath = FLAGS_mismatchPath[0]; |
- } |
- if (FLAGS_missingExpectationsPath.count() == 1) { |
- gmmain.fMissingExpectationsPath = FLAGS_missingExpectationsPath[0]; |
- } |
for (int i = 0; i < FLAGS_config.count(); i++) { |
const char* config = FLAGS_config[i]; |
- userConfig = true; |
bool exclude = false; |
if (*config == kExcludeConfigChar) { |
exclude = true; |
@@ -1812,23 +1783,22 @@ int tool_main(int argc, char** argv) { |
if (exclude) { |
*excludeConfigs.append() = index; |
} else { |
- appendUnique<size_t>(&configs, index); |
+ appendUnique<size_t>(outConfigs, index); |
} |
} else if (0 == strcmp(kDefaultsConfigStr, config)) { |
+ if (exclude) { |
+ gm_fprintf(stderr, "%c%s is not allowed.\n", |
+ kExcludeConfigChar, kDefaultsConfigStr); |
+ return false; |
+ } |
for (size_t c = 0; c < SK_ARRAY_COUNT(gRec); ++c) { |
if (gRec[c].fRunByDefault) { |
- if (exclude) { |
- gm_fprintf(stderr, "%c%s is not allowed.\n", |
- kExcludeConfigChar, kDefaultsConfigStr); |
- return -1; |
- } else { |
- appendUnique<size_t>(&configs, c); |
- } |
+ appendUnique<size_t>(outConfigs, c); |
} |
} |
} else { |
gm_fprintf(stderr, "unrecognized config %s\n", config); |
- return -1; |
+ return false; |
} |
} |
@@ -1838,147 +1808,234 @@ int tool_main(int argc, char** argv) { |
*excludeConfigs.append() = index; |
} else { |
gm_fprintf(stderr, "unrecognized excludeConfig %s\n", FLAGS_excludeConfig[i]); |
- return -1; |
+ return false; |
} |
} |
- int moduloRemainder = -1; |
- int moduloDivisor = -1; |
+ if (outConfigs->count() == 0) { |
+ // if no config is specified by user, add the defaults |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
+ if (gRec[i].fRunByDefault) { |
+ *outConfigs->append() = i; |
+ } |
+ } |
+ } |
+ // now remove any explicitly excluded configs |
+ for (int i = 0; i < excludeConfigs.count(); ++i) { |
+ int index = outConfigs->find(excludeConfigs[i]); |
+ if (index >= 0) { |
+ outConfigs->remove(index); |
+ // now assert that there was only one copy in configs[] |
+ SkASSERT(outConfigs->find(excludeConfigs[i]) < 0); |
+ } |
+ } |
- 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 SK_SUPPORT_GPU |
+ SkASSERT(grFactory != NULL); |
+ for (int i = 0; i < outConfigs->count(); ++i) { |
+ size_t index = (*outConfigs)[i]; |
+ if (kGPU_Backend == gRec[index].fBackend) { |
+ GrContext* ctx = grFactory->get(gRec[index].fGLContextType); |
+ if (NULL == ctx) { |
+ gm_fprintf(stderr, "GrContext could not be created for config %s." |
+ " Config will be skipped.\n", gRec[index].fName); |
+ outConfigs->remove(i); |
+ --i; |
+ continue; |
+ } |
+ if (gRec[index].fSampleCnt > ctx->getMaxSampleCount()) { |
+ gm_fprintf(stderr, "Sample count (%d) of config %s is not supported." |
+ " Config will be skipped.\n", |
+ gRec[index].fSampleCnt, gRec[index].fName); |
+ outConfigs->remove(i); |
+ --i; |
+ } |
} |
} |
+#endif |
+ if (outConfigs->isEmpty()) { |
+ gm_fprintf(stderr, "No configs to run."); |
+ return false; |
+ } |
+ |
+ // now show the user the set of configs that will be run. |
+ SkString configStr("These configs will be run:"); |
+ // show the user the config that will run. |
+ for (int i = 0; i < outConfigs->count(); ++i) { |
+ configStr.appendf(" %s", gRec[(*outConfigs)[i]].fName); |
+ } |
+ gm_fprintf(stdout, "%s\n", configStr.c_str()); |
+ |
+ return true; |
+} |
+ |
+static bool parse_flags_ignore_error_types(ErrorCombination* outErrorTypes) { |
if (FLAGS_ignoreErrorTypes.count() > 0) { |
- gmmain.fIgnorableErrorTypes = ErrorCombination(); |
+ *outErrorTypes = ErrorCombination(); |
for (int i = 0; i < FLAGS_ignoreErrorTypes.count(); i++) { |
ErrorType type; |
const char *name = FLAGS_ignoreErrorTypes[i]; |
if (!getErrorTypeByName(name, &type)) { |
gm_fprintf(stderr, "cannot find ErrorType with name '%s'\n", name); |
- return -1; |
+ return false; |
} else { |
- gmmain.fIgnorableErrorTypes.add(type); |
+ outErrorTypes->add(type); |
} |
} |
} |
+ return true; |
+} |
+ |
+static bool parse_flags_modulo(int* moduloRemainder, int* moduloDivisor) { |
+ 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 false; |
+ } |
+ } |
+ return true; |
+} |
#if SK_SUPPORT_GPU |
+static bool parse_flags_gpu_cache(int* sizeBytes, int* sizeCount) { |
if (FLAGS_gpuCacheSize.count() > 0) { |
if (FLAGS_gpuCacheSize.count() != 2) { |
gm_fprintf(stderr, "--gpuCacheSize requires two arguments\n"); |
- return -1; |
+ return false; |
} |
- gGpuCacheSizeBytes = atoi(FLAGS_gpuCacheSize[0]); |
- gGpuCacheSizeCount = atoi(FLAGS_gpuCacheSize[1]); |
+ *sizeBytes = atoi(FLAGS_gpuCacheSize[0]); |
+ *sizeCount = atoi(FLAGS_gpuCacheSize[1]); |
} else { |
- gGpuCacheSizeBytes = DEFAULT_CACHE_VALUE; |
- gGpuCacheSizeCount = DEFAULT_CACHE_VALUE; |
+ *sizeBytes = DEFAULT_CACHE_VALUE; |
+ *sizeCount = DEFAULT_CACHE_VALUE; |
} |
+ return true; |
+} |
#endif |
- SkTDArray<SkScalar> tileGridReplayScales; |
- *tileGridReplayScales.append() = SK_Scalar1; // By default only test at scale 1.0 |
+static bool parse_flags_tile_grid_replay_scales(SkTDArray<SkScalar>* outScales) { |
+ *outScales->append() = SK_Scalar1; // By default only test at scale 1.0 |
if (FLAGS_tileGridReplayScales.count() > 0) { |
- tileGridReplayScales.reset(); |
+ outScales->reset(); |
for (int i = 0; i < FLAGS_tileGridReplayScales.count(); i++) { |
double val = atof(FLAGS_tileGridReplayScales[i]); |
if (0 < val) { |
- *tileGridReplayScales.append() = SkDoubleToScalar(val); |
+ *outScales->append() = SkDoubleToScalar(val); |
} |
} |
- if (0 == tileGridReplayScales.count()) { |
+ if (0 == outScales->count()) { |
// Should have at least one scale |
gm_fprintf(stderr, "--tileGridReplayScales requires at least one scale.\n"); |
- return -1; |
- } |
- } |
- |
- if (!userConfig) { |
- // if no config is specified by user, add the defaults |
- for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
- if (gRec[i].fRunByDefault) { |
- *configs.append() = i; |
- } |
- } |
- } |
- // now remove any explicitly excluded configs |
- for (int i = 0; i < excludeConfigs.count(); ++i) { |
- int index = configs.find(excludeConfigs[i]); |
- if (index >= 0) { |
- configs.remove(index); |
- // now assert that there was only one copy in configs[] |
- SkASSERT(configs.find(excludeConfigs[i]) < 0); |
+ return false; |
} |
} |
+ return true; |
+} |
-#if SK_SUPPORT_GPU |
- GrContextFactory* grFactory = new GrContextFactory; |
- for (int i = 0; i < configs.count(); ++i) { |
- size_t index = configs[i]; |
- if (kGPU_Backend == gRec[index].fBackend) { |
- GrContext* ctx = grFactory->get(gRec[index].fGLContextType); |
- if (NULL == ctx) { |
- gm_fprintf(stderr, "GrContext could not be created for config %s." |
- " Config will be skipped.\n", gRec[index].fName); |
- configs.remove(i); |
- --i; |
- continue; |
- } |
- if (gRec[index].fSampleCnt > ctx->getMaxSampleCount()) { |
- gm_fprintf(stderr, "Sample count (%d) of config %s is not supported." |
- " Config will be skipped.\n", gRec[index].fSampleCnt, gRec[index].fName); |
- configs.remove(i); |
- --i; |
- } |
- } |
- } |
-#else |
- GrContextFactory* grFactory = NULL; |
-#endif |
+static bool parse_flags_gmmain_paths(GMMain* gmmain) { |
+ gmmain->fUseFileHierarchy = FLAGS_hierarchy; |
+ gmmain->fWriteChecksumBasedFilenames = FLAGS_writeChecksumBasedFilenames; |
- if (configs.isEmpty()) { |
- gm_fprintf(stderr, "No configs to run."); |
- return -1; |
- } |
- |
- // now show the user the set of configs that will be run. |
- SkString configStr("These configs will be run: "); |
- // show the user the config that will run. |
- for (int i = 0; i < configs.count(); ++i) { |
- configStr.appendf("%s%s", gRec[configs[i]].fName, (i == configs.count() - 1) ? "\n" : " "); |
+ if (FLAGS_mismatchPath.count() == 1) { |
+ gmmain->fMismatchPath = FLAGS_mismatchPath[0]; |
} |
- gm_fprintf(stdout, "%s", configStr.c_str()); |
- if (FLAGS_resourcePath.count() == 1) { |
- GM::SetResourcePath(FLAGS_resourcePath[0]); |
+ if (FLAGS_missingExpectationsPath.count() == 1) { |
+ gmmain->fMissingExpectationsPath = FLAGS_missingExpectationsPath[0]; |
} |
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; |
+ return false; |
} |
if (sk_isdir(readPath)) { |
if (FLAGS_verbose) { |
gm_fprintf(stdout, "reading from %s\n", readPath); |
} |
- gmmain.fExpectationsSource.reset(SkNEW_ARGS( |
+ gmmain->fExpectationsSource.reset(SkNEW_ARGS( |
IndividualImageExpectationsSource, (readPath))); |
} else { |
if (FLAGS_verbose) { |
gm_fprintf(stdout, "reading expectations from JSON summary file %s\n", readPath); |
} |
- gmmain.fExpectationsSource.reset(SkNEW_ARGS( |
- JsonExpectationsSource, (readPath))); |
+ gmmain->fExpectationsSource.reset(SkNEW_ARGS(JsonExpectationsSource, (readPath))); |
} |
} |
+ return true; |
+} |
+ |
+static bool parse_flags_match_strs(SkTDArray<const char*>* matchStrs) { |
+ for (int i = 0; i < FLAGS_match.count(); ++i) { |
+ matchStrs->push(FLAGS_match[i]); |
+ } |
+ return true; |
+} |
+ |
+static bool parse_flags_resource_path() { |
+ if (FLAGS_resourcePath.count() == 1) { |
+ GM::SetResourcePath(FLAGS_resourcePath[0]); |
+ } |
+ return true; |
+} |
+ |
+static bool parse_flags_jpeg_quality() { |
+ if (FLAGS_pdfJpegQuality < -1 || FLAGS_pdfJpegQuality > 100) { |
+ gm_fprintf(stderr, "%s\n", "pdfJpegQuality must be in [-1 .. 100] range."); |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+int tool_main(int argc, char** argv); |
+int tool_main(int argc, char** argv) { |
+ |
+#if SK_ENABLE_INST_COUNT |
+ gPrintInstCount = true; |
+#endif |
+ |
+ SkGraphics::Init(); |
+ // we don't need to see this during a run |
+ gSkSuppressFontCachePurgeSpew = true; |
+ |
+ setSystemPreferences(); |
+ GMMain gmmain; |
+ |
+ SkString usage; |
+ usage.printf("Run the golden master tests.\n"); |
+ SkCommandLineFlags::SetUsage(usage.c_str()); |
+ SkCommandLineFlags::Parse(argc, argv); |
+ |
+ SkTDArray<size_t> configs; |
+ int moduloRemainder = -1; |
+ int moduloDivisor = -1; |
+ SkTDArray<SkScalar> tileGridReplayScales; |
+#if SK_SUPPORT_GPU |
+ GrContextFactory* grFactory = new GrContextFactory; |
+#else |
+ GrContextFactory* grFactory = NULL; |
+#endif |
+ SkTDArray<const char*> matchStrs; |
+ |
+ if (!parse_flags_modulo(&moduloRemainder, &moduloDivisor) || |
+ !parse_flags_ignore_error_types(&gmmain.fIgnorableErrorTypes) || |
+#if SK_SUPPORT_GPU |
+ !parse_flags_gpu_cache(&gGpuCacheSizeBytes, &gGpuCacheSizeCount) || |
+#endif |
+ !parse_flags_tile_grid_replay_scales(&tileGridReplayScales) || |
+ !parse_flags_resource_path() || |
+ !parse_flags_match_strs(&matchStrs) || |
+ !parse_flags_jpeg_quality() || |
+ !parse_flags_configs(&configs, grFactory) || |
+ !parse_flags_gmmain_paths(&gmmain)) { |
+ return -1; |
+ } |
+ |
if (FLAGS_verbose) { |
if (FLAGS_writePath.count() == 1) { |
gm_fprintf(stdout, "writing to %s\n", FLAGS_writePath[0]); |
@@ -1998,13 +2055,6 @@ int tool_main(int argc, char** argv) { |
} |
} |
- if (moduloDivisor <= 0) { |
- moduloRemainder = -1; |
- } |
- if (moduloRemainder < 0 || moduloRemainder >= moduloDivisor) { |
- moduloRemainder = -1; |
- } |
- |
int gmsRun = 0; |
int gmIndex = -1; |
SkString moduloStr; |
@@ -2027,10 +2077,6 @@ int tool_main(int argc, char** argv) { |
} |
} |
- if (FLAGS_pdfJpegQuality < -1 || FLAGS_pdfJpegQuality > 100) { |
- gm_fprintf(stderr, "%s\n", "pdfJpegQuality must be in [-1 .. 100] range."); |
- } |
- |
Iter iter; |
GM* gm; |
while ((gm = iter.next()) != NULL) { |
@@ -2045,10 +2091,6 @@ int tool_main(int argc, char** argv) { |
const char* shortName = gm->shortName(); |
- SkTDArray<const char*> matchStrs; |
- for (int i = 0; i < FLAGS_match.count(); ++i) { |
- matchStrs.push(FLAGS_match[i]); |
- } |
if (SkCommandLineFlags::ShouldSkip(matchStrs, shortName)) { |
continue; |
} |