Index: tools/image_expectations.cpp |
diff --git a/tools/image_expectations.cpp b/tools/image_expectations.cpp |
index dfc2638a9e28406c70994111c8a09b7a17f95c14..f0c9cfbbffe2ffb24d9c0459a3553666b05c95f6 100644 |
--- a/tools/image_expectations.cpp |
+++ b/tools/image_expectations.cpp |
@@ -53,44 +53,69 @@ namespace sk_tools { |
// ImageDigest class... |
- ImageDigest::ImageDigest(const SkBitmap &bitmap) { |
- if (!SkBitmapHasher::ComputeDigest(bitmap, &fHashValue)) { |
- SkFAIL("unable to compute image digest"); |
- } |
- } |
+ ImageDigest::ImageDigest(const SkBitmap &bitmap) : |
+ fBitmap(bitmap), fHashValue(0), fComputedHashValue(false) {} |
- ImageDigest::ImageDigest(const SkString &hashType, uint64_t hashValue) { |
+ ImageDigest::ImageDigest(const SkString &hashType, uint64_t hashValue) : |
+ fBitmap(), fHashValue(hashValue), fComputedHashValue(true) { |
if (!hashType.equals(kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5)) { |
- SkFAIL((SkString("unsupported hashType ")+=hashType).c_str()); |
- } else { |
- fHashValue = hashValue; |
+ SkDebugf("unsupported hashType '%s'\n", hashType.c_str()); |
+ SkFAIL("unsupported hashType (see above)"); |
} |
} |
- SkString ImageDigest::getHashType() const { |
+ bool ImageDigest::equals(ImageDigest &other) { |
+ // TODO(epoger): The current implementation assumes that this |
+ // and other always have hashType kJsonKey_Hashtype_Bitmap_64bitMD5 |
+ return (this->getHashValue() == other.getHashValue()); |
+ } |
+ |
+ SkString ImageDigest::getHashType() { |
// TODO(epoger): The current implementation assumes that the |
// result digest is always of type kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5 . |
return SkString(kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5); |
} |
- uint64_t ImageDigest::getHashValue() const { |
- return fHashValue; |
+ uint64_t ImageDigest::getHashValue() { |
+ if (!this->fComputedHashValue) { |
+ if (!SkBitmapHasher::ComputeDigest(this->fBitmap, &this->fHashValue)) { |
+ SkFAIL("unable to compute image digest"); |
+ } |
+ this->fComputedHashValue = true; |
+ } |
+ return this->fHashValue; |
} |
// BitmapAndDigest class... |
- BitmapAndDigest::BitmapAndDigest(const SkBitmap &bitmap) : fBitmap(bitmap) { |
- } |
+ BitmapAndDigest::BitmapAndDigest(const SkBitmap &bitmap) : |
+ fBitmap(bitmap), fImageDigest(bitmap) {} |
- const ImageDigest *BitmapAndDigest::getImageDigestPtr() { |
- if (NULL == fImageDigestRef.get()) { |
- fImageDigestRef.reset(SkNEW_ARGS(ImageDigest, (fBitmap))); |
- } |
- return fImageDigestRef.get(); |
- } |
+ const SkBitmap *BitmapAndDigest::getBitmapPtr() const {return &fBitmap;} |
+ |
+ ImageDigest *BitmapAndDigest::getImageDigestPtr() {return &fImageDigest;} |
+ |
+ // Expectation class... |
+ |
+ // For when we need a valid ImageDigest, but we don't care what it is. |
+ static const ImageDigest kDummyImageDigest( |
+ SkString(kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5), 0); |
+ |
+ Expectation::Expectation(bool ignoreFailure) : |
+ fIsEmpty(true), fIgnoreFailure(ignoreFailure), fImageDigest(kDummyImageDigest) {} |
- const SkBitmap *BitmapAndDigest::getBitmapPtr() const { |
- return &fBitmap; |
+ Expectation::Expectation(const SkString &hashType, uint64_t hashValue, bool ignoreFailure) : |
+ fIsEmpty(false), fIgnoreFailure(ignoreFailure), fImageDigest(hashType, hashValue) {} |
+ |
+ Expectation::Expectation(const SkBitmap& bitmap, bool ignoreFailure) : |
+ fIsEmpty(false), fIgnoreFailure(ignoreFailure), fImageDigest(bitmap) {} |
+ |
+ bool Expectation::ignoreFailure() const { return this->fIgnoreFailure; } |
+ |
+ bool Expectation::empty() const { return this->fIsEmpty; } |
+ |
+ bool Expectation::matches(ImageDigest &imageDigest) { |
+ return !(this->fIsEmpty) && (this->fImageDigest.equals(imageDigest)); |
} |
// ImageResultsAndExpectations class... |
@@ -136,19 +161,11 @@ namespace sk_tools { |
} |
void ImageResultsAndExpectations::add(const char *sourceName, const char *fileName, |
- const ImageDigest &digest, const int *tileNumber) { |
+ ImageDigest &digest, const int *tileNumber) { |
// Get expectation, if any. |
- Json::Value expectedImage; |
- if (!fExpectedResults.isNull()) { |
- if (NULL == tileNumber) { |
- expectedImage = fExpectedResults[sourceName][kJsonKey_Source_WholeImage]; |
- } else { |
- expectedImage = fExpectedResults[sourceName][kJsonKey_Source_TiledImages] |
- [*tileNumber]; |
- } |
- } |
+ Expectation expectation = this->getExpectation(sourceName, tileNumber); |
- // Fill in info about the actual result itself. |
+ // Fill in info about the actual result. |
Json::Value actualChecksumAlgorithm = digest.getHashType().c_str(); |
Json::Value actualChecksumValue = Json::UInt64(digest.getHashValue()); |
Json::Value actualImage; |
@@ -157,16 +174,15 @@ namespace sk_tools { |
actualImage[kJsonKey_Image_Filepath] = fileName; |
// Compare against expectedImage to fill in comparisonResult. |
- Json::Value comparisonResult = kJsonValue_Image_ComparisonResult_NoComparison; |
- if (!expectedImage.isNull()) { |
- if ((actualChecksumAlgorithm == expectedImage[kJsonKey_Image_ChecksumAlgorithm]) && |
- (actualChecksumValue == expectedImage[kJsonKey_Image_ChecksumValue])) { |
- comparisonResult = kJsonValue_Image_ComparisonResult_Succeeded; |
- } else if (expectedImage[kJsonKey_Image_IgnoreFailure] == true) { |
- comparisonResult = kJsonValue_Image_ComparisonResult_FailureIgnored; |
- } else { |
- comparisonResult = kJsonValue_Image_ComparisonResult_Failed; |
- } |
+ Json::Value comparisonResult; |
+ if (expectation.empty()) { |
+ comparisonResult = kJsonValue_Image_ComparisonResult_NoComparison; |
+ } else if (expectation.matches(digest)) { |
+ comparisonResult = kJsonValue_Image_ComparisonResult_Succeeded; |
+ } else if (expectation.ignoreFailure()) { |
+ comparisonResult = kJsonValue_Image_ComparisonResult_FailureIgnored; |
+ } else { |
+ comparisonResult = kJsonValue_Image_ComparisonResult_Failed; |
} |
actualImage[kJsonKey_Image_ComparisonResult] = comparisonResult; |
@@ -182,11 +198,10 @@ namespace sk_tools { |
fDescriptions[key] = value; |
} |
- bool ImageResultsAndExpectations::matchesExpectation(const char *sourceName, |
- const ImageDigest &digest, |
- const int *tileNumber) { |
+ Expectation ImageResultsAndExpectations::getExpectation(const char *sourceName, |
+ const int *tileNumber) { |
if (fExpectedResults.isNull()) { |
- return false; |
+ return Expectation(); |
} |
Json::Value expectedImage; |
@@ -196,13 +211,13 @@ namespace sk_tools { |
expectedImage = fExpectedResults[sourceName][kJsonKey_Source_TiledImages][*tileNumber]; |
} |
if (expectedImage.isNull()) { |
- return false; |
+ return Expectation(); |
} |
- Json::Value actualChecksumAlgorithm = digest.getHashType().c_str(); |
- Json::Value actualChecksumValue = Json::UInt64(digest.getHashValue()); |
- return ((actualChecksumAlgorithm == expectedImage[kJsonKey_Image_ChecksumAlgorithm]) && |
- (actualChecksumValue == expectedImage[kJsonKey_Image_ChecksumValue])); |
+ bool ignoreFailure = (expectedImage[kJsonKey_Image_IgnoreFailure] == true); |
+ return Expectation(SkString(expectedImage[kJsonKey_Image_ChecksumAlgorithm].asCString()), |
+ expectedImage[kJsonKey_Image_ChecksumValue].asUInt64(), |
+ ignoreFailure); |
} |
void ImageResultsAndExpectations::writeToFile(const char *filename) const { |