/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef image_expectations_DEFINED #define image_expectations_DEFINED #include "SkBitmap.h" #include "SkJSONCPP.h" #include "SkRefCnt.h" namespace sk_tools { /** * The digest of an image (either an image we have generated locally, or an image expectation). * * Currently, this is always a uint64_t hash digest of an SkBitmap. */ class ImageDigest : public SkRefCnt { public: /** * Create an ImageDigest of a bitmap. * * Note that this is an expensive operation, because it has to examine all pixels in * the bitmap. You may wish to consider using the BitmapAndDigest class, which will * compute the ImageDigest lazily. * * @param bitmap image to get the digest of */ explicit ImageDigest(const SkBitmap &bitmap); /** * Create an ImageDigest using a hashType/hashValue pair. * * @param hashType the algorithm used to generate the hash; for now, only * kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5 is allowed. * @param hashValue the value generated by the hash algorithm for a particular image. */ explicit ImageDigest(const SkString &hashType, uint64_t hashValue); /** * Returns the hash digest type as an SkString. * * For now, this always returns kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5 . */ SkString getHashType() const; /** * Returns the hash digest value as a uint64_t. */ uint64_t getHashValue() const; private: uint64_t fHashValue; }; /** * Container that holds a reference to an SkBitmap and computes its ImageDigest lazily. * * Computing the ImageDigest can be expensive, so this can help you postpone (or maybe even * avoid) that work. */ class BitmapAndDigest { public: explicit BitmapAndDigest(const SkBitmap &bitmap); const ImageDigest *getImageDigestPtr(); const SkBitmap *getBitmapPtr() const; private: const SkBitmap fBitmap; SkAutoTUnref fImageDigestRef; }; /** * Collects ImageDigests of actually rendered images, perhaps comparing to expectations. */ class ImageResultsAndExpectations { public: /** * Adds expectations from a JSON file, returning true if successful. */ bool readExpectationsFile(const char *jsonPath); /** * Adds this image to the summary of results. * * @param sourceName name of the source file that generated this result * @param fileName relative path to the image output file on local disk * @param digest description of the image's contents * @param tileNumber if not NULL, ptr to tile number */ void add(const char *sourceName, const char *fileName, const ImageDigest &digest, const int *tileNumber=NULL); /** * Writes the summary (as constructed so far) to a file. * * @param filename path to write the summary to */ void writeToFile(const char *filename) const; private: /** * Read the file contents from jsonPath and parse them into jsonRoot. * * Returns true if successful. */ static bool Parse(const char *jsonPath, Json::Value *jsonRoot); Json::Value fActualResults; Json::Value fExpectedJsonRoot; Json::Value fExpectedResults; }; } // namespace sk_tools #endif // image_expectations_DEFINED