Back to hashing source content, not .png.

BUG=skia:
R=jcgregorio@google.com, mtklein@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/560453002
diff --git a/dm/DMWriteTask.cpp b/dm/DMWriteTask.cpp
index 95f162d..fd8396c 100644
--- a/dm/DMWriteTask.cpp
+++ b/dm/DMWriteTask.cpp
@@ -64,18 +64,9 @@
     }
 }
 
-static SkStreamAsset* encode_to_png(const SkBitmap& bitmap) {
-    SkDynamicMemoryWStream png;
-    if (!SkImageEncoder::EncodeStream(&png, bitmap, SkImageEncoder::kPNG_Type, 100)) {
-        return NULL;
-    }
-    png.copyToData()->unref();  // Forces detachAsStream() to be contiguous.
-    return png.detachAsStream();
-}
-
-static SkString get_md5(SkStreamAsset* src) {
+static SkString get_md5(const void* ptr, size_t len) {
     SkMD5 hasher;
-    hasher.write(src->getMemoryBase(), src->getLength());
+    hasher.write(ptr, len);
     SkMD5::Digest digest;
     hasher.finish(digest);
 
@@ -96,14 +87,14 @@
 SK_DECLARE_STATIC_MUTEX(gJsonDataLock);
 
 void WriteTask::draw() {
-    if (!fData.get()) {
-        fData.reset(encode_to_png(fBitmap));
-        if (!fData.get()) {
-            this->fail("Can't encode to PNG.");
-        }
+    SkString md5;
+    {
+        SkAutoLockPixels lock(fBitmap);
+        md5 = fData ? get_md5(fData->getMemoryBase(), fData->getLength())
+                    : get_md5(fBitmap.getPixels(), fBitmap.getSize());
     }
 
-    JsonData entry = { fBaseName, fSuffixes[0], fSourceType, get_md5(fData) };
+    JsonData entry = { fBaseName, fSuffixes[0], fSourceType, md5 };
     {
         SkAutoMutexAcquire lock(&gJsonDataLock);
         gJsonData.push_back(entry);
@@ -120,7 +111,7 @@
     SkString path;
     if (FLAGS_nameByHash) {
         // Flat directory of hash-named files.
-        path = SkOSPath::Join(dir.c_str(), entry.md5.c_str());
+        path = SkOSPath::Join(dir.c_str(), md5.c_str());
         path.append(fExtension);
         // We're content-addressed, so it's possible two threads race to write
         // this file.  We let the first one win.  This also means we won't
@@ -145,8 +136,9 @@
         return this->fail("Can't open file.");
     }
 
-    fData->rewind();
-    if (!file.writeStream(fData, fData->getLength())) {
+    bool ok = fData ? file.writeStream(fData, fData->getLength())
+                    : SkImageEncoder::EncodeStream(&file, fBitmap, SkImageEncoder::kPNG_Type, 100);
+    if (!ok) {
         return this->fail("Can't write to file.");
     }
 }
diff --git a/gyp/tests.gypi b/gyp/tests.gypi
index 15f5d04..cf78e41 100644
--- a/gyp/tests.gypi
+++ b/gyp/tests.gypi
@@ -205,7 +205,6 @@
     '../tests/TracingTest.cpp',
     '../tests/TypefaceTest.cpp',
     '../tests/UnicodeTest.cpp',
-    '../tests/UnpremultiplyTest.cpp',
     '../tests/UtilsTest.cpp',
     '../tests/WArrayTest.cpp',
     '../tests/WritePixelsTest.cpp',
diff --git a/tests/UnpremultiplyTest.cpp b/tests/UnpremultiplyTest.cpp
deleted file mode 100644
index 7846a1b..0000000
--- a/tests/UnpremultiplyTest.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2014 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "SkColorPriv.h"
-#include "SkUnPreMultiply.h"
-#include "Test.h"
-
-DEF_TEST(Unpremultiply, reporter) {
-    // Here we test that unpremultiplication is injective:
-    // no two distinct premul colors map to the same unpremul color.
-
-    // DM exploits this fact to safely hash .pngs instead of the original bitmaps.
-
-    // It is sufficient to test red.  Green and blue follow the same rules.
-    // This means we have at most 256*256 possible colors to deal with.
-    int hits[256*256];
-    for (size_t i = 0; i < SK_ARRAY_COUNT(hits); i++) {
-        hits[i] = 0;
-    }
-
-    for (int a = 0; a < 256; a++) {
-        for (int r = 0; r <= a; r++) {
-            SkPMColor pm = SkPackARGB32(a, r, 0, 0);
-            SkColor upm = SkUnPreMultiply::PMColorToColor(pm);
-
-            // ARGB -> AR
-            hits[upm >> 16]++;
-        }
-    }
-
-    for (size_t i = 0; i < SK_ARRAY_COUNT(hits); i++) {
-        REPORTER_ASSERT(reporter, hits[i] < 2);
-    }
-}