Index: gm/gmmain.cpp |
=================================================================== |
--- gm/gmmain.cpp (revision 9214) |
+++ gm/gmmain.cpp (working copy) |
@@ -192,7 +192,14 @@ |
GMMain() : fUseFileHierarchy(false), fIgnorableErrorTypes(kDefaultIgnorableErrorTypes), |
fMismatchPath(NULL), fTestsRun(0), fRenderModesEncountered(1) {} |
- SkString make_name(const char shortName[], const char configName[]) { |
+ /** |
+ * Assemble shortNamePlusConfig from (surprise!) shortName and configName. |
+ * |
+ * The method for doing so depends on whether we are using hierarchical naming. |
+ * For example, shortName "selftest1" and configName "8888" could be assembled into |
+ * either "selftest1_8888" or "8888/selftest1". |
+ */ |
+ SkString make_shortname_plus_config(const char *shortName, const char *configName) { |
SkString name; |
if (0 == strlen(configName)) { |
name.append(shortName); |
@@ -204,6 +211,21 @@ |
return name; |
} |
+ /** |
+ * Assemble filename, suitable for writing out the results of a particular test. |
+ */ |
+ SkString make_filename(const char *path, |
+ const char *shortName, |
+ const char *configName, |
+ const char *renderModeDescriptor, |
+ const char *suffix) { |
+ SkString filename = make_shortname_plus_config(shortName, configName); |
+ filename.append(renderModeDescriptor); |
+ filename.appendUnichar('.'); |
+ filename.append(suffix); |
+ return SkPathJoin(path, filename.c_str()); |
+ } |
+ |
/* since PNG insists on unpremultiplying our alpha, we take no |
precision chances and force all pixels to be 100% opaque, |
otherwise on compare we may not get a perfect match. |
@@ -269,7 +291,8 @@ |
* We even record successes, and errors that we regard as |
* "ignorable"; we can filter them out later. |
*/ |
- void RecordTestResults(const ErrorCombination& errorCombination, const SkString& name, |
+ void RecordTestResults(const ErrorCombination& errorCombination, |
+ const SkString& shortNamePlusConfig, |
const char renderModeDescriptor []) { |
// Things to do regardless of errorCombination. |
fTestsRun++; |
@@ -283,7 +306,7 @@ |
} |
// Things to do only if there is some error condition. |
- SkString fullName = name; |
+ SkString fullName = shortNamePlusConfig; |
fullName.append(renderModeDescriptor); |
for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { |
ErrorType type = static_cast<ErrorType>(typeInt); |
@@ -603,25 +626,26 @@ |
} |
ErrorCombination write_reference_image(const ConfigData& gRec, const char writePath [], |
- const char renderModeDescriptor [], const SkString& name, |
- SkBitmap& bitmap, SkDynamicMemoryWStream* document) { |
+ const char renderModeDescriptor [], |
+ const char *shortName, SkBitmap& bitmap, |
+ SkDynamicMemoryWStream* document) { |
SkString path; |
bool success = false; |
if (gRec.fBackend == kRaster_Backend || |
gRec.fBackend == kGPU_Backend || |
(gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) { |
- path = make_filename(writePath, renderModeDescriptor, name.c_str(), |
+ path = make_filename(writePath, shortName, gRec.fName, renderModeDescriptor, |
kPNG_FileExtension); |
success = write_bitmap(path, bitmap); |
} |
if (kPDF_Backend == gRec.fBackend) { |
- path = make_filename(writePath, renderModeDescriptor, name.c_str(), |
+ path = make_filename(writePath, shortName, gRec.fName, renderModeDescriptor, |
"pdf"); |
success = write_document(path, *document); |
} |
if (kXPS_Backend == gRec.fBackend) { |
- path = make_filename(writePath, renderModeDescriptor, name.c_str(), |
+ path = make_filename(writePath, shortName, gRec.fName, renderModeDescriptor, |
"xps"); |
success = write_document(path, *document); |
} |
@@ -639,7 +663,8 @@ |
// |
// When we make that change, we should probably add a |
// WritingReferenceImage test to the gm self-tests.) |
- RecordTestResults(errors, name, renderModeDescriptor); |
+ RecordTestResults(errors, make_shortname_plus_config(shortName, gRec.fName), |
+ renderModeDescriptor); |
return errors; |
} |
} |
@@ -709,7 +734,8 @@ |
* |
* @param expectations what expectations to compare actualBitmap against |
* @param actualBitmap the image we actually generated |
- * @param baseNameString name of test without renderModeDescriptor added |
+ * @param shortName name of test, e.g. "selftest1" |
+ * @param configName name of config, e.g. "8888" |
* @param renderModeDescriptor e.g., "-rtree", "-deferred" |
* @param addToJsonSummary whether to add these results (both actual and |
* expected) to the JSON summary. Regardless of this setting, if |
@@ -720,8 +746,8 @@ |
*/ |
ErrorCombination compare_to_expectations(Expectations expectations, |
const SkBitmap& actualBitmap, |
- const SkString& baseNameString, |
- const char renderModeDescriptor[], |
+ const char *shortName, const char *configName, |
+ const char *renderModeDescriptor, |
bool addToJsonSummary) { |
ErrorCombination errors; |
SkHashDigest actualBitmapHash; |
@@ -730,7 +756,8 @@ |
if (!SkBitmapHasher::ComputeDigest(actualBitmap, &actualBitmapHash)) { |
actualBitmapHash = 0; |
} |
- SkString completeNameString = baseNameString; |
+ SkString shortNamePlusConfig = make_shortname_plus_config(shortName, configName); |
+ SkString completeNameString(shortNamePlusConfig); |
completeNameString.append(renderModeDescriptor); |
completeNameString.append("."); |
completeNameString.append(kPNG_FileExtension); |
@@ -752,8 +779,8 @@ |
// been directed to do so. |
if (fMismatchPath) { |
SkString path = |
- make_filename(fMismatchPath, renderModeDescriptor, |
- baseNameString.c_str(), kPNG_FileExtension); |
+ make_filename(fMismatchPath, shortName, configName, renderModeDescriptor, |
+ kPNG_FileExtension); |
write_bitmap(path, actualBitmap); |
} |
@@ -764,7 +791,7 @@ |
report_bitmap_diffs(*expectedBitmapPtr, actualBitmap, completeName); |
} |
} |
- RecordTestResults(errors, baseNameString, renderModeDescriptor); |
+ RecordTestResults(errors, shortNamePlusConfig, renderModeDescriptor); |
if (addToJsonSummary) { |
add_actual_results_to_json_summary(completeName, actualBitmapHash, errors, |
@@ -842,9 +869,12 @@ |
GM* gm, const ConfigData& gRec, const char writePath[], |
SkBitmap& actualBitmap, SkDynamicMemoryWStream* pdf) { |
- SkString name = make_name(gm->shortName(), gRec.fName); |
+ SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName(), gRec.fName); |
+ SkString nameWithExtension(shortNamePlusConfig); |
+ nameWithExtension.append("."); |
+ nameWithExtension.append(kPNG_FileExtension); |
+ |
ErrorCombination errors; |
- |
ExpectationsSource *expectationsSource = this->fExpectationsSource.get(); |
if (expectationsSource && (gRec.fFlags & kRead_ConfigFlag)) { |
/* |
@@ -860,12 +890,9 @@ |
* force_all_opaque(). |
* See comments above complete_bitmap() for more detail. |
*/ |
- SkString nameWithExtension(name); |
- nameWithExtension.append("."); |
- nameWithExtension.append(kPNG_FileExtension); |
Expectations expectations = expectationsSource->get(nameWithExtension.c_str()); |
errors.add(compare_to_expectations(expectations, actualBitmap, |
- name, "", true)); |
+ gm->shortName(), gRec.fName, "", true)); |
} else { |
// If we are running without expectations, we still want to |
// record the actual results. |
@@ -875,13 +902,11 @@ |
if (!SkBitmapHasher::ComputeDigest(actualBitmap, &actualBitmapHash)) { |
actualBitmapHash = 0; |
} |
- SkString nameWithExtension(name); |
- nameWithExtension.append("."); |
- nameWithExtension.append(kPNG_FileExtension); |
add_actual_results_to_json_summary(nameWithExtension.c_str(), actualBitmapHash, |
ErrorCombination(kMissingExpectations_ErrorType), |
false); |
- RecordTestResults(ErrorCombination(kMissingExpectations_ErrorType), name, ""); |
+ RecordTestResults(ErrorCombination(kMissingExpectations_ErrorType), |
+ shortNamePlusConfig, ""); |
} |
// TODO: Consider moving this into compare_to_expectations(), |
@@ -889,8 +914,8 @@ |
// we don't want to write out the actual bitmaps for all |
// renderModes of all tests! That would be a lot of files. |
if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
- errors.add(write_reference_image(gRec, writePath, "", |
- name, actualBitmap, pdf)); |
+ errors.add(write_reference_image(gRec, writePath, "", gm->shortName(), |
+ actualBitmap, pdf)); |
} |
return errors; |
@@ -899,19 +924,20 @@ |
/** |
* Compare actualBitmap to referenceBitmap. |
* |
- * @param baseNameString name of test without renderModeDescriptor added |
+ * @param shortName test name, e.g. "selftest1" |
+ * @param configName configuration name, e.g. "8888" |
* @param renderModeDescriptor |
* @param actualBitmap actual bitmap generated by this run |
* @param referenceBitmap bitmap we expected to be generated |
*/ |
ErrorCombination compare_test_results_to_reference_bitmap( |
- const SkString& baseNameString, const char renderModeDescriptor[], |
+ const char *shortName, const char *configName, const char *renderModeDescriptor, |
SkBitmap& actualBitmap, const SkBitmap* referenceBitmap) { |
SkASSERT(referenceBitmap); |
Expectations expectations(*referenceBitmap); |
- return compare_to_expectations(expectations, actualBitmap, |
- baseNameString, renderModeDescriptor, false); |
+ return compare_to_expectations(expectations, actualBitmap, shortName, |
+ configName, renderModeDescriptor, false); |
} |
static SkPicture* generate_new_picture(GM* gm, BbhType bbhType, uint32_t recordFlags, |
@@ -1028,23 +1054,23 @@ |
// something like kImageGeneration_ErrorType? |
return kEmpty_ErrorCombination; |
} |
- const SkString name = make_name(gm->shortName(), gRec.fName); |
return compare_test_results_to_reference_bitmap( |
- name, renderModeDescriptor, bitmap, &referenceBitmap); |
+ gm->shortName(), gRec.fName, renderModeDescriptor, bitmap, &referenceBitmap); |
} |
return kEmpty_ErrorCombination; |
} |
ErrorCombination test_pipe_playback(GM* gm, const ConfigData& gRec, |
const SkBitmap& referenceBitmap, bool simulateFailure) { |
- const SkString name = make_name(gm->shortName(), gRec.fName); |
+ const SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName(), |
+ gRec.fName); |
ErrorCombination errors; |
for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { |
SkString renderModeDescriptor("-pipe"); |
renderModeDescriptor.append(gPipeWritingFlagCombos[i].name); |
if (gm->getFlags() & GM::kSkipPipe_Flag) { |
- RecordTestResults(kIntentionallySkipped_ErrorType, name, |
+ RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, |
renderModeDescriptor.c_str()); |
errors.add(kIntentionallySkipped_ErrorType); |
} else { |
@@ -1066,7 +1092,8 @@ |
complete_bitmap(&bitmap); |
writer.endRecording(); |
errors.add(compare_test_results_to_reference_bitmap( |
- name, renderModeDescriptor.c_str(), bitmap, &referenceBitmap)); |
+ gm->shortName(), gRec.fName, renderModeDescriptor.c_str(), bitmap, |
+ &referenceBitmap)); |
if (!errors.isEmpty()) { |
break; |
} |
@@ -1077,7 +1104,8 @@ |
ErrorCombination test_tiled_pipe_playback(GM* gm, const ConfigData& gRec, |
const SkBitmap& referenceBitmap) { |
- const SkString name = make_name(gm->shortName(), gRec.fName); |
+ const SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName(), |
+ gRec.fName); |
ErrorCombination errors; |
for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { |
SkString renderModeDescriptor("-tiled pipe"); |
@@ -1085,7 +1113,7 @@ |
if ((gm->getFlags() & GM::kSkipPipe_Flag) || |
(gm->getFlags() & GM::kSkipTiled_Flag)) { |
- RecordTestResults(kIntentionallySkipped_ErrorType, name, |
+ RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, |
renderModeDescriptor.c_str()); |
errors.add(kIntentionallySkipped_ErrorType); |
} else { |
@@ -1102,7 +1130,7 @@ |
invokeGM(gm, pipeCanvas, false, false); |
complete_bitmap(&bitmap); |
writer.endRecording(); |
- errors.add(compare_test_results_to_reference_bitmap(name, |
+ errors.add(compare_test_results_to_reference_bitmap(gm->shortName(), gRec.fName, |
renderModeDescriptor.c_str(), |
bitmap, &referenceBitmap)); |
if (!errors.isEmpty()) { |
@@ -1422,7 +1450,8 @@ |
for (int i = 0; i < configs.count(); i++) { |
ConfigData config = gRec[configs[i]]; |
- const SkString name = gmmain.make_name(gm->shortName(), config.fName); |
+ const SkString shortNamePlusConfig = gmmain.make_shortname_plus_config(gm->shortName(), |
+ config.fName); |
// Skip any tests that we don't even need to try. |
// If any of these were skipped on a per-GM basis, record them as |
@@ -1432,7 +1461,7 @@ |
continue; |
} |
if (gmFlags & GM::kSkipPDF_Flag) { |
- gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, |
+ gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, |
renderModeDescriptor); |
errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); |
continue; |
@@ -1441,14 +1470,14 @@ |
if ((gmFlags & GM::kSkip565_Flag) && |
(kRaster_Backend == config.fBackend) && |
(SkBitmap::kRGB_565_Config == config.fConfig)) { |
- gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, |
+ gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, |
renderModeDescriptor); |
errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); |
continue; |
} |
if ((gmFlags & GM::kSkipGPU_Flag) && |
kGPU_Backend == config.fBackend) { |
- gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, |
+ gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, |
renderModeDescriptor); |
errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); |
continue; |
@@ -1535,27 +1564,31 @@ |
const SkTDArray<SkScalar> &tileGridReplayScales) { |
ErrorCombination errorsForAllModes; |
uint32_t gmFlags = gm->getFlags(); |
- const SkString name = gmmain.make_name(gm->shortName(), compareConfig.fName); |
+ const SkString shortNamePlusConfig = gmmain.make_shortname_plus_config(gm->shortName(), |
+ compareConfig.fName); |
SkPicture* pict = gmmain.generate_new_picture(gm, kNone_BbhType, 0); |
SkAutoUnref aur(pict); |
if (FLAGS_replay) { |
const char renderModeDescriptor[] = "-replay"; |
if (gmFlags & GM::kSkipPicture_Flag) { |
- gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, renderModeDescriptor); |
+ gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, |
+ renderModeDescriptor); |
errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
} else { |
SkBitmap bitmap; |
gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap); |
errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitmap( |
- name, renderModeDescriptor, bitmap, &comparisonBitmap)); |
+ gm->shortName(), compareConfig.fName, renderModeDescriptor, bitmap, |
+ &comparisonBitmap)); |
} |
} |
if (FLAGS_serialize) { |
const char renderModeDescriptor[] = "-serialize"; |
if (gmFlags & GM::kSkipPicture_Flag) { |
- gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, renderModeDescriptor); |
+ gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, |
+ renderModeDescriptor); |
errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
} else { |
SkPicture* repict = gmmain.stream_to_new_picture(*pict); |
@@ -1563,15 +1596,23 @@ |
SkBitmap bitmap; |
gmmain.generate_image_from_picture(gm, compareConfig, repict, &bitmap); |
errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitmap( |
- name, renderModeDescriptor, bitmap, &comparisonBitmap)); |
+ gm->shortName(), compareConfig.fName, renderModeDescriptor, bitmap, |
+ &comparisonBitmap)); |
} |
} |
if ((1 == FLAGS_writePicturePath.count()) && |
!(gmFlags & GM::kSkipPicture_Flag)) { |
const char* pictureSuffix = "skp"; |
- SkString path = make_filename(FLAGS_writePicturePath[0], "", |
- gm->shortName(), pictureSuffix); |
+ // TODO(epoger): Make sure this still works even though the |
+ // filename now contains the config name (it used to contain |
+ // just the shortName). I think this is actually an |
+ // *improvement*, because now runs with different configs will |
+ // write out their SkPictures to separate files rather than |
+ // overwriting each other. But we should make sure it doesn't |
+ // break anybody. |
+ SkString path = gmmain.make_filename(FLAGS_writePicturePath[0], gm->shortName(), |
+ compareConfig.fName, "", pictureSuffix); |
SkFILEWStream stream(path.c_str()); |
pict->serialize(&stream); |
} |
@@ -1579,7 +1620,8 @@ |
if (FLAGS_rtree) { |
const char renderModeDescriptor[] = "-rtree"; |
if (gmFlags & GM::kSkipPicture_Flag) { |
- gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, renderModeDescriptor); |
+ gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, |
+ renderModeDescriptor); |
errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
} else { |
SkPicture* pict = gmmain.generate_new_picture( |
@@ -1588,7 +1630,8 @@ |
SkBitmap bitmap; |
gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap); |
errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitmap( |
- name, renderModeDescriptor, bitmap, &comparisonBitmap)); |
+ gm->shortName(), compareConfig.fName, renderModeDescriptor, bitmap, |
+ &comparisonBitmap)); |
} |
} |
@@ -1603,7 +1646,7 @@ |
if ((gmFlags & GM::kSkipPicture_Flag) || |
((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1)) { |
- gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, |
+ gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, |
renderModeDescriptor.c_str()); |
errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
} else { |
@@ -1621,7 +1664,8 @@ |
gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap, |
replayScale /*, true */); |
errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitmap( |
- name, renderModeDescriptor.c_str(), bitmap, &comparisonBitmap)); |
+ gm->shortName(), compareConfig.fName, renderModeDescriptor.c_str(), bitmap, |
+ &comparisonBitmap)); |
} |
} |
} |