Index: dm/DM.cpp |
diff --git a/dm/DM.cpp b/dm/DM.cpp |
index 708d8558f33fb28c63c1e76a3776b0861200ab9f..5b99a4c2149a008287b5912ec5761865835c7e9b 100644 |
--- a/dm/DM.cpp |
+++ b/dm/DM.cpp |
@@ -4,11 +4,13 @@ |
#include "OverwriteLine.h" |
#include "ProcStats.h" |
#include "SkBBHFactory.h" |
+#include "SkChecksum.h" |
#include "SkCommonFlags.h" |
#include "SkForceLinking.h" |
#include "SkGraphics.h" |
#include "SkMD5.h" |
#include "SkOSFile.h" |
+#include "SkTDynamicHash.h" |
#include "SkTaskGroup.h" |
#include "Test.h" |
#include "Timer.h" |
@@ -28,6 +30,8 @@ DEFINE_string(blacklist, "", |
"'--blacklist gpu skp _' will blacklist all SKPs drawn into the gpu config.\n" |
"'--blacklist gpu skp _ 8888 gm aarects' will also blacklist the aarects GM on 8888."); |
+DEFINE_string2(readPath, r, "", "If set check for equality with golden results in this directory."); |
+ |
__SK_FORCE_IMAGE_DECODER_LINKING; |
using namespace DM; |
@@ -62,6 +66,40 @@ static void done(double ms, ImplicitString config, ImplicitString src, ImplicitS |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+struct Gold : public SkString { |
+ Gold(ImplicitString sink, ImplicitString src, ImplicitString name, ImplicitString md5) |
+ : SkString("") { |
+ this->append(sink); |
+ this->append(src); |
+ this->append(name); |
+ this->append(md5); |
+ while (this->size() % 4) { |
+ this->append("!"); // Pad out if needed so we can pass this to Murmur3. |
+ } |
+ } |
+ static const Gold& GetKey(const Gold& g) { return g; } |
+ static uint32_t Hash(const Gold& g) { |
+ return SkChecksum::Murmur3((const uint32_t*)g.c_str(), g.size()); |
+ } |
+}; |
+static SkTDynamicHash<Gold, Gold> gGold; |
+ |
+static void add_gold(JsonWriter::BitmapResult r) { |
+ gGold.add(new Gold(r.config, r.sourceType, r.name, r.md5)); // We'll let these leak. Lazybones. |
+} |
+ |
+static void gather_gold() { |
+ if (!FLAGS_readPath.isEmpty()) { |
+ SkString path(FLAGS_readPath[0]); |
+ path.append("/dm.json"); |
+ if (!JsonWriter::ReadJson(path.c_str(), add_gold)) { |
+ fail(SkStringPrintf("Couldn't read %s for golden results.", path.c_str())); |
+ } |
+ } |
+} |
+ |
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+ |
template <typename T> |
struct Tagged : public SkAutoTDelete<T> { const char* tag; }; |
@@ -256,14 +294,40 @@ struct Task { |
name.c_str(), |
err.c_str())); |
} |
+ SkAutoTDelete<SkStreamAsset> data(stream.detachAsStream()); |
+ |
+ SkString md5; |
+ if (!FLAGS_writePath.isEmpty() || !FLAGS_readPath.isEmpty()) { |
+ SkMD5 hash; |
+ if (data->getLength()) { |
+ hash.writeStream(data, data->getLength()); |
+ data->rewind(); |
+ } else { |
+ hash.write(bitmap.getPixels(), bitmap.getSize()); |
+ } |
+ SkMD5::Digest digest; |
+ hash.finish(digest); |
+ for (int i = 0; i < 16; i++) { |
hal.canary
2015/01/27 22:44:55
I want SkString SkMD5::toString();
|
+ md5.appendf("%02x", digest.data[i]); |
+ } |
+ } |
+ |
+ if (!FLAGS_readPath.isEmpty() && |
+ !gGold.find(Gold(task->sink.tag, task->src.tag, name, md5))) { |
+ fail(SkStringPrintf("%s not found for %s %s %s in %s", |
+ md5.c_str(), |
+ task->sink.tag, |
+ task->src.tag, |
+ name.c_str(), |
+ FLAGS_readPath[0])); |
+ } |
+ |
if (!FLAGS_writePath.isEmpty()) { |
const char* ext = task->sink->fileExtension(); |
- if (stream.bytesWritten() == 0) { |
- SkMemoryStream pixels(bitmap.getPixels(), bitmap.getSize()); |
- WriteToDisk(*task, &pixels, bitmap.getSize(), &bitmap, ext); |
+ if (data->getLength()) { |
+ WriteToDisk(*task, md5, ext, data, data->getLength(), NULL); |
} else { |
- SkAutoTDelete<SkStreamAsset> data(stream.detachAsStream()); |
- WriteToDisk(*task, data, data->getLength(), NULL, ext); |
+ WriteToDisk(*task, md5, ext, NULL, 0, &bitmap); |
} |
} |
} |
@@ -275,22 +339,16 @@ struct Task { |
} |
static void WriteToDisk(const Task& task, |
+ SkString md5, |
+ const char* ext, |
SkStream* data, size_t len, |
- const SkBitmap* bitmap, |
- const char* ext) { |
- SkMD5 hash; |
- hash.writeStream(data, len); |
- SkMD5::Digest digest; |
- hash.finish(digest); |
- |
+ const SkBitmap* bitmap) { |
JsonWriter::BitmapResult result; |
result.name = task.src->name(); |
result.config = task.sink.tag; |
result.sourceType = task.src.tag; |
result.ext = ext; |
- for (int i = 0; i < 16; i++) { |
- result.md5.appendf("%02x", digest.data[i]); |
- } |
+ result.md5 = md5; |
JsonWriter::AddBitmapResult(result); |
const char* dir = FLAGS_writePath[0]; |
@@ -323,7 +381,6 @@ struct Task { |
return; |
} |
- data->rewind(); |
if (bitmap) { |
// We can't encode A8 bitmaps as PNGs. Convert them to 8888 first. |
SkBitmap converted; |
@@ -418,6 +475,8 @@ int dm_main() { |
SkAutoGraphics ag; |
SkTaskGroup::Enabler enabled(FLAGS_threads); |
+ gather_gold(); |
+ |
gather_srcs(); |
gather_sinks(); |
gather_tests(); |