| Index: gm/gmmain.cpp
|
| ===================================================================
|
| --- gm/gmmain.cpp (revision 9681)
|
| +++ gm/gmmain.cpp (working copy)
|
| @@ -191,7 +191,8 @@
|
|
|
| class GMMain {
|
| public:
|
| - GMMain() : fUseFileHierarchy(false), fIgnorableErrorTypes(kDefaultIgnorableErrorTypes),
|
| + GMMain() : fUseFileHierarchy(false), fWriteChecksumBasedFilenames(false),
|
| + fIgnorableErrorTypes(kDefaultIgnorableErrorTypes),
|
| fMismatchPath(NULL), fTestsRun(0), fRenderModesEncountered(1) {}
|
|
|
| /**
|
| @@ -228,6 +229,30 @@
|
| return SkOSPath::SkPathJoin(path, filename.c_str());
|
| }
|
|
|
| + /**
|
| + * Assemble filename suitable for writing out an SkBitmap.
|
| + */
|
| + SkString make_bitmap_filename(const char *path,
|
| + const char *shortName,
|
| + const char *configName,
|
| + const char *renderModeDescriptor,
|
| + const GmResultDigest &bitmapDigest) {
|
| + if (fWriteChecksumBasedFilenames) {
|
| + SkString filename;
|
| + filename.append(bitmapDigest.getHashType());
|
| + filename.appendUnichar('_');
|
| + filename.append(shortName);
|
| + filename.appendUnichar('_');
|
| + filename.append(bitmapDigest.getDigestValue());
|
| + filename.appendUnichar('.');
|
| + filename.append(kPNG_FileExtension);
|
| + return SkOSPath::SkPathJoin(path, filename.c_str());
|
| + } else {
|
| + return make_filename(path, shortName, configName, renderModeDescriptor,
|
| + kPNG_FileExtension);
|
| + }
|
| + }
|
| +
|
| /* 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.
|
| @@ -637,7 +662,8 @@
|
|
|
| ErrorCombination write_reference_image(const ConfigData& gRec, const char writePath [],
|
| const char renderModeDescriptor [],
|
| - const char *shortName, SkBitmap& bitmap,
|
| + const char *shortName,
|
| + const BitmapAndDigest& bitmapAndDigest,
|
| SkDynamicMemoryWStream* document) {
|
| SkString path;
|
| bool success = false;
|
| @@ -645,9 +671,9 @@
|
| gRec.fBackend == kGPU_Backend ||
|
| (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) {
|
|
|
| - path = make_filename(writePath, shortName, gRec.fName, renderModeDescriptor,
|
| - kPNG_FileExtension);
|
| - success = write_bitmap(path, bitmap);
|
| + path = make_bitmap_filename(writePath, shortName, gRec.fName, renderModeDescriptor,
|
| + bitmapAndDigest.fDigest);
|
| + success = write_bitmap(path, bitmapAndDigest.fBitmap);
|
| }
|
| if (kPDF_Backend == gRec.fBackend) {
|
| path = make_filename(writePath, shortName, gRec.fName, renderModeDescriptor,
|
| @@ -743,7 +769,7 @@
|
| * actual bitmap will be written out to a file within fMismatchPath.
|
| *
|
| * @param expectations what expectations to compare actualBitmap against
|
| - * @param actualBitmap the image we actually generated
|
| + * @param actualBitmapAndDigest the SkBitmap we actually generated, and its GmResultDigest
|
| * @param shortName name of test, e.g. "selftest1"
|
| * @param configName name of config, e.g. "8888"
|
| * @param renderModeDescriptor e.g., "-rtree", "-deferred"
|
| @@ -755,12 +781,11 @@
|
| * See https://codereview.chromium.org/13650002/ )
|
| */
|
| ErrorCombination compare_to_expectations(Expectations expectations,
|
| - const SkBitmap& actualBitmap,
|
| + const BitmapAndDigest& actualBitmapAndDigest,
|
| const char *shortName, const char *configName,
|
| const char *renderModeDescriptor,
|
| bool addToJsonSummary) {
|
| ErrorCombination errors;
|
| - GmResultDigest actualResultDigest(actualBitmap);
|
| SkString shortNamePlusConfig = make_shortname_plus_config(shortName, configName);
|
| SkString completeNameString(shortNamePlusConfig);
|
| completeNameString.append(renderModeDescriptor);
|
| @@ -770,7 +795,7 @@
|
|
|
| if (expectations.empty()) {
|
| errors.add(kMissingExpectations_ErrorType);
|
| - } else if (!expectations.match(actualResultDigest)) {
|
| + } else if (!expectations.match(actualBitmapAndDigest.fDigest)) {
|
| addToJsonSummary = true;
|
| // The error mode we record depends on whether this was running
|
| // in a non-standard renderMode.
|
| @@ -783,23 +808,24 @@
|
| // Write out the "actuals" for any mismatches, if we have
|
| // been directed to do so.
|
| if (fMismatchPath) {
|
| - SkString path =
|
| - make_filename(fMismatchPath, shortName, configName, renderModeDescriptor,
|
| - kPNG_FileExtension);
|
| - write_bitmap(path, actualBitmap);
|
| + SkString path = make_bitmap_filename(fMismatchPath, shortName, configName,
|
| + renderModeDescriptor,
|
| + actualBitmapAndDigest.fDigest);
|
| + write_bitmap(path, actualBitmapAndDigest.fBitmap);
|
| }
|
|
|
| // If we have access to a single expected bitmap, log more
|
| // detail about the mismatch.
|
| const SkBitmap *expectedBitmapPtr = expectations.asBitmap();
|
| if (NULL != expectedBitmapPtr) {
|
| - report_bitmap_diffs(*expectedBitmapPtr, actualBitmap, completeName);
|
| + report_bitmap_diffs(*expectedBitmapPtr, actualBitmapAndDigest.fBitmap,
|
| + completeName);
|
| }
|
| }
|
| RecordTestResults(errors, shortNamePlusConfig, renderModeDescriptor);
|
|
|
| if (addToJsonSummary) {
|
| - add_actual_results_to_json_summary(completeName, actualResultDigest, errors,
|
| + add_actual_results_to_json_summary(completeName, actualBitmapAndDigest.fDigest, errors,
|
| expectations.ignoreFailure());
|
| add_expected_results_to_json_summary(completeName, expectations);
|
| }
|
| @@ -874,6 +900,7 @@
|
| GM* gm, const ConfigData& gRec, const char writePath[],
|
| SkBitmap& actualBitmap, SkDynamicMemoryWStream* pdf) {
|
|
|
| + BitmapAndDigest actualBitmapAndDigest(actualBitmap);
|
| SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName(), gRec.fName);
|
| SkString nameWithExtension(shortNamePlusConfig);
|
| nameWithExtension.append(".");
|
| @@ -896,13 +923,13 @@
|
| * See comments above complete_bitmap() for more detail.
|
| */
|
| Expectations expectations = expectationsSource->get(nameWithExtension.c_str());
|
| - errors.add(compare_to_expectations(expectations, actualBitmap,
|
| + errors.add(compare_to_expectations(expectations, actualBitmapAndDigest,
|
| gm->shortName(), gRec.fName, "", true));
|
| } else {
|
| // If we are running without expectations, we still want to
|
| // record the actual results.
|
| - GmResultDigest actualResultDigest(actualBitmap);
|
| - add_actual_results_to_json_summary(nameWithExtension.c_str(), actualResultDigest,
|
| + add_actual_results_to_json_summary(nameWithExtension.c_str(),
|
| + actualBitmapAndDigest.fDigest,
|
| ErrorCombination(kMissingExpectations_ErrorType),
|
| false);
|
| RecordTestResults(ErrorCombination(kMissingExpectations_ErrorType),
|
| @@ -915,7 +942,7 @@
|
| // renderModes of all tests! That would be a lot of files.
|
| if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) {
|
| errors.add(write_reference_image(gRec, writePath, "", gm->shortName(),
|
| - actualBitmap, pdf));
|
| + actualBitmapAndDigest, pdf));
|
| }
|
|
|
| return errors;
|
| @@ -936,7 +963,8 @@
|
|
|
| SkASSERT(referenceBitmap);
|
| Expectations expectations(*referenceBitmap);
|
| - return compare_to_expectations(expectations, actualBitmap, shortName,
|
| + BitmapAndDigest actualBitmapAndDigest(actualBitmap);
|
| + return compare_to_expectations(expectations, actualBitmapAndDigest, shortName,
|
| configName, renderModeDescriptor, false);
|
| }
|
|
|
| @@ -1146,7 +1174,7 @@
|
| // They are public for now, to allow easier setting by tool_main().
|
| //
|
|
|
| - bool fUseFileHierarchy;
|
| + bool fUseFileHierarchy, fWriteChecksumBasedFilenames;
|
| ErrorCombination fIgnorableErrorTypes;
|
|
|
| const char* fMismatchPath;
|
| @@ -1306,9 +1334,11 @@
|
| 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, "Give more detail (e.g. list all GMs run, more info about "
|
| "each test).");
|
| +DEFINE_bool(writeChecksumBasedFilenames, false, "When writing out actual images, use checksum-"
|
| + "based filenames, as rebaseline.py will use when downloading them from Google Storage");
|
| +DEFINE_string(writeJsonSummaryPath, "", "Write a JSON-formatted result summary to this file.");
|
| DEFINE_string2(writePath, w, "", "Write rendered images into this directory.");
|
| DEFINE_string2(writePicturePath, p, "", "Write .skp files into this directory.");
|
| DEFINE_int32(pdfJpegQuality, -1, "Encodes images in JPEG at quality level N, "
|
| @@ -1765,6 +1795,7 @@
|
| SkCommandLineFlags::Parse(argc, argv);
|
|
|
| gmmain.fUseFileHierarchy = FLAGS_hierarchy;
|
| + gmmain.fWriteChecksumBasedFilenames = FLAGS_writeChecksumBasedFilenames;
|
| if (FLAGS_mismatchPath.count() == 1) {
|
| gmmain.fMismatchPath = FLAGS_mismatchPath[0];
|
| }
|
|
|