Chromium Code Reviews| Index: gm/gmmain.cpp |
| =================================================================== |
| --- gm/gmmain.cpp (revision 9460) |
| +++ gm/gmmain.cpp (working copy) |
| @@ -188,7 +188,8 @@ |
| class GMMain { |
| public: |
| - GMMain() : fUseFileHierarchy(false), fIgnorableErrorTypes(kDefaultIgnorableErrorTypes), |
| + GMMain() : fUseFileHierarchy(false), fWriteChecksumBasedFilenames(false), |
| + fIgnorableErrorTypes(kDefaultIgnorableErrorTypes), |
| fMismatchPath(NULL), fTestsRun(0), fRenderModesEncountered(1) {} |
| /** |
| @@ -225,6 +226,31 @@ |
| 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) { |
|
epoger
2013/06/18 06:58:38
At patchset 3, we are assembling the desired outpu
|
| + SkString completePath(path); |
| + completePath.appendUnichar(SkPATH_SEPARATOR); |
| + completePath.append(bitmapDigest.getHashType()); |
| + completePath.appendUnichar(SkPATH_SEPARATOR); |
| + completePath.append(shortName); |
| + completePath.appendUnichar(SkPATH_SEPARATOR); |
| + completePath.append(bitmapDigest.getDigestValue()); |
| + completePath.appendUnichar('.'); |
| + completePath.append(kPNG_FileExtension); |
| + return completePath; |
| + } 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. |
| @@ -253,6 +279,8 @@ |
| } |
| } |
| + // EPOGER: make sure to create any directories needed along the path |
| + // EPOGER: make sure this works even if the destination file already exists -- just overwrite it |
| static bool write_bitmap(const SkString& path, const SkBitmap& bitmap) { |
| // TODO(epoger): Now that we have removed force_all_opaque() |
| // from this method, we should be able to get rid of the |
| @@ -635,6 +663,7 @@ |
| ErrorCombination write_reference_image(const ConfigData& gRec, const char writePath [], |
| const char renderModeDescriptor [], |
| const char *shortName, SkBitmap& bitmap, |
| + GmResultDigest& bitmapDigest, |
| SkDynamicMemoryWStream* document) { |
| SkString path; |
| bool success = false; |
| @@ -642,8 +671,8 @@ |
| gRec.fBackend == kGPU_Backend || |
| (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) { |
| - path = make_filename(writePath, shortName, gRec.fName, renderModeDescriptor, |
| - kPNG_FileExtension); |
| + path = make_bitmap_filename(writePath, shortName, gRec.fName, renderModeDescriptor, |
| + bitmapDigest); |
| success = write_bitmap(path, bitmap); |
| } |
| if (kPDF_Backend == gRec.fBackend) { |
| @@ -741,6 +770,7 @@ |
| * |
| * @param expectations what expectations to compare actualBitmap against |
| * @param actualBitmap the image we actually generated |
| + * @param actualResultDigest GmResultDigest of actualBitmap |
| * @param shortName name of test, e.g. "selftest1" |
| * @param configName name of config, e.g. "8888" |
| * @param renderModeDescriptor e.g., "-rtree", "-deferred" |
| @@ -753,11 +783,11 @@ |
| */ |
| ErrorCombination compare_to_expectations(Expectations expectations, |
| const SkBitmap& actualBitmap, |
| + const GmResultDigest& actualResultDigest, |
| 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); |
| @@ -780,9 +810,8 @@ |
| // 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); |
| + SkString path = make_bitmap_filename(fMismatchPath, shortName, configName, |
| + renderModeDescriptor, actualResultDigest); |
| write_bitmap(path, actualBitmap); |
| } |
| @@ -871,6 +900,7 @@ |
| GM* gm, const ConfigData& gRec, const char writePath[], |
| SkBitmap& actualBitmap, SkDynamicMemoryWStream* pdf) { |
| + GmResultDigest actualResultDigest(actualBitmap); |
| SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName(), gRec.fName); |
| SkString nameWithExtension(shortNamePlusConfig); |
| nameWithExtension.append("."); |
| @@ -893,12 +923,11 @@ |
| * 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, actualBitmap, actualResultDigest, |
| 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, |
| ErrorCombination(kMissingExpectations_ErrorType), |
| false); |
| @@ -912,7 +941,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)); |
| + actualBitmap, actualResultDigest, pdf)); |
| } |
| return errors; |
| @@ -933,7 +962,8 @@ |
| SkASSERT(referenceBitmap); |
| Expectations expectations(*referenceBitmap); |
| - return compare_to_expectations(expectations, actualBitmap, shortName, |
| + GmResultDigest actualResultDigest(actualBitmap); |
| + return compare_to_expectations(expectations, actualBitmap, actualResultDigest, shortName, |
| configName, renderModeDescriptor, false); |
| } |
| @@ -1143,7 +1173,7 @@ |
| // They are public for now, to allow easier setting by tool_main(). |
| // |
| - bool fUseFileHierarchy; |
| + bool fUseFileHierarchy, fWriteChecksumBasedFilenames; |
| ErrorCombination fIgnorableErrorTypes; |
| const char* fMismatchPath; |
| @@ -1303,9 +1333,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, " |
| @@ -1762,6 +1794,7 @@ |
| SkCommandLineFlags::Parse(argc, argv); |
| gmmain.fUseFileHierarchy = FLAGS_hierarchy; |
| + gmmain.fWriteChecksumBasedFilenames = FLAGS_writeChecksumBasedFilenames; |
| if (FLAGS_mismatchPath.count() == 1) { |
| gmmain.fMismatchPath = FLAGS_mismatchPath[0]; |
| } |